<!--
  ~ 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>
  <meta http-equiv="content-type" content="">
  <title>Apache Axis2 1.5.4 Release Notes</title>
</head>

<body lang="en">
<h1>Apache Axis2 1.5.4 Release Notes</h1>

<h2>About this version</h2>

<p>1.5.4 is a maintenance release that contains fixes for the following issues:</p>
<ul>
<li><a href="https://issues.apache.org:443/jira/browse/AXIS2-3784">AXIS2-3784</a>: WSDL port address is not correctly generated for machines having multiple network interfaces</li>
<li><a href="https://issues.apache.org:443/jira/browse/AXIS2-3793">AXIS2-3793</a>: move image to the correct place</li>
<li><a href="https://issues.apache.org:443/jira/browse/AXIS2-3851">AXIS2-3851</a>: adb-codegen no longer accepts schemas without targetNamespace</li>
<li><a href="https://issues.apache.org:443/jira/browse/AXIS2-4261">AXIS2-4261</a>: Enable axis2server.sh to start SimpleAxis2Server in remote debug mode</li>
<li><a href="https://issues.apache.org:443/jira/browse/AXIS2-4586">AXIS2-4586</a>: JiBX Client Stub not cleaning up HTTP connections after each operation</li>
<li><a href="https://issues.apache.org:443/jira/browse/AXIS2-4642">AXIS2-4642</a>: ?wsdl query calls out.close() twice, confusing at least some Tomcat connectors</li>
<li><a href="https://issues.apache.org:443/jira/browse/AXIS2-4674">AXIS2-4674</a>: Unable to get WSDL2 doc for services on WebSphere 7.0 and Axis2 1.5.1</li>
<li><a href="https://issues.apache.org:443/jira/browse/AXIS2-4819">AXIS2-4819</a>: Race condition in WSDLDataLocator</li>
<li><a href="https://issues.apache.org:443/jira/browse/AXIS2-4827">AXIS2-4827</a>: ADB class org.apache.axis2.databinding.types.Union does not implement java.io.Serializable</li>
<li><a href="https://issues.apache.org:443/jira/browse/AXIS2-4842">AXIS2-4842</a>: NPE in TempFileManager</li>
<li><a href="https://issues.apache.org:443/jira/browse/AXIS2-4871">AXIS2-4871</a>: Null Pointer Exception in AxisService.printXSD</li>
<li><a href="https://issues.apache.org:443/jira/browse/AXIS2-4883">AXIS2-4883</a>: Javadoc link broken on site and in documents distribution</li>
<li><a href="https://issues.apache.org:443/jira/browse/AXIS2-4885">AXIS2-4885</a>: Unsubstituted variable ${axis2_version} in 1.5.3 site and documents distribution</li> 
<li><a href="https://issues.apache.org:443/jira/browse/AXIS2-4887">AXIS2-4887</a>: TargetNameSpace required for XSD2Java</li>
<li><a href="https://issues.apache.org:443/jira/browse/AXIS2-4888">AXIS2-4888</a>: The org.apache.axis2:axis2 Maven artifact should not have a classifier</li>
<li><a href="https://issues.apache.org:443/jira/browse/AXIS2-4889">AXIS2-4889</a>: SOAPConnectionTest#testGet slows down the build</li>
<li><a href="https://issues.apache.org:443/jira/browse/AXIS2-4896">AXIS2-4896</a>: Unable to install axis2.eclipse.codegen.plugin into eclipse</li>
<li><a href="https://issues.apache.org:443/jira/browse/AXIS2-4901">AXIS2-4901</a>: LinkageError related to DOM classes when using the codegen plugin for Eclipse</li>
<li><a href="https://issues.apache.org:443/jira/browse/AXIS2-4909">AXIS2-4909</a>: Simple MTOM web service no longer works due to missing closing MIME boundary.</li>
</ul>
<p>In addition, this release contains changes required for the Sandesha2 1.4 release.</p>

<h2>About Axis2</h2>

<p>Apache Axis2 is a complete re-design and re-write of the widely used
Apache Axis engine and is a more efficient, more scalable, more modular
and more XML-oriented Web services framework. It is carefully designed to
support the easy addition of plug-in "modules" that extend its
functionality for features such as security and reliability.</p>

<p>Modules supporting WS-Security/Secure-Conversation (Apache Rampart),
WS-Trust (Apache Rahas), WS-Reliable Messaging (Apache Sandesha) and
WS-Eventing (Apache Savan) are available via the Apache Web Services
project. Please see the individual subproject sites for further information.</p>

<h2>Feedback</h2>

<p>We are striving for a simple and happy first time user experience as well as a
satisfying experienced user experience with this release. We welcome any
and all feedback at:</p>
<ul>
  <li><a href="mailto:java-user@axis.apache.org">java-user@axis.apache.org</a> (please include "[axis2]" in the subject)</li>
  <li><a href="mailto:java-dev@axis.apache.org">java-dev@axis.apache.org</a> (please include "[axis2]" in the subject)</li>
  <li><a href="http://issues.apache.org/jira/browse/AXIS2">http://issues.apache.org/jira/browse/AXIS2</a></li>
</ul>

<p>Thank you for your interest in Apache Axis2!</p>

<p><i>The Axis2 Development Team<br>
<a href="http://axis.apache.org/axis2/java/core/">http://axis.apache.org/axis2/java/core/</a></i></p>
</body>
</html>
