////
   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.   
////
= Documentation
:jbake-type: page
:jbake-tags: documentation
:jbake-status: published
:idprefix:

There exists a manual and Javadoc API documentation for Apache OpenNLP. The manual
explains how the various OpenNLP components can be used and trained.

### Apache OpenNLP {opennlp_version} documentation

* link:/docs/{opennlp_version}/manual/opennlp.html[Apache OpenNLP Manual]
* link:/docs/{opennlp_version}/apidocs/opennlp-tools/index.html[Apache OpenNLP Tools Javadoc]
* link:/docs/{opennlp_version}/apidocs/opennlp-uima/index.html[Apache OpenNLP UIMA Javadoc]
* link:/docs/{opennlp_version}/apidocs/opennlp-brat-annotator/index.html[Apache OpenNLP BRAT Annotator Javadoc]
* link:/docs/{opennlp_version}/apidocs/opennlp-morfologik-addon/index.html[Apache OpenNLP Morfologik Addon Javadoc]

Note: All the documentation is also included in the binary distribution.

Documentation for archieved releases can be found link:/docs/legacy.html[here].