Axis C++ Linux Installation Guide

Contents
# Introduction
# What You Need
# Installing Axis C++

Introduction

This guide will help you to start with Axis C++. I'll explain the minimum steps needed to build and run Axis C++, and warn you about the common pitfalls.

What You Need

You need few helper libraries for parsing XML, WSDL processing and introspection. You need to have the following in order to run Axis C++ engine.
      Apache web server (2.0.x or 1.3.x)  - You need to have Apache built with module so support, hence you need to have source of Apache web server.
Axis C++ uses Apache web server to host services.

      Expat (1.95.7) and/or Xerces C++ (2.2.0) XML parser(s)
Axis C++ needs an XML parser to parse SOAP messages and WSDD files. It has a parser abstraction layer that help users select/switch between parsers. However only once parser library could be used at a time. Currently Expat and Xerces parsers are supported by Axis C++.

Installing Axis C++
1. Install Apache web server. In case you already have an Apache installation, make sure that 'so modules' are enabled. This is because Axis C++ server engine is implemented as an 'so module'. (For Apache 1.3.x use --enable-module=so; for Apache 2.0.x use --enable-so when configuring. See Apache web server documentation for more details)

2. Install Expat (1.95.7) and/or Xerces C++ (2.2.0) depending on your parser preferences. See the respective parser's documentation for installation instructions.

3. Download Axis C++ source or binary distribution and extract the package.

4. Define the following environment variables.
AXISCPP_HOME="Path to Axis C++ source or binary extracted folder"
e.g. AXISCPP_HOME="/my/home/axiscpp"

AXISCPP_DEPLOY="Path to folder where you want to install Axis C++"
e.g. AXISCPP_DEPLOY="/usr/local/axiscpp_deploy"

LD_LIBRARY_PATH="<path to parser library you use>/lib:$AXISCPP_DEPLOY/lib:$LD_LIBRARY_PATH"

export AXISCPP_HOME AXISCPP_DEPLOY LD_LIBRARY_PATH

5. Build Axis C++ (If you downloaded Axis C++ binaries, you can skip this step)
cd $AXISCPP_HOME
./configure --prefix=$AXISCPP_DEPLOY --with-apache2=/path/to/Apache2 --with-xercesc=/path/to/xerces-c
make
make install

The above set of instructions assume you have Apache 2.0.x web server and Xerces C++ parser.
For more information on build options run ./configure --help.

The libs created in build process are placed in $AXISCPP_DEPLOY/lib. (Provided that you used $AXISCPP_DEPLOY as --prefix option for configuring). Note that you need permission to install to the specified directory given in prefix option
 
You need global access rights to Axis C++ deploy folder to make sure Axis C++ work properly.
chmod -R 777 $AXISCPP_DEPLOY

6. Configure Apache module
Note: to execute the following steps, you may need to have super user rights on your machine.
Now you need to add to edit httpd.conf file in <path to Apache web server installation>/conf and add the following lines at the bottom of that file (assuming you are using Apache 2.0.x):

LoadModule axis_module modules/libaxiscpp_mod2.so
<Location /axis>
SetHandler axis
</Location>

For Apache1.3.x LoadModule line should read as:
LoadModule axis_module libexec/libaxiscpp_mod.so

7. Configure server deployment descriptor file
Now you need the server deployment descriptor (server.wsdd) to deploy server samples you built.
There is a sample deployment descriptor called server.wsdd_linux in $AXISCPP_DEPLOY/etc to help deploy samples.
If you edit this file to your requirements then when you run step 9 it will be turned into server.wsdd. If you don't use scripts as described in step 9 then just rename server.wsdd_linux into server.wsdd after your changes. server.wsdd file is an XML file, and the contents are self descriptive.

8. Set engine wide settings in configuration file
Axis C++ uses a configuration file to let the user specify preferences such as log file locations, transport and parser libs to be used and location of deployment descriptor files. A sample configuration file named axiscpp.conf_linux is installed in $AXISCPP_DEPLOY/etc folder. Edit this file to your reqirements.When you execute step 9 this file will be turned into axiscpp.conf. If you don't use scripts as described in step 9 then just rename axiscpp.conf_linux into axiscpp.conf after your changes

Configuration file has the following Syntax:
The comment character is '#'
WSDDFilePath: The path to the server wsdd file
ClientWSDDFilePath:The path to the client wsdd
LogPath: The path to the Axis C++ server log
ClientLogPath: The path to the Axis C++ client log
Transport_http: The HTTP transport library
XMLParser: The XML parser library

A sample axiscpp.conf file:

LogPath:/usr/local/axiscpp_deploy/log/AxisLog
WSDDFilePath:/usr/local/axiscpp_deploy/etc/server.wsdd
ClientLogPath:/usr/local/axiscpp_deploy/log/AxisClientLog
XMLParser:/usr/local/axiscpp_deploy/lib/libaxis_xercesc.so
Transport_http:/usr/local/axiscpp_deploy/lib/libaxis2_transport.so

9. deploying in apache

Now we need to copy apache module(libaxiscpp_mod2.so for apache2 and libaxiscpp_mod.so for apache) to the correct places and start apache. To do that you can find scripts written in $AXISCPP_DEPLOY/bin.


cd $AXISCPP_DEPLOY/bin
To deploy on apache2
sh deploy_apache2.sh
To deploy on apache
sh deploy_apache.sh

Note that if you need to use different parser you need to edit the script. For example if you use expat
instead of
cp -f ${AXISCPP_DEPLOY}/lib/libaxis_xercesc.so ${AXISCPP_DEPLOY}/lib/libaxis_xmlparser.so
you need
cp -f ${AXISCPP_DEPLOY}/lib/libaxis_expat.so ${AXISCPP_DEPLOY}/lib/libaxis_xmlparser.so

Basically what is done in the script are,
  1. libaxiscpp_mod2.so is copied to /modules (the corresponding folder in apache is libexec)
  2. libaxis_xercesc.so or libaxis_expat.so (the parser you use) is renamed to libaxis_xmlparser.so.
  3. Restart Apache is restarted
So if you don't use the scripts you need to do the above three steps yourself.

10. See Axis C++ in action
Now the installation is complete. You can verify that the server side is working by accessing the URL http://localhost/axis/ using your web browser. You should get the Axis C++ welcome page and this page will show you a list of deployed services as specified by the $AXISCPP_DEPLOY/conf/server.wsdd file.

Now you can run a client sample and see if it works.
cd $AXISCPP_DEPLOY/bin
./base 

To help you run several samples at once there is a script named run_interoptests.sh in $AXISCPP_DEPLOY/bin folder. You can try running that as well.

