
      Apache UIMA (Unstructured Information Management Architecture) 
      --------------------------------------------------------------
      
This file applies to UIMA-SDK version 3.0.0 and subsequent versions.
Java 8 is required.

Backwards Compatibility
-----------------------

Version 3 is a major new release, and many APIs have been augmented.
Existing version 2 UIMA Pipelines are expected to run with Version 3,
after any non-built-in JCas classes have been migrated.  

The documentation contains a new book, "UIMA Version 3 User's Guide",
which explains the new features, the migration process and tool,
and more details about backwards compatibility.

        
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 .../uimaj 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
   
Look for the result here: 
   target/uimaj-[version]-source-release.zip (if run with -Papache-release)

For more details, please see http://uima.apache.org/building-uima.html   



What's New 
----------
  Please refer to the RELEASE_NOTES.html 
      
Supported Platforms
--------------------

Apache UIMA v3.0.0 requires Java version 8; it has been tested with Oracle Java 8, 
and IBM Java 8.

Running the Eclipse plugin tooling for UIMA requires you start Eclipse using a Java 8 or later, as well.

Running the migration tool requires running with a Java JDK, not a Java JRE.

The supported platforms are: Windows, Linux, and Mac OS X. Other platform 
implementations should work, but have not been significantly tested.

Many of the scripts in the /bin directory invoke Java. They use the value of the environment variable, JAVA_HOME, 
to locate the Java to use; if it is not set, they invoke "java" expecting to find an appropriate Java in your PATH. 


Environment Variables
----------------------

After you have unpacked the Apache UIMA distribution from the package of your choice (e.g. .zip or .gz), 
perform the steps below to set up UIMA so that it will function properly.

    * Set JAVA_HOME to the directory of your JRE installation you would like to use for UIMA.  
    * Set UIMA_HOME to the apache-uima directory of your unpacked Apache UIMA distribution
    * Append UIMA_HOME/bin to your PATH
    
    * Please run the script UIMA_HOME/bin/adjustExamplePaths.bat (or .sh), to update 
      paths in the examples based on the actual UIMA_HOME directory path. 
      This script runs a Java program; 
      you must either have java in your PATH or set the environment variable JAVA_HOME to a 
      suitable JRE.

    Note: The Mac OS X operating system procedures for setting up global environment
    variables are described here: see http://developer.apple.com/qa/qa2001/qa1067.html.
      
      
Verifying Your Installation
----------------------------

To test the installation, run the documentAnalyzer.bat (or .sh) file located in the bin subdirectory. 
This should pop up a "Document Analyzer" window. Set the values displayed in this GUI to as follows:

    * Input Directory: UIMA_HOME/examples/data
    * Output Directory: UIMA_HOME/examples/data/processed
    * Location of Analysis Engine XML Descriptor: UIMA_HOME/examples/descriptors/analysis_engine/PersonTitleAnnotator.xml

Replace UIMA_HOME above with the path of your Apache UIMA installation.

Next, click the "Run" button, which should, after a brief pause, pop up an "Analyzed Results" window. 
Double-click on one of the documents to display the analysis results for that document.


Getting Started
----------------

For existing Version 2 deployments that use non-built-in JCas classes, Version 3 requires migration 
or regeneration of these classes.  For instructions on how to do this migration, please
read the documentation for Version 3 located in the docs subdirectory.  