/*
 * 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.4 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-1.4).


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_4/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_4/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_4/reference.html

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