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

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

New releases strive to maintain backwards compatibility; in general you should
expect that upgrading will not break existing UIMA pipelines.  

From time to time, non-backward compatible changes are made, such as increased
checking for error situations.  This may cause existing pipelines to fail. In 
most cases, there are JVM -D properties that can be used to disable these changes
until the underlying issues are corrected or accommodated.

Out of the box,
  it will do additional checking and fixups for some hard-to-find user errors; see
  the first section above coping with backwards compatibility issues.
  
The JVM -D property names for these, and their meaning, are:
        
    -Duima.allow_duplicate_add_to_indexes
 
      Adding the same exact FS instance to the indexes multiple times no longer
      results in duplicate entries in the indexes.  You may restore the previous
      behavior using this flag.    
    
    -Duima.disable_auto_protect_indexes
 
      UIMA now checks and automatically protects indexes if users (after adding
      a feature structure to the indexes) updates a feature which is being used
      as a key.  For production runs, after insuring there are no such updates
      going on, or explicitly protecting those that are being done using the 
      protectIndexes() method,  you can disable this protection and checking, 
      which may make things run slightly faster.
      
    -Duima.report_fs_update_corrupts_index
 
      See https://issues.apache.org/jira/browse/UIMA-4135. 
      Updating Features which are used in Set and Sorted indexes 
      as "keys" may corrupt the indexes, if the Feature Structure (FS) has been 
      added to the indexes. To update these, you must first completely remove
      the FS from the indexes in all views, then do the updates, and then add 
      it back. UIMA now checks for this (unless specifically disabled), 
      and if this property is set, will log WARN messages for each occurrence 
      unless the user wraps these updates inside explicit protectIndexes
      blocks.
 
      To scan the logs for these reports, search for instances of lines having 
      the string     While FS was in the index, the feature     

    -Duima.disable_enhanced_check_wrong_add_to_index
 
      See https://issues.apache.org/jira/browse/UIMA-4099. 
      Feature Structures which are subtypes of AnnotationBase may only be 
      added to the View corresponding to their Sofa reference. From version 
      2.7.0, there is additional checking of this which can be disabled 
      if needed for backward compatibility.

  See the UIMA References http://uima.apache.org/d/uimaj-current/references.html#ugr.ref.config
  for a table of these and other settings.
        
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 requires Java version 8 or later; it has been tested with Sun/Oracle 8, 
and IBM Java 8.

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

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
----------------

For an introduction to Apache UIMA and how to use it, please read the documentation 
located in the docs subdirectory.  A good place to start is the overview_and_setup 
book's first chapter, which has a brief guide to the documentation.