The release comes in two forms, source and binary. 

To get both the binary and source distributions working, you need Libxml2 from
http://xmlsoft.org/downloads.html

NOTE: Most Linux systems have Libxml2 installed by default. On Windows you need
      to download and install Libxml2.

Table of Contents
=================

1. Getting Axis2/C working with the binary release on Linux
2. Getting Axis2/C working with the source release on Linux
3. Getting Axis2/C working with the binary release on Windows (win32)
    3.1 Requirements
    3.2 Binaries in the release
    3.3 Running the binaries
4. Getting Axis2/C working with the source release on Windows (win32)
    4.1 Requirements
    4.2 Editing Configure.in file
    4.3 Compiling the source
    4.4 Running the binaries
5. Installing Apache2 Web Server integration module (mod_axis2)
    

1. Getting Axis2/C working with the binary release on Linux.
==========================================================

1. Extract the binary tar package to a directory.

2. Set AXIS2C_HOME environment variable pointing to the location where you have
   extracted Axis2/C
        AXIS2C_HOME='/your_path_to_axis2c'
        export AXIS2C_HOME

   NOTE: You will need to set AXIS2C_HOME only if you need to run Axis2/C samples
         or tests. The reason is that the samples and test codes use AXIS2C_HOME
         to get the path to Axis2/C. To write your own services or clients this is
         not a requirement.

3. Run the simple axis server:
        cd /your_path_to_axis2c/bin
        ./axis2_http_server
   This will start the simple axis server on port 9090. To see the possible
   command line options run
        ./axis2_http_server -h

   NOTE: If you run into shared lib problems, set the LD_LIBRARY_PATH
        export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/your_path_to_axis2c/lib

4. Run the sample clients in a new shell
        cd /your_path_to_axis2c/bin/samples
        ./echo
   This will invoke the echo service.

        ./math
   This will invoke the math service.

   To see the possible command line options for sample clients run them with
   '-h' option

   NOTE: If you run into shared lib problems, set the LD_LIBRARY_PATH
        export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/your_path_to_axis2c/lib


2. Getting Axis2/C working with the source release on Linux.
==========================================================

1. Extract the source tar package to a directory

2. Set AXIS2C_HOME environment variable pointing to the location where you want
   to install Axis2/C.
        AXIS2C_HOME='/your_desired_path_to_axis2c_installation'
        export AXIS2C_HOME

   NOTE: You will need to set AXIS2C_HOME only if you need to run Axis2/C samples
         or tests. The reason is that the samples and test codes use AXIS2C_HOME
         to get the path to Axis2/C. To write your own services or clients this is
         not a requirement.

3. Go to the directory where you extracted the source
        cd /your_path_to_axis2c_source

4. Build the source
   This can be done by running the following command sequence in the directory
   where you have extracted the source.

        ./configure --prefix=${AXIS2C_HOME}
        make
        sudo make install

   Please run './configure --help' in respective sub folders for more information 
   on these configure options. 

   NOTE: If you don't provide the --prefix configure option, it will by default
         be installed into "/usr/local/axis2c" directory.

   You could run make check to test if everything is working fine. However, note 
   that the test/core/clientapi/test_clientapi program would fail unless 
   AXIS2C_HOME points to the installed location. (It's looking for Axis2/C 
   repository)  This means you really should run "make && make install", 
   then set AXIS2C_HOME=/path/to/install, and then "make check".  
   That's a little different than the usual "make && make check && make install" 
   process.

   You may need to try Axis2/C with guththila xml parser. You can do it by giving
   "--enable-guththila=yes" as a configure option.
    
        ./configure --enable-guththila=yes [other configuration options]
        make
        sudo make install

   If you need to get the samples working, you also need to build the samples.
   
   To build the samples:

        export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/usr/local/axis2c/lib/
        cd samples
        ./configure --prefix=${AXIS2C_HOME} --with-axis2=${AXIS2C_HOME}/include/axis2-1.3.0
        make
        sudo make install

   Please run "./configure --help" in samples folder for more information on
   configure options.

   NOTE: If you don't provide a --prefix configure option, samples will by default
         be installed into "/usr/local/axis2c/samples" directory.

5. Go to the folder where you installed Axis2/C.

