/*
 * 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://axis.apache.org/axis2/java/core/docs/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://axis.apache.org/axis2/java/core/docs/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://axis.apache.org/axis2/java/core/docs/reference.html

Complete Installation Guide
===========================
A complete Installation Guide on Apache Axis2 is available at
http://axis.apache.org/axis2/java/core/docs/installationguide.html
   
   
