The release comes in two forms, source and binary. 

To get both the binary and source distribution, you need libxml2 from http://xmlsoft.org/downloads.html
(NOTE: most Linux systems has libxml2 by default. On Windows you need to download and install libxml2)

Table of Contents
=================
1. Getting Axis2C working with the binary release on Linux
2. Getting Axis2C working with the source release on Linux
3. Getting Axis2C working with the binary release on Windows (win32)
	3.1 Requirements
	3.2 Binaries in the release
	3.3 Running the binaries
4. Getting Axis2c 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 Axis2C working with the binary release on Linux.
==========================================================
1. Extract the binary tar package to a folder. 
   Set AXIS2C_HOME environment variable pointing to the location where you have extracted Axis2C
        AXIS2C_HOME='/your_path_to_axis2c'
        export AXIS2C_HOME
   Note: You will need to set AXIS2C_HOME only if you need to run axis2c samples or tests. The
    reason is that from sample and test codes it used AXIS2C_HOME to get path to axis2c. To write
    your own services or clients this is not a requirement.

2. 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
3. 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 Axis2C working with the source release on Linux.
==========================================================
1. Extract the source tar package to a folder. 
2. Set AXIS2C_HOME environment variable pointing to the location where you want to install Axis2C.
        AXIS2C_HOME='/your_desired_path_to_axis2c_installation'
        export AXIS2C_HOME
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

3. Then go to the folder where you extracted the source
        cd /your_path_to_axis2c_source
4. Set parser location
    Include path and library path to parser should be set. For libxml2 this is automatically
    resolved by configure script.
5. Build the source
This can be done using the following command sequence:
        ./configure
        make
        make install
use './configure --help' for options.

NOTE: If you don't provide a --prefix configure option, it will by default install into
/usr/local/axis2c folder.

If you need to get the samples working, you also need to build the samples.
To build samples:
    cd samples
    ./configure --prefix=${AXIS2C_HOME}
    make
    make install

6. go to where you installed axis2c.

7. Start simple axis server
        cd axis2c/bin
        ./axis2_http_server
This will start the simple axis server on port 9090. To see the posible command line options run:
        ./axis2_http_server -h
8. Run the sample clients in a new shell
        cd 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 Axis2C working with the binary release on Windows.
============================================================

3.1 Requirements
----------------

* the binaries shipped with this version is compiled with Microsoft visual studio compiler (cl) 
(Note: you can download microsoft VSExpress2005 editon from microsoft website and intall it to run these binaries)

* You also need the following dlls
	- libxml2.dll [http://www.xmlsoft.org - download the version >=  libxml2-2.6.20.win32]
	- iconv.dll [http://www.xmlsoft.org - download the version >= iconv-1.9.1.win32]
	- zlib1.dll [http://www.xmlsoft.org - download the 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-M0.4)

The c:\axis2c-M0.4 folder structure is as follows.

     axis2c-M0.4
	|- 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

Copy libxml2.dll, iconv.dll and zlib1.dll downloaded to C:\axis2c-M0.4\lib

3.3 Running the binaries
------------------------

You need to set couple of environment variables before you can run the server and samples.

Set the varibale AXIS2C_HOME to the deploy folder (C:\axis2c-M0.4)
Add the path to lib directory to PATH variable (%AXIS2C_HOME%\lib)

Now everything is set to run the server!

C:\axis2c-M0.4\bin>axis2_http_server.exe 

You should see the message
Started Simple Axis2 HTTP Server...

The log is by default 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-M0.4\bin\samples>echo.exe



4. Getting Axis2C 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 VSExpress2005 editon and Platform SDK from microsoft website. You will need to add the path  to Platform SDK Include and Lib folders to makefile)

* You also need 
	- libxml2 [http://www.xmlsoft.org - download the version >=  libxml2-2.6.20.win32]
	- iconv [http://www.xmlsoft.org - download the version >= iconv-1.9.1.win32]
	- zlib [http://www.xmlsoft.org - download the version >= zlib-1.2.3.win32]

4.2 Editing configure.in file
-----------------------------

The default places for libxml2 and iconv are speceficed 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
cd C:\axis2c\build\win32
C:\axis2c\build\win32>vcvars32.bat to access .Net tools (Note: You may need to set the environment PATH variable to  vcvars32.bat if windows complaints that it cannot find this bat)
C:\axis2c\build\win32>nmake install


Thats it! This will build the system and create a directory named deploy under 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 couple of environment variables before you can run the server and samples.

Set the varibale AXIS2C_HOME to the deploy folder (C:\axis2c\build\deploy)
Add the path to lib directory to PATH variable (%AXIS2C_HOME%\lib)

Copy libxml2.dll, iconv.dll and zlib1.dll to axis2c 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...

The log is by default 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 source tree 
5.1.1 On Linux Platform

* Provide the apache2 include files location as configure option
  ./configure --with-apache2="<apache2 include files location>" [other configure options]
  - Some apache2 distributions install APR (Apache Portable Runtime) include files in a seperate location which is requred to build mod_axis2. In that case use
  ./configure --with-apache2="<apache2 include 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.2 On Win32 platform
* Provide the apache2 location in configure.in file in APACHE_INSTALL_DIR
    eg : 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.
    eg: 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.0.0 on Linux and mod_axis2.dll in Windows) to "<apache2 modules directory>" (eg: /usr/lib/apache2/modules in Linux or C:\Apache2\modules in Windows) as mod_axis2.so 
    eg: cp $AXIS2C_HOME/lib/libmod_axis2.so.0.0.0 /usr/lib/apache2/modules/mod_axis2.so
        copy C:\axis2c\build\deploy\lib\mod_axis2.dll C:\Apache2\modules\mod_axis2.so

* Edit the Apache2's configuration file (generally httpd.conf) and add the following directives

    LoadModule axis2_module   <apache2 modules directory>/mod_axis2.so
    <Location /axis2>
        SetHandler axis2_module
        RepoPath <axis2 repository path>
        LogFile <axis2 log file path>
        Axis2LogLevel LOG_LEVEL
    </Location>
* LOG_LEVEL can be one of following
    AXIS2_LOG_LEVEL_CRITICAL - Log critical errors only
    AXIS2_LOG_LEVEL_ERROR - Log errors critical errors
    AXIS2_LOG_LEVEL_WARNING - Log warnings and above
    AXIS2_LOG_LEVEL_INFO - Log info and above
    AXIS2_LOG_LEVEL_DEBUG - Log debug and above (default)
    AXIS2_LOG_LEVEL_TRACE - Log trace messages
* Use forward slashes "/" for path seperators in <apache2 modules directory>, <axis2 repository path> and <axis2 log file path>

* Make sure that the apache2 user has 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

Hope you would enjoy the Axis2 C soap engine :)
