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 by running the the following command sequence in the 
sub folders 
    1. util
    2. axiom; and then in 
    3. root folder of source extract
in that order. Please see the build.sh files in the sub folders for more
information:
        ./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

You can also build the rampart, xml_schema and woden sub systems if you wish 
to test them.

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 :)
