http://www.developer.com/services/article.php/3557741/Understanding-Axis2-Deployment-Architecture.htm
Axis 2.0 is the next generation of the Apache Web service stack. Axis2 is built on a new architecture that was designed to be a much more flexible, efficient, and configurable version of Axis. Even though the architecture is new, some of the well-established concepts from Axis 1.x, such as handlers, are preserved in Axis 2.0. Axis 2.0 comes with lots of new features, enhancements, and new industry specification implementations. Among the new features and enhancements are AXIOM, Asynchronous Web service, MTOM, MEP support, and archive-based deployment architecture, which is considerably esteemed. The Axis2 architecture has developed keeping a few principles in mind to preserve the uniformity of the architecture. The first one is the architecture that separates the logic and the states; the code that processes the logic is usually stateless. This allows the code to be executed freely by the parallel threads. The second one is that all the information is kept in one Information model; this allows the system to be stored and resumed. And finally, the architecture is modular; the architecture broke Axis2 into the following seven modules (as shown in Figure 1). Figure 1: Axis2 architecture components Previous versions of Axis failed to address the user friendliness factor involved in the deployment of a Web service, and it is due to the fact that Axis 1.x was created mainly to prove the Web service concepts. Therefore, in Axis 1.x, the user has to invoke the admin client manually and update the server classpath, and then restart the server to apply the changes. This burdensome deployment model was a definite barrier for beginners. Axis2 is engineered to overcome this drawback and provide a flexible, user-friendly, and easily configurable deployment model. Axis2 deployment introduced the notion of a J2EE-like deployment mechanism, where the developer can bundle all his/her class files, library files, resources files, and configuration files together as an archive file, and drop it into a specified location in the file system. The concept of hot deployment and hot update is not new terminology to the technical paradigm, particularly to a Web service platform, but for Apache Axis, it is a new feature. Therefore, Axis2 was developed by keeping room for "hot" deployment features. Hot deployment: The capability of deploying service while system is up and running. In a real-time system or business environment, availability of the system is very important. If the system is down even for a moment, the loss might be substantial and it may affect the lifetime of the business. However, if it is necessary to add a new service to the system and if this can be done without shutting down the servers, that would be a great achievement. So, Axis2 addresses that and provides a Web service hot deployment ability, where you do not need shut down the system to deploy a new Web service. You merely need to drop the required Web service archive into the services directory in the repository. Then, the deployment model will automatically deploy the service and make it available to you. Hot update: The capability of making changes to an existing Web service without shutting down the system. This is an important feature and is required in a testing environment. However, it is not advisable to use hot update in a real-time system because a hot update could result in the system leading to an unknown state. Additionally, there is the possibility of losing the existing service data of that service. To prevent this, Axis2 came with the hot update parameter set to FALSE by default. Axis2 addresses hot deployment and hot update by using a scheduler and a file system listener, where the scheduler is scheduled in the way that will inform the listener to search the repository for updating and, depending on the configuration given by axis2.xml updates (adding new service or changing an existing service), will be made available to the system. The underlying architecture that provides "hot" deployment characteristics is as shown in Figure 2. Figure 2: Deployment Architecture (Repository based deployment) Figure 3: Axis2 repository The flexibility and extensibility of Axis2 is focused mainly on its deployment descriptors. Because all these descriptors are XML-based, the extensibility nature of XML has reflected to Axis2 as well. There are three main deployment descriptors in Axis2, as follows: All the global configurations that are needed to run Axis2 are given by axis2.xml (global parameters, transport information, and so forth). The most interesting thing about this is that someone can configure the deployment behavior by axis2.xml, meaning that one can configure "hotdeployment" and "hotupdate" parameters the way he wants, as shown below. Likewise, all the global level parameters, modules, transports information, and so on can be included in the configuration file. When the axis2 starts, it search the repository for axis2.xml. If it is found, the system will be configured by using that; otherwise, the default one (which is distributed with the axis2 distribution) will be copied into the repository and the system starts using that. Later, if the user wants, he can change axis2.xml file. One thing to remember here is that, to affect any changes, you need to restart the system. (Explaining everything about axis2.xml is beyond the scope of this article. If you need to know more, click here.) If you are an Axis 1.x user, you are familiar with deploying a service with Axis 1.x. The easiest way to do that is (say you are using Axis 1.x java) through the 'instant' Web service in Axis1. So, with Axis 1.x deploying a service is nothing?. The answer is yes if you are going to publish a very simple service, but say: This is not impossible with Axis 1.x but average users (particularly beginners) will have to do some hard work to get the job done. In this particular case, the user has to write a special deployment descriptor called the WSDD and feed it to the Axis AdminClient. The admin client does the modifications in the server (again through a Web service), but for the service to work, the server class path needs to be modified, which usually requires a server restart! Therefore, Axis2 was developed to address the deployment drawbacks in Axis 1.x, and to provide a better deployment mechanism. As a result of that, in Axis2 deploying a service is nothing if you can mange to crate a correct service archive (creating a service archive is not such a difficult task because Axis2 comes with a tool to create archive files). Therefore, in Axis2, deploying a service is just a matter of dropping the archive file into the services sub directory in the Axis2 repository. If you are going to deploy Axis2 in an application server like tomcat, you can use a Web interface to deploy the service. Here is the Axis2 way to write a Web service by hand (without using tools): Next, write services.xml, the configuration file of the service as described below. A template of a services.xml file is shown below: The next step is to bundle the above files together into a service archive file, which can be done by applying the following procedures. (If you are using your IDE as either IntelJ IDEA or eclipse, you can download the plug-in for those IDEs from the Axis2 site; those will make your job much easier.) The directory should look like Figure 4. Figure 4: Axis2 service sub directory hierarchy Note: As mentioned earlier, in Axis2 it is not required to have a wsdl file to publish a service, but if you have a wsdl file, it provides more functionality or rather configurations. If the archive file contains a wsdl file, a WSDL Object Model (WOM) will be created using that particular wsdl by deployment and then fill rest of the data by using services.xml. If you do not have a wsdl with you, an empty WOM model will be crated and rest will be filled using services.xml. The concept of service extension is a totally new concept in the Apache Axis paradigm, but the developers have achieved the functionally of service extension or the module by doing a very hard job in Axis 1.x. A module is something that can plug into a running system; then, it will do some extra job. In one respect, a module can be considered a set of handlers bundled together to provide some specific casemost of the time, it implements a WS spec. The idea is very simple. Say you need to support WS-Addressing; what you have to do is download the module and drop that into the modules directory in the Axis2 repository. If you want to enable that globally, put the following entry into axis2.xml; otherwise, if you want to enable that into specific service, put the same entry into the services.xml of that particular service. In this case ModuleName = addressing. The same scenario is applicable for WS-Security, WS-RM, and so forth. Creating a module archive file is almost the same as that of a service archive file; the only difference is that the module contains module.xml as its configuration file. In addition to that, the module may or may not contain a module implementation class, but as a module it should at least contain a single handler. (It won't be checked by deployment, but if a module does not have a single handler, it is useless.) A template of module.xml is shown below: As you can see, there are some elements called ** flow. In module.xml, those are basically to configure Axis2 messaging paths. To write a correct module, you need to have a better understanding about all the possible and valid elements in module configuration, but explaining them here is beyond the scope of this article. Resources are available on the Axis2 site; you should read them before writing any modules. Although a service can deploy without creating a service archive, it is not applicable here. To be a valid module in Axis2, (1) it should be an archive file (either *.mar or *.jar), (2) it should take the directory hierarchy as shown in Figure 5. Figure 5: Axis2 module sub directories hierarchy In Axis2 there are two ways to deploy a service. One is to drop the service archive file into the services sub directory in the Axis2 repository; the other is to deploy the service programmatically. The basis of repository-based deployment has mentioned above, and is the most common way of deploying a service. Deploying a service programmatically is not really a user requirement, but it is kind of module author requirement, where some module requires you to deploy a Web service to provide the full functionality of the module. To create a service programmatically, you need to have servicesxml, a class loader with your class files (or CCL) and ServiceDescription, the static representation of a service in Axis2. The following code fragment will help you to get a basic understanding about programmatically service deployment. Axis2 is not there to prove Web services concepts, but to provide a better SOAP processing model, with considerable performance increase in both speed and memory with respect to Axis 1.x and other existing web service engines. In addition to that, it provides a user convenient deployment mechanism. Now, it's time to play with Axis2.
Understanding Axis2 Deployment Architecture
October 20, 2005
Axis2 Architecture

Deployment Architecture
What is the difference between Axis 1.x and Axis2 deployment?


Axis2 Global Configuration
<parameter name="hotdeployment">true</parameter>
<parameter name="hotupdate">false</parameter>
Axis2 Service
<service >
<description>
The description of the service goes here; this can be any
XML element
</description>
<parameter name="ServiceClass" locked="false">
org.apache.axis2.MyServiceImpl
</parameter>
<parameter name="ServicePara" locked="false">
ServicePara
</parameter>
<operation name="myOperation">
<parameter name="OperationPara" locked="false">
OperationParaValue
</parameter>
</operation>
</service>
Steps to Write services.xml
Note: The above service configuration is very simple one, and the actual configuration file can be more complex than that.
Note: Axis2 is on the way to introducing the concept of a service group into the Web service platform where the user can deploy more than one services in an archive file and share data across those services. This article only describes how a single service should look and the available ways of deployment.
Note: If you are using Axis2 version above 0.91, you do not need to create an archive file. You can just drop your service folder into the service sub directory in the Axis2 repository.
Axis2 Service Extension (Modules)
<module ref="ModuleName"/>
Note: In Axis2, you get WS-Addressing by default, so you do not need to do anything. In fact, addressing is globally enabled, so each and every service will have addressing functionally by default.
<module name="ModuleName" class="org.apache.module.Module1Impl">
<inflow>
<handler name="h1" class="org.apache.axis2.registry.Handler3">
<order phase="userphase1"/>
</handler>
<handler name="h2" class="org.apache.axis2.registry.Handler3">
<order phase="userphase1"/>
</handler>
</inflow>
<outflow>
Out Flow handlers go here
</outflow>
<Outfaultflow>
Out fault flow handler go here
</Outfaultflow>
<INfaultflow>
In fault flow handlers go here
</INfaultflow>
<parameter name="ModulePara" locked="true">
ModuleParaValue
</parameter>
</module>
Note: If you have a module implementation class, set the value of the class attribute as a fully qualified name of the implementation class. If module.xml contains a module implementation class, its init method will be called by deployment at deployment time.
Note: It is not a requirement that you should drop the module archive file into the module's sub directory, but if you have the module archive in your class path and you ask to engage that particular module by putting <module ref="foo"/> in anywhere (may be axis2.xml or services.xml), the deployment engine will read the module from the class path and copy that into the modules directory.
Available Ways to Deploy a Service in Axis2
DeploymentEngine de = new DeploymentEngine();
ServiceDescription service = new ServiceDescription();
ClassLoader cls = Thread.currentThread().getContextClassLoader();
InputStream in = new FileInputStream("location of servie.xml");
de.buildService(service,in,cls);
Conclusion