<!--
  ~ 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.
  -->
<document xmlns="http://maven.apache.org/XDOC/2.0"
          xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
          xsi:schemaLocation="http://maven.apache.org/XDOC/2.0 http://maven.apache.org/xsd/xdoc-2.0.xsd">
    <properties>
        <title>Apache Axis2/Java - Next Generation Web Services</title>
    </properties>
    <body>
<h1>Welcome to Apache Axis2/Java</h1>
<p>Apache Axis2&#x2122; is a Web Services / SOAP / WSDL engine, the successor to the
widely used <a href=
"http://ws.apache.org/axis/">Apache Axis</a> SOAP stack.
There are two implementations
of the Apache Axis2 Web services engine - Apache Axis2/Java and
Apache Axis2/C</p>
<p>While you will find all the information on Apache Axis2/Java
here, you can visit the <a href=
"http://axis.apache.org/axis2/c/"><strong>Apache Axis2/C</strong></a>
Web site for Axis2/C implementation information.</p>
<p>Apache Axis2, Axis2, Apache, the Apache feather logo, and the Apache Axis2 project logo are trademarks of The Apache Software Foundation.</p>
<h3><em>Why Apache Axis2:</em></h3>
<p>A new architecture for Axis2 was introduced during the August
2004 Summit in Colombo, Sri Lanka. The new architecture on which
Axis2 is based on is more flexible, efficient and configurable in
comparison to <a href=
"http://ws.apache.org/axis/java/architecture-guide.html">Axis1.x
architecture</a>. Some well established concepts from Axis 1.x,
like handlers etc., have been preserved in the new
architecture.</p>
<p>Apache Axis2 not only supports SOAP 1.1 and SOAP 1.2, but it
also has integrated support for the widely popular <a href=
"http://www.xfront.com/REST-Web-Services.html">REST style of Web
services</a>. The same business logic implementation can offer both
a WS-* style interface as well as a REST/POX style interface
simultaneously.</p>
<p>Apache Axis2 is more efficient, more modular and more
XML-oriented than the older version. It is carefully designed to
support the easy addition of plug-in "modules" that extend their
functionality for features such as security and reliability. The
<a href="modules/index.html">Modules</a>
currently available or under development include:</p>
<ul>
<li><a href=
"http://www.oasis-open.org/committees/tc_home.php?wg_abbrev=wss"
>WS-Security</a> - Supported by <a href=
"http://axis.apache.org/axis2/java/rampart/">
Apache Rampart</a></li>
<li><a href="http://www.w3.org/Submission/ws-addressing/"
>WS-Addressing</a> -Module included as part of Axis2
core</li>
</ul>
<p>Apache Axis2 is built on <a href=
"http://ws.apache.org/axiom/">Apache AXIOM</a>, a
new high performant, pull-based XML object model.</p>
<p>Axis2 comes with many new features, enhancements and industry
specification implementations. The key features offered are as
follows:</p>
<ul>
<li>
<p style="margin-bottom: 0in"><strong>Speed</strong> - Axis2 uses
its own object model and StAX (Streaming API for XML) parsing to
achieve significantly greater speed than earlier versions of Apache
Axis.</p>
</li>
<li>
<p style="margin-bottom: 0in"><strong>Low memory foot
print</strong>- Axis2 was designed ground-up keeping low memory
foot print in mind.</p>
</li>
<li>
<p style="margin-bottom: 0in"><strong>AXIOM</strong> - Axis2 comes
with its own light-weight object model, AXIOM, for message
processing which is extensible, highly performant and is developer
convenient.</p>
</li>
<li>
<p style="margin-bottom: 0in"><strong><a name="Hot_Deployment" id=
"Hot_Deployment"></a>Hot Deployment</strong> - Axis2 is equipped
with the capability of deploying Web services and handlers while
the system is up and running. In other words, new services can be
added to the system without having to shut down the server. Simply
drop the required Web service archive into the services directory
in the repository, and the deployment model will automatically
deploy the service and make it available for use.</p>
</li>
<li>
<p style="margin-bottom: 0in"><strong>Asynchronous Web
services</strong> - Axis2 now supports asynchronous Web services
and asynchronous Web services invocation using non-blocking clients
and transports.</p>
</li>
<li>
<p style="margin-bottom: 0in"><strong>MEP Support</strong> - Axis2
now comes handy with the flexibility to support Message Exchange
Patterns (MEPs) with in-built support for basic MEPs defined in
WSDL 2.0.</p>
</li>
<li>
<p style="margin-bottom: 0in"><strong>Flexibility</strong> - The
Axis2 architecture gives the developer complete freedom to insert
extensions into the engine for custom header processing, system
management, and <em>anything else you can imagine</em>.</p>
</li>
<li>
<p style="margin-bottom: 0in"><strong>Stability</strong> - Axis2
defines a set of published interfaces which change relatively
slowly compared to the rest of Axis.</p>
</li>
<li>
<p style="margin-bottom: 0in"><strong>Component-oriented
Deployment</strong> - You can easily define reusable networks of
Handlers to implement common patterns of processing for your
applications, or to distribute to partners.</p>
</li>
<li>
<p style="margin-bottom: 0in"><strong>Transport Framework</strong>
- We have a clean and simple abstraction for integrating and using
Transports (i.e., senders and listeners for SOAP over various
protocols such as SMTP, FTP, message-oriented middleware, etc), and
the core of the engine is completely transport-independent.</p>
</li>
<li>
<p style="margin-bottom: 0in"><strong>WSDL support</strong> - Axis2
supports the Web Service Description Language, version <a href=
"http://www.w3.org/TR/wsdl">1.1</a> and <a href=
"http://www.w3.org/TR/wsdl20/">2.0</a>, which allows you to easily
build stubs to access remote services, and also to automatically
export machine-readable descriptions of your deployed services from
Axis2.</p>
</li>
<li>
<p style="margin-bottom: 0in"><strong>Composition and
Extensibility</strong> - Modules and phases improve support for
composability and extensibility. Modules support composability and
can also support new WS-* specifications in a simple and clean
manner. They are however not <a href="#Hot_Deployment">hot
deployable</a> as they change the overall behavior of the
system.</p>
</li>
</ul>
<p>We hope you enjoy using Axis2. Please note that this is an
open-source effort. If you feel the code could use new features or
fixes, or the documentation can be improved, please get involved
and lend us a hand! The Axis developer community welcomes your
participation.</p>
<p>Let us know what you think! Send your feedback on Axis2 to
"<a href=
"mailto:java-user@axis.apache.org">java-user@axis.apache.org</a>". Make
sure to prefix the subject of the mail with [Axis2].</p>
</body>
</document>
