 	<!--
    ***************************************************************
    * Licensed to the Apache Software Foundation (ASF) under one
    * or more contributor license agreements.  See the NOTICE file
    * distributed with this work for additional information
    * regarding copyright ownership.  The ASF licenses this file
    * to you under the Apache License, Version 2.0 (the
    * "License"); you may not use this file except in compliance
    * with the License.  You may obtain a copy of the License at
    *
    *   http://www.apache.org/licenses/LICENSE-2.0
    * 
    * Unless required by applicable law or agreed to in writing,
    * software distributed under the License is distributed on an
    * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
    * KIND, either express or implied.  See the License for the
    * specific language governing permissions and limitations
    * under the License.
    ***************************************************************
   -->
<html>
<head>
  <title>API Change Report - Apache UIMA uimaFIT</title>
</head>
<body>
<h1>Apache UIMA (Unstructured Information Management Architecture) uimaFIT API Change Report</h1>

<h2>Contents</h2>
<p>
<a href="#description">What is an API change report?</a><br/>
<a target="_blank" href="uimafit-core/api-change-report/japicmp.html">API Changes: uimafit-core</a><br/>
<a target="_blank" href="uimafit-cpe/api-change-report/japicmp.html">API Changes: uimafit-cpe</a><br/>
<a target="_blank" href="uimafit-spring/api-change-report/japicmp.html">API Changes: uimafit-spring</a><br/>
<a href-"#running-more-reports">Running your own custom reports</a>
</p>  
   
<h2><a id="description">What is an API change report?</a></h2>

     <p>
  			Three of the modules in uimaFIT track API changes from version to version.
  			The changes between this current version and the last previously released version are
  			reported below.  Each report includes a summary of Classes that were changed, together with
  			a flag indicating if the change was a source or binary incompatible change.
  			More details about each change are available further down in the report.
  	 </p>
  	 
  	 <p>
  	   Follow the links above to get the report for each of the 3 modules.		
  	 </p>
  	 
 
<h2><a id="running-more-reports">Running additional change reports</a></h2>
<p>The reports are generated by an open source tool, 
<a target="_blank" href="http://siom79.github.io/japicmp/">japicmp</a>, which compares two versions of
a Java Jar and generates the report.  See that website for details on how to run this for arbitrary versions, if you
want to compare other versions.
</p> 
    
</body>
</html>