6. Start simple axis server
        cd ${AXIS2C_HOME}/bin
        ./axis2_http_server

   This will start the simple axis server on port 9090. To see the possible command
   line options run:
        ./axis2_http_server -h

   NOTE: You may need to be login as superuser to run the simple axis server.

8. Run the sample clients in a new shell
        cd ${AXIS2C_HOME}/bin/samples
        ./echo
   This will invoke the echo service.

        ./math
   This will invoke the math service.

   To see the possible command line options for sample clients, run them with
   '-h' option.


3. Getting Axis2/C working with the binary release on Windows.
============================================================

3.1 Requirements
----------------

    * The binaries shipped with this version are compiled with Microsoft Visual
      Studio compiler (cl) 

    Note: You can download Microsoft VS Express2005 Edition from Microsoft 
          website and install it to run these binaries

    * You also need the following dlls
        - libxml2.dll [http://www.zlatkovic.com/pub/libxml - version >= libxml2-2.6.20.win32]
        - iconv.dll [http://www.zlatkovic.com/pub/libxml - version >= iconv-1.9.1.win32]
        - zlib1.dll [http://www.zlatkovic.com/pub/libxml - version >= zlib-1.2.3.win32]

3.2 Binaries in the release
---------------------------

    Extract the binary distribution to a folder of your choice. 
    (example: C:\axis2c)

    The c:\axis2c folder structure is as follows.

    axis2c
      |
      +- bin         - server and other executables
      |   |
      |   +- samples - samples go here
      |         |
      |         +...
      |
      |
      +- docs        - documentation 
      |
      +- include     - all include files of axis2 
      |
      +- lib         - library modules
      |
      +- logs        - system and client logs are written to this folder
      |
      +- modules     - deployed modules 
      |
      +- samples     - source files of the samples in bin
      |
      +- services    - deployed services 
      
    Copy the downloaded libxml2.dll, iconv.dll and zlib1.dll to C:\axis2c\lib
    (Or you can have these dll's some other place and add the location to PATH 
     environment variable)

3.3 Running the binaries
------------------------

    You need to set a couple of environment variables before you can run the
    server and samples.

    Set the variable AXIS2C_HOME to the deploy folder (C:\axis2c)
    Add the path to lib directory to the PATH variable (%AXIS2C_HOME%\lib)

    Now everything is set to run the server!

    C:\axis2c\bin>axis2_http_server.exe 

    You should see the message:
        Started Simple Axis2 HTTP Server...

    By default the log is created under %AXIS2C_HOME%\logs folder with the name
    axis2.log.

    NOTE: You may provide command line options to change the default behaviour.
    Type "axis2_http_server.exe -h" to learn about the usage)

    Now you can run any sample client deployed under %AXIS2C_HOME%\bin\samples\
    Example:
    C:\axis2c\bin\samples>echo.exe


4. Getting Axis2/C working with the source release on Windows.
============================================================

4.1 Requirements
----------------

    * The makefile shipped with this version needs Microsoft Visual Studio 
      compiler (cl) and nmake build tool 
    
    NOTE: You can download Microsoft VS Express2005 Edition and Platform SDK from
          Microsoft website. You will need to add the path to Platform SDK Include
          and Lib folders to the makefile.

    * You also need 
        - libxml2 [http://www.zlatkovic.com/pub/libxml - download the version >=  libxml2-2.6.20.win32]
        - iconv [http://www.zlatkovic.com/pub/libxml - download the version >= iconv-1.9.1.win32]
        - zlib [http://www.zlatkovic.com/pub/libxml - download the version >= zlib-1.2.3.win32]

4.2 Editing configure.in file
-----------------------------

    The default places for libxml2 and iconv are specified in configure.in. 

    Example:
    Default location for libxml2 is C:\libxml2
        You can either extract libxml2 to this folder. Folder structure should 
        look like the following.
        C:\libxml2
            |
            +- include
            |
            +- bin
            |
            +- lib

    Or extract to whatever place of your choice and edit the configure.in accordingly.

    You need to have zlib1.dll in a library path. You may copy this dll to libxml2/lib.

4.3 Compiling the source
------------------------

    Extract the source distribution to a folder of your choice. (Example: C:\axis2c)
    Open a DOS shell and type:
        cd C:\axis2c\build\win32
        C:\axis2c\build\win32>vcvars32.bat
                       to access .Net tools
                       (Note: You may need to set the PATH environment
                       variable to  vcvars32.bat if Windows complains 
                       that it cannot find this bat)
        C:\axis2c\build\win32>nmake install

    That's it! This will build the system and create a directory named 'deploy'
    under the build directory.

    The deploy folder structure is as follows.

    deploy
      |
      +- bin         - server and other executables
      |   |
      |   +- samples - samples go here
      |         |
      |         +...
      |
      +- lib         - library modules
      |
      +- services    - deployed services 
      |
      +- modules     - deployed modules 
      |
      +- include     - all include files of axis2 
      |
      +- logs        - system and client logs are written to this folder

4.4 Running the binaries
------------------------

    You need to set a couple of environment variables before you can run the 
    server and samples.

    Set the variable AXIS2C_HOME to the deploy folder (C:\axis2c\build\deploy)
    Add the path to lib directory to the PATH variable (%AXIS2C_HOME%\lib)

    Copy libxml2.dll, iconv.dll, and zlib1.dll to the Axis2/C lib folder
    (%AXIS2C_HOME%\lib)

    Now everything is set to run the server!

    C:\axis2c\build\deploy\bin>axis2_http_server.exe 

    You should see the message
        Started Simple Axis2 HTTP Server...

    By default, the log is created under %AXIS2C_HOME%\logs folder with the 
    name axis2.log.
    (Note: You may provide command line options to change the default behaviour.
    Type "axis2_http_server.exe -h" to learn about the usage)

    Now you can run any sample client deployed under %AXIS2C_HOME%\bin\samples\
    Example:
        C:\axis2c\build\deploy\bin\samples>echo.exe


5. Installing Apache2 Web Server integration module (mod_axis2)
---------------------------------------------------------------

5.1 Building mod_axis2 from the source tree 

5.1.1 On the Linux Platform

    Provide the Apache2 include file location as a configure option
        ./configure --with-apache2="<apache2 httpd include files location>" [other configure options]

    NOTE: Some apache2 distributions install APR (Apache Portable Run-time) 
    include files in a separate location which is required to build mod_axis2.
    In that case use:
        ./configure --with-apache2="<apache2 directornclude files location>>" 
            --with-apr="<apr include files location>" [other configure options]

    Then build the source tree
        make
        make install

    This will install mod_axis2.so into your "<your_path_to_axis2c>/lib"

5. 1.3.0 On Win32 platform

    Provide the apache2 location in configure.in file in APACHE_INSTALL_DIR
    Example:
    APACHE_INSTALL_DIR = E:\Apache

    After compiling the sources (as described in section 4.3) build the
    mod_axis2.dll by issuing the command "nmake axis2_apache_module".
    This will build the mod_axis2.dll and copy it to %AXIS2C_HOME%\lib directory.
    Example:
    C:\axis2c\build\deploy\lib 

5.2 Deploying in Apache2 Web Server

    NOTE: To do the following tasks, you might need super user privileges in your 
          machine.

    Copy the mod_axis2 (libmod_axis2.so.0.2.0 on Linux and mod_axis2.dll in Windows)
    to "<apache2 modules directory>" as mod_axis2.so 
    Example:
    cp $AXIS2C_HOME/lib/libmod_axis2.so.0.2.0 /usr/lib/apache2/modules/mod_axis2.so
        in Linux or

    copy C:\axis2c\build\deploy\lib\mod_axis2.dll C:\Apache2\modules\mod_axis2.so
        in Windows

    Edit the Apache2's configuration file (generally httpd.conf) and add the
    following directives

    LoadModule axis2_module <apache2 modules directory>/mod_axis2.so
    Axis2RepoPath <axis2 repository path>
    Axis2LogFile <axis2 log file path>
    Axis2MaxLogFileSize <maximum size of log file>
    Axis2LogLevel LOG_LEVEL
    <Location /axis2>
        SetHandler axis2_module
    </Location>

    NOTE: Axis2 log file path should have write access to all users because by
          default Apache Web Server runs as nobody.
    NOTE: If you want to use a Shared Global Pool with Apache you have to give another
          entry called Axis2GlobalPoolSize.You have to give the size of the shared global
          pool in MB.If you doesn't set the value or if you set a negative value Apache 
          module doesn't create shared global pool.
        
          Axis2GlobalPoolSize <global pool size in MB>        

    LOG_LEVEL can be one of following
        crit - Log critical errors only
        error - Log errors critical errors
        warn - Log warnings and above
        info - Log info and above
        debug - Log debug and above (default)
        trace - Log trace messages

    NOTE: Use forward slashes "/" for path separators in <apache2 modules directory>, 
          <axis2 repository path> and <axis2 log file path>

    Make sure that the apache2 user has the correct permissions to above paths
        - Read permission to the repository
        - Write permission to the log file

    Restart apache2 and test whether mod_axis2 module is loaded by typing the URL
        http://localhost/axis2/services


6. Installing IIS (Interner Information Server) integration module (mod_axis2_IIS)
----------------------------------------------------------------------------------

6.1 Building mod_axis2_IIS from the source tree

    After compiling the sources (as described in section 4.3) build the
    mod_axis2.dll by issuing the command "nmake axis2_IIS_module".
    This will build the mod_axis2_IIS.dll and copy it to %AXIS2C_HOME%\lib directory.
    Example:
    C:\axis2c\build\deploy\lib 

6.2 Deploying in the IIS
    
    Add the following key to the registery.

    HKEY_LOCAL_MACHINE\SOFTWARE\Apache Axis2c\IIS ISAPI Redirector

    Under this registry key add the following entries.

    Add a string value with the name axis2c_home and a value of the axis2c home path i.e c:\axis2c
    Add a string value with the name log_file and a value of absolute path of the log file i.e c:\axis2c\logs\axis2.log
    Add a string value with the name log_level. The value can be one of the following		
		trace    - Log trace messages
 		error    - Log errors critical errors
 		info     - Log info and above
 		critical - Log critical errors only 
		debug	   - Log debug and above (default)
	 	warning  - Log warnings

    Using the IIS management console, add a new virtual directory to the IIS/PWS web site called "axis2"
    The physical path of this virtual directory should be the axis2\lib directory (Where the mod_axis2_IIS.dll is in)
    Assign excecute permissions to this virtual directory.

    Using the IIS management console, add mod_axis2_IIS.dll as a filter to the IIS/PWS web site. The name of the filter can be any meaningful name. 

    Restart IIS and test whether mod_axis2_IIS module is loaded by typing the URL http://localhost/axis2. 
    Enjoy the Axis2/C soap engine!


FAQ
=======

1. Although I was able to get simple axis server up, unable to run samples.

        This could happen because the AXIS2C_HOME environment variable is not 
        set to the correct axis2 installation path.


2. What are the other dependencies Axis2/C has?
     
        Basically if you are willing to use libxml2 as your parser, you need to
        have it installed on your system. 
        libxml2 - http://xmlsoft.org/downloads.html

3. I installed libxml2 installed in my system, but ./configure fails saying
   "libxml2 not found"

        Yes, you need to install libxml2-dev packages. 
        
        1. If you are using a debian based system
                apt-get install libxml2-dev
        2. If you are using redhat/fedora based system.
                yum install libxml2-dev
        3. If you compile libxml2 from source you will not get this error.

4. Is there any recommended packages, that I need to instal in my system?

        1. automake, autoconf, libtool, aclocal
        2. libxml2 and libxml2-dev
        5. pkg-config
          
5. I tried several methods, browse through axis-c-dev and axis-c-user mail 
   archives but I was not able solve it.

        Then you can ask from Axis2/C users or Axis2/C developers about it by
        sending your question to 
            user      = axis-c-user@ws.apache.org    
            developer = axis-c-dev@ws.apache.org 

        You can get subscribe to

            axis-c-user list by sending request to  
                <axis-c-user-subscribe@ws.apache.org>

            axis-c-dev  list by sending request to  
                <axis-c-dev-subscribe@ws.apache.org>

            subject of the request should be "subscribe"


6. This FAQ is not enough...
       
       You can help us by reporting your suggestions, complaints, problems and bugs




Thank you for using Axis2/C ...
