
      Apache UIMA (Unstructured Information Management Architecture) v2.7.0 SDK
      -------------------------------------------------------------------------

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 new JVM -D properties that can be used to disable new
features, until the underlying issues are corrected or accommodated.

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

  Backwards Compatibility
  -----------------------
  This version has changes which can affect backwards compatibility.  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.
  
      
Supported Platforms
--------------------

Apache UIMA requires Java version 7 or later; it has been tested with Sun/Oracle Java SDK 7, and 8, 
and IBM Java 7 and 8.
Running the Eclipse plugin tooling for UIMA requires you start Eclipse using a Java 7 or later, as well.
The supported platforms are: Windows, Linux, and Mac OS X.  
Other platforms and Java (7+) 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.