
Apache UIMA Ruta v2.2.0
-------------------------------------------------------------------------

Building from the Source Distribution
-------------------------------------

We use Maven 3.0 or later for building; download this if needed, 
and set the environment variable MAVEN_OPTS to -Xmx800m -XX:MaxPerSize=256m.

Then do the build by going into the UIMA Ruta directory, and issuing the command
   mvn clean install
   
This builds everything except the ...source-release.zip file. If you want that,
change the command to 

   mvn clean install -Papache-release
   
For more details, please see http://uima.apache.org/building-uima.html   

-------------------------------------

This product was originally released as Apache UIMA TextMarker. The UIMA Ruta Workbench provides
a command for updating old projects. Please right-click on a project and select "UIMA Ruta -> Update Project". 

-------------------------------------

The UIMA Ruta analysis engine requires type priorities for the correct execution of rules. 
If a CAS is created using the CASCreationUtils, please provide the type priorities, e.g., by:

    URL tpUrl = this.getClass().getResource("/org/apache/uima/ruta/engine/TypePriorities.xml");
    TypePriorities typePriorities = UIMAFramework.getXMLParser().parseTypePriorities(
        new XMLInputSource(tpUrl));
    CAS cas = CasCreationUtils.createCas(descriptor, typePriorities, new FsIndexDescription[0]);

-------------------------------------

If you use the uimaFIT JCasGenPomFriendly in Maven and want to use UIMA Ruta 
as a standalone annotator you have to exclude the generated UIMA Ruta basic 
type files from the build, e.g., by adding:


   <plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-compiler-plugin</artifactId>
    <version>3.0</version>
    <configuration>
         <excludes>
             <exclude>org/apache/uima/ruta/type/*.java</exclude>
         </excludes>
    </configuration>
   </plugin> 



