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

## Last Official Release

Apache OpenNLP {opennlp_version} is now available for download.

[options="header"]
|===
|.tar.gz | .zip

|https://www.apache.org/dyn/closer.cgi/opennlp/opennlp-{opennlp_version}/apache-opennlp-{opennlp_version}-bin.tar.gz[apache-opennlp-{opennlp_version}-bin.tar.gz]
https://www.apache.org/dist/opennlp/opennlp-{opennlp_version}/apache-opennlp-{opennlp_version}-bin.tar.gz.sha512[sha512]
https://www.apache.org/dist/opennlp/opennlp-{opennlp_version}/apache-opennlp-{opennlp_version}-bin.tar.gz.asc[asc]

|https://www.apache.org/dyn/closer.cgi/opennlp/opennlp-{opennlp_version}/apache-opennlp-{opennlp_version}-bin.zip[apache-opennlp-{opennlp_version}-bin.zip]
https://www.apache.org/dist/opennlp/opennlp-{opennlp_version}/apache-opennlp-{opennlp_version}-bin.zip.sha512[sha512]
https://www.apache.org/dist/opennlp/opennlp-{opennlp_version}/apache-opennlp-{opennlp_version}-bin.zip.asc[asc]

|https://www.apache.org/dyn/closer.cgi/opennlp/opennlp-{opennlp_version}/apache-opennlp-{opennlp_version}-src.tar.gz[apache-opennlp-{opennlp_version}-src.tar.gz]
https://www.apache.org/dist/opennlp/opennlp-{opennlp_version}/apache-opennlp-{opennlp_version}-src.tar.gz.sha512[sha512]
https://www.apache.org/dist/opennlp/opennlp-{opennlp_version}/apache-opennlp-{opennlp_version}-src.tar.gz.asc[asc]

|https://www.apache.org/dyn/closer.cgi/opennlp/opennlp-{opennlp_version}/apache-opennlp-{opennlp_version}-src.zip[apache-opennlp-{opennlp_version}-src.zip]
https://www.apache.org/dist/opennlp/opennlp-{opennlp_version}/apache-opennlp-{opennlp_version}-src.zip.sha512[sha512]
https://www.apache.org/dist/opennlp/opennlp-{opennlp_version}/apache-opennlp-{opennlp_version}-src.zip.asc[asc]
|===

Note: Please note that the tar.gz archive contain file names longer than 100 characters and has
been created using GNU tar extensions. It must be untarred with a GNU compatible version of tar.

### Verifying Signatures
The sha512 and asc files are signature files and can be used to verify the integrity of the
downloaded distribution package.

Use the following commands to verify the integrity:

* gpg --print-md sha512 fileName.tar.gz
* gpg --verify fileName.tar.gz.asc

It might be necessary to import the https://www.apache.org/dist/opennlp/KEYS[KEYS file] to verify the integrity
of the asc files.

That can easily be done with:

* gpg --import KEYS

More information about release signing and verifying signatures can
be found https://www.apache.org/dev/release-signing.html[here].

## Models

The models for Apache OpenNLP are link:/models.html[found here].

The models can be used for testing or getting started, please train your own models for all other use cases.

## Archive

Historical releases can be downloaded from the archived https://sourceforge.net/projects/opennlp/[SourceForge project]
or the https://archive.apache.org/dist/opennlp/[Apache archive].
