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

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 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 or later; it has been tested with Sun/Oracle Java 8, 
and IBM 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 platforms and Java (8+) 
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
----------------

Version 3 requires migration for existing Version 2 deployments that use JCas.  For instructions on this, please
read the documentation for Version 3 located in the docs subdirectory.  