/*
 * 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.
 */
                 
                 Axis2 Binary Distribution Installation Guide
                 =====================================================

1. Download and Install the Apache Axis2 Binary Distribution

  Download and install a Java Development Kit (JDK) release (version 1.5 or
  later) from http://java.sun.com/j2se/. Install the JDK according to the
  instructions included with the release. Set an environment variable JAVA_HOME 
  to the pathname of the directory into which you installed the JDK release.

  Download and unpack the Axis2 Binary Distribution into a convenient
  location so that the distribution resides in its own directory. Set an 
  environment variables AXIS2_HOME to the pathname of the extracted directory 
  of Axis2 (Eg: /opt/axis2-${project.version}).


2. Starting up Axis2 Standalone Server

  Standalone Axis2 server can be started by executing the following commands:
  			%AXIS2_HOME%\bin\axis2server.bat (Windows)
  			$AXIS2_HOME/bin/axis2server.sh (Unix)

  After startup, the default web services included with Axis2 will be available 
  by visiting http://localhost:8080/axis2/services/


3. Building the Axis2 Web Application (axis2.war) Using Standard Binary 
Distribution

  Download and install Apache Ant (version 1.6.5 or later) from http://
  ant.apache.org. Install the Apache Ant according to the instructions included 
  with the Ant release.

  Locate the ant build file (build.xml) inside the webapp directory which 
  resides in your Axis2 home directory (i.e:- $AXIS_HOME/webapp)". Run the Ant 
  build by executing "ant create.war" inside the $AXIS2_HOME/webapps folder. 
  
  You can find the generated axis2.war inside the $AXIS2_HOME/dist directory. 
  All the services and modules that are present in the AXIS2_HOME/repository 
  will be packed in to the created axis2.war together with the Axis2 
  configuration file found at $AXIS2_HOME/conf/axis2.xml.

  Drop the war in the webapps folder of the servlet container. Most servlet 
  containers will automatically install war. (some servlet containers may 
  require a restart in order to capture the new Web application. Refer your 
  servlet container documentation for more information about this.) Once the 
  WAR is successfully installed, test it by pointing the Web browser to the 
  http://<host :port>/axis2. It should produce the the Axis2 Web Application 
  Home Page.
  
  Use the link "Validate" to ensure that everything is fine and smooth. If the 
  validation fails then the war has failed to install properly or some 
  essential jars are missing. At such a situation the documentation of the 
  particular servlet container should be consulted to find the problem. 
  
  Read http://ws.apache.org/axis2/1_5/installationguide.html#servlet_container
  for more information.
  
   
4. Getting Familiar with the Axis2 Convenient Scripts

   It is advised to add the $AXIS2_HOME/bin to the PATH, so that you'll be able 
   to run the following scripts from any where.

   * axis2.{bat|sh} 	
   
   You can use this script to run Web service clients written using Axis2. This 
   script calls the "java" command after adding the classpath for Axis2 
   dependent libraries (*.jar files present in your AXIS2_HOME/lib), setting 
   the Axis2 repository location (AXIS2_HOME/repository) and setting the Axis2 
   configuration file location(AXIS2_HOME/conf/axis2.xml) for you. With this 
   you can be relieved from setting all the above Axis2 specific parameters.
   
    Usage : axis2.{sh.bat} [-options] class [args...]
  

   * axis2server.{bat|sh} 
   
   This script will start an standalone Axis2 server using the AXIS2_HOME/
   repository directory as the Axis2 repository and the AXIS2_HOME/conf/
   axis2.xml as the Axis2 configuration file. This will start all the 
   transport listeners listed in the AXIS2_HOME/conf/axis2.xml.

   For an example, if you want to deploy a service using standalone Axis2 
   server,then copy your service archive to the AXIS2_HOME/repository/services 
   directory. After that go to the "Transport Ins" section of the AXIS2_HOME/
   conf/axis2.xml and configure the tranport receivers (simpleHttpServer in 
   port 8080 is listed by default). Then invoke this script.
   
   
   * wsdl2java.{bat|sh} 	
   
   This script generates Java code according to a given WSDL file to handle Web 
   service invocations (Client side Stubs). This script also has the ability to 
   generate service skeletons according to the given wsdl.
   
     Usage: WSDL2Java.{sh|bat} [OPTION]... -uri <Location of WSDL>
        Eg: WSDL2Java.sh -uri ../wsdl/Axis2Sample.wsdl
        
   A more detailed reference about this script can be found
   http://ws.apache.org/axis2/1_5/reference.html.
   
   
   * java2wsdl.{bat|sh} 	
   
   This script generates the appropriate WSDL file for a given java class.
     Usage: Java2WSDL.{sh|bat} [OPTION]... -cn <fully qualified class name>
        Eg: Java2WSDL.sh -cn ../samples/test/searchTool.Search
        
   A more detailed reference about this script can be found in
   http://ws.apache.org/axis2/1_5/reference.html

Complete Installation Guide
===========================
A complete Installation Guide on Apache Axis2 is available at
http://ws.apache.org/axis2/1_5/installationguide.html
   
   
