<html>
<head>
  <meta http-equiv="content-type" content="">
  <title>Welcome to Apache Axis2 version 1.2</title>
</head>

<body lang="en">
<h1>Welcome to Apache Axis2 version 1.2</h1>

<h3>@TODAY@</h3>
<pre>Just over 4 months since the original 1.1.1 release, we are very proud to
announce the release of Apache Axis2 version 1.2

Downloads are available at:
    http://ws.apache.org/axis2/download.cgi

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.

Modules supporting WS-Security/Secure-Conversation (Apache Rampart),
WS-Trust (Apache Rahas), WS-Reliable Messaging (Apache Sandesha) and
WS-Eventing (Apache Savan) will be available after the Apache Axis2
1.2 release. Please see these projects' own sites for further information.

Major Changes Since 1.1:
- WSDL 2.0 fully support (reading, writing, and codegen)
- POJO annotation (JSR 181)
- JAX-WS integration
- JAX-WS -annotation
- Un-wrapping (Response) 
- ADB - support for union and list
- Maven2 support
- JSON support 
- Binary serialization (Fast infoste)
- Codegen support for WSDL with Multiple services
- HTTP code generation (both WSDL 1.1 and 2.0)
- Custom deployer support
- Message formatters
- Message Builders
- EJB Provider support



Known Issues and Limitations in 1.2 Release:

- Xml-beans databinding does not support response uwwrapping
- ADB databinding does not support minOccurs and maxOccures attributes in sequence and choice elements
 (i.e) <sequence minOccurs="0" maxOccurs="unbounded"></sequence>
- Unable to produce original WSDL in the case of WSDL 2.0, therefore the AxisService is serialized to produce ?wsdl2. 


Apache Axis2 1.2 is a major new release compared to Axis2 1.1. 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:
    axis-user@ws.apache.org (please include "[axis2]" in the subject)
    axis-dev@ws.apache.org (please include "[axis2]" in the subject)
    http://issues.apache.org/jira/browse/AXIS2

Thank you for your interest in Apache Axis2!

The Axis2 Development Team
http://ws.apache.org/axis2/

------------------------------------------------------------------------------------

Features of Apache Axis2:

Programming Model
   - Improved XML-centric client API with full WSDL and policy support
   - Support for POJO and Spring services and clients
   - Support for any message exchange pattern (MEP)
   - Synchronous and asynchronous programming model
   - Archived service deployment model supporting full service
     encapsulation with versioning support
   - Archived module deployment model supporting controlled
     extensibility with versioning support
   - Hot deployment
   - WS-Policy driven code generation extensions
   - Flexible service life cycle model
   - Automatic support for POX (REST) style invocation of services
   - Support for querying service's WSDL (with ?wsdl), schema (with
     ?xsd) and policies (with ?policy)
   - WSDL 2.0POJO annotation (JSR 181)
   - JAX-WS intregration
   - Custom Deployers
   - Binary serialization (Fast Infoset)
   - JSON support
   - EJB Provider support

Supported Specifications
   - SOAP 1.1 and 1.2
   - Message Transmission Optimization Mechanism (MTOM)
   - XML Optimized Packaging (XOP)
   - SOAP with Attachments
   - WSDL 1.1, including both SOAP and HTTP bindings
   - WS-Addressing submission and 1.0
   - WS-Policy
   - SAAJ 1.1

Transports
   - HTTP
   - SMTP
   - JMS
   - TCP

Supported Data Bindings
   - Axis Data Binding (ADB)
   - XMLBeans
   - JibX
   - JaxMe (Experimental)
   - JaxBRI (Experimental)

Tools
   - WSDL2Java: Generate Java stubs and skeletons from a WSDL document.
   - Java2WSDL: Generate a WSDL document from a Java class.
   - Eclipse Plugins
   - IntelliJ Idea Plugins
   - Maven2 Plugins
   - Web application for administering Apache Axis2
    </pre>
</body>
</html>
