
Apache UIMA Ruta (TM) v2.4.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 release requires an update of script projects and its descriptors, 
e.g, in the UIMA Ruta Workbench by deleting all descriptors and updating the script project.
Right-click on a project and select "UIMA Ruta -> Convert to UIMA Ruta project"

-------------------------------------

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]);

-------------------------------------

Using the jcasgen-maven-plugin may cause problems if it creates duplicate classes for the 
internal UIMA Ruta types (overwriting the implementation of RutaBasic). Depending on the location 
of the type system descriptors, the plugin should be configured to be limited on the project, 
or the UIMA Ruta type system descriptors should explicitly be excluded:

    <configuration>
      <typeSystemExcludes>
        <typeSystemExclude>/**/BasicTypeSystem.xml</typeSystemExclude>
        <typeSystemExclude>/**/InternalTypeSystem.xml</typeSystemExclude>
      </typeSystemExcludes>
    </configuration>

-------------------------------------

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> 



