
Apache UIMA Ruta v2.1.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> 



