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

Releases
--------

The current release is ${release_version} and was published on ${release_date}. The release note for this
release can be found [here](release-notes/${release_version}.html).

The following distributions are available for download:

&nbsp;                             | Link                                                      | Checksums and signatures
-----------------------------------|-----------------------------------------------------------|-------------------------
Binary distribution                | [axis2-${release_version}-bin.zip][1]                     | [SHA512][3] [PGP][4]
Source distribution                | [axis2-${release_version}-src.zip][5]                     | [SHA512][7] [PGP][8]
WAR distribution                   | [axis2-${release_version}-war.zip][9]                     | [SHA512][11] [PGP][12]
Service Archive plugin for Eclipse | [axis2-eclipse-service-plugin-${release_version}.zip][13] | [SHA512][15] [PGP][16]
Code Generator plugin for Eclipse  | [axis2-eclipse-codegen-plugin-${release_version}.zip][17] | [SHA512][19] [PGP][20]
Axis2 plugin for IntelliJ IDEA     | [axis2-idea-plugin-${release_version}.zip][21]            | [SHA512][23] [PGP][24]

The binary distribution contains all the Axis2 libraries and modules, except for [Apache Rampart](../rampart/)
(WS-Security implementation) which must be downloaded separately. It also contains command line tools,
samples and scripts to start a standalone Axis2 server.

The WAR (Web Archive) distribution is designed for deployment on a servlet container.

The signatures of the distributions can be [verified][25] against the public keys in the [KEYS][26] file.

Maintenance releases from branches other than the main branch can be found [here][27].
Distributions for older releases can be found in the [archive][28].

All releases are also available as Maven artifacts in the [central repository][29].

[1]: http://www.apache.org/dyn/closer.lua/axis/axis2/java/core/${release_version}/axis2-${release_version}-bin.zip
[3]: https://downloads.apache.org/axis/axis2/java/core/${release_version}/axis2-${release_version}-bin.zip.sha512
[4]: https://downloads.apache.org/axis/axis2/java/core/${release_version}/axis2-${release_version}-bin.zip.asc
[5]: http://www.apache.org/dyn/closer.lua/axis/axis2/java/core/${release_version}/axis2-${release_version}-src.zip
[7]: https://downloads.apache.org/axis/axis2/java/core/${release_version}/axis2-${release_version}-src.zip.sha512
[8]: https://downloads.apache.org/axis/axis2/java/core/${release_version}/axis2-${release_version}-src.zip.asc
[9]: http://www.apache.org/dyn/closer.lua/axis/axis2/java/core/${release_version}/axis2-${release_version}-war.zip
[11]: https://downloads.apache.org/axis/axis2/java/core/${release_version}/axis2-${release_version}-war.zip.sha512
[12]: https://downloads.apache.org/axis/axis2/java/core/${release_version}/axis2-${release_version}-war.zip.asc
[13]: http://www.apache.org/dyn/closer.lua/axis/axis2/java/core/${release_version}/axis2-eclipse-service-plugin-${release_version}.zip
[15]: https://downloads.apache.org/axis/axis2/java/core/${release_version}/axis2-eclipse-service-plugin-${release_version}.zip.sha512
[16]: https://downloads.apache.org/axis/axis2/java/core/${release_version}/axis2-eclipse-service-plugin-${release_version}.zip.asc
[17]: http://www.apache.org/dyn/closer.lua/axis/axis2/java/core/${release_version}/axis2-eclipse-codegen-plugin-${release_version}.zip
[19]: https://downloads.apache.org/axis/axis2/java/core/${release_version}/axis2-eclipse-codegen-plugin-${release_version}.zip.sha512
[20]: https://downloads.apache.org/axis/axis2/java/core/${release_version}/axis2-eclipse-codegen-plugin-${release_version}.zip.asc
[21]: http://www.apache.org/dyn/closer.lua/axis/axis2/java/core/${release_version}/axis2-idea-plugin-${release_version}.zip
[23]: https://downloads.apache.org/axis/axis2/java/core/${release_version}/axis2-idea-plugin-${release_version}.zip.sha512
[24]: https://downloads.apache.org/axis/axis2/java/core/${release_version}/axis2-idea-plugin-${release_version}.zip.asc
[25]: http://www.apache.org/dev/release-signing#verifying-signature
[26]: https://downloads.apache.org/axis/axis2/java/core/KEYS
[27]: http://www.apache.org/dyn/closer.lua/axis/axis2/java/core/
[28]: http://archive.apache.org/dist/axis/axis2/java/core/
[29]: http://search.maven.org/#search%7Cga%7C1%7Cg%3A%22org.apache.axis2%22
