« 「おひさしぶり、めずらしいですねぇ」 | Main | 続:HND2 »

2004年12月 3日

Apache AXIS C++

[ カテゴリ: Technology ]

今回の実装合宿はWeb Serviceをつくるのが大きな目的です。 言語はC++ということで事前に合意していたのですが、 C++が使えるWeb Serviceってほんっとないんですよね。 みんなJavaばっかり。世の中どうかしてる。

で、調べていくとフリーで利用できそうなC++のWeb Serviceは、 おおよそ次のどちらかで決まりのようです。

前者はあるところで非常に評価がよかったらしく、また商用サービスでも利用されているようです。 一方、はドキュメントが充実していないことと、 WSDLからコードを生成するツール(WSDL2Ws)はJavaを利用している点でいまいちそう。 さらに、上記の評価では最低レベルです。

そんなわけでgSOAPで始めてみたのですが、 WSDLを食わせてみると出力するコードがとってもいまいち。 あと、Serviceの Deployもなんだかちょっとめんどくさそう。 このままコードを書き進めてもなんだか報われない気がしたので、 昨日の夜から評価の悪いのApache AXIS C++をNetBSDに入れるべく格闘していたわけです。 ドキュメントを端から端まで読んでがんばればできそうですが、 ちょっと癖があったりするので導入の仕方をまとめておきます。


まず、サーバのインストールからです。

1) 必要なパッケージのインストール

NetBSDではパッケージシステムとしてpkgsrcがあります。 Apache AXIS C++をインストールするために必要なものは、 すべてpkgsrcでインストールすることが可能です。

Apache
Apache AXIS C++はApacheのモジュールとして動作します。 したがって、www/apacheまたはwww/apache2が必要です。 以下ではwww/apache2を前提としています。
XMLパーサ
SOAPやWSDLのXMLを処理するためにXMLパーサが必要です。 textproc/expatかtextproc/xerces-cのどちらかをインストールします。 両方インストールし、必要に応じて切り替えながら使うこともできます。 pkgsrcでApacheをインストールすると、 依存関係からtextproc/expatがインストールされます。 以下では両方をインストールしていることを前提としています。

2) パッケージの取得と展開

準備ができたら、Apache AXIS C++のパッケージを このあたりから取得して展開します。

$ tar zxvf axis-c-src-linux-current-src.tar.gz
axis-c-src-1-3-linux
axis-c-src-1-3-linux/ChangeLog
axis-c-src-1-3-linux/AUTHORS
axis-c-src-1-3-linux/COPYING
   :
axis-c-src-1-3-linux/vc/xml/xerces
axis-c-src-1-3-linux/vc/xml/xerces/AxisXMLParserXerces.dsp
axis-c-src-1-3-linux/vc/xml/xerces/AxisXMLParserXml4c.dsp
$

ここではaxis-c-src-1-3-linuxというディレクトリができています。

3) 環境変数を設定

以下のふたつの環境変数を設定します。 これをさぼるとうまくいきません! 環境変数でなんとかしようというのが大嫌いな私は、 これでかなりはまりました。

AXISCPP_HOME
2)で作成されたディレクトリへのフルパス
AXISCPP_DEPLOY
Apache AXIS C++をインストールしたいディレクトリ

ここでは前者を/usr/naoto/tmp/axis-c-src-1-3-linux、 後者を/usr/local/axisとします。

$ AXISCPP_HOME=/usr/naoto/tmp/axis-c-src-1-3-linux; export AXISCPP_HOME
$ AXISCPP_DEPLOY=/usr/local/axis; export AXISCPP_DEPLOY
$

4) configureの変更と実行

ここからはやっつけ仕事です。 ちゃんとパッチ作れよという話はもっともなので、 時間ができたらそのうち…

まず、configureに手を入れて実行します。 netbsdでは配布に含まれたままのconfigureは動作しません。 LDFLAGSを以下のように変更します。

LDFLAGS="-L/usr/pkg/lib -R/usr/pkg/lib -lgcc_s -lstdc++ -lm"

おわったらconfigureを実行します。 xerces-cをインストールしていない場合や、 expatを利用しない場合は、 適宜オプションを変更してください。

$ ./configure --prefix=$AXISCPP_DEPLOY \
    --with-apache2=/usr/pkg \
    --with-xercesc=/usr/pkg --with-expat=/usr/pkg
checking for a BSD-compatible install... /usr/bin/install -c
checking whether build environment is sane... yes
  :
config.status: creating config.h
config.status: executing depfiles commands
$

5) Makefileの修正

出力されたMakefileを修正します。 なんのためのconfigureじゃ! って、 ええ、わかってます、そのうち何とかしますから… まず、NetBSDにはlibdlが存在しないので、 すべてのMakefileから取り去ります。 zshを使っている場合は以下のような感じでしょうか。

$ cd $AXISCPP_HOME
$ for i in **/Makefile;do
> sed 's/-ldl//g' < $i > $i-
> mv -f $i- $i
> done
$

Apache AXISの心臓部にあたるライブラリはpthreadを利用しているようですが、 リンクするように指定されていません。 該当するMakefileは、

  • $AXISCPP_HOME/src/engine/client/Makefile
  • $AXISCPP_HOME/src/engine/server/Makefile

のふたつです。 このなかのLDFLAGSを指定している行は、 以下のようになるはずです。

LDFLAGS = -L/usr/pkg/lib -R/usr/pkg/lib -lgcc_s -lstdc++ -lm -lpthread

さらにもうひとつ。 ApacheとAPR(www/apache2の場合だけ)のヘッダファイルは通常と異なる場所にインストールされています。 したがって、これも教えてあげる必要があります。 変更するMakefileは利用しているApacheによって異なります。 www/apache2の場合は、

  • $AXISCPP_HOME/src/server/apache2/Makefile

です。INCLUDESは以下のようになります。

INCLUDES = -I/usr/pkg/include -I../../../include \
	 -I/usr/pkg/include/httpd -I/usr/pkg/include/apr-0

Makefileの変更は以上です。

6) コンパイルとインストール

普通の手順でコンパイル・インストールします。

$ make
  :
# sudo -s
# make install
  :
#

7) Apache AXIS C++の設定

はやる気持ちはさておき、 まずApache AXIS C++の設定をします。 というのも、設定が正しくない場合はことごとくApacheごと落ちるからです。 逆に言えば、Apacheが正常に起動しない場合は設定がおかしいと思って間違いないでしょう。

設定ファイルは$AXISCPP_DELOY/etcにあります。 ここに_linuxがおしりについたファイルがあるので、 これを基に修正していきます。

# cd $AXISXPP_DEPLOY/etc
# for i in *_linux; do
> mv $i ${i%%_linux}
> done
#

サーバ側で修正が必要なのはaxiscpp.confとserver.wsddです。 これらのファイルはインストール先が /usr/local/axiscpp_deploy であることを想定して書かれているので、 インストール先にあわせて修正します。 また、 axiscpp.confのXMLParserには、 利用したいXMLパーサを指定します。 今回はxerces-cを利用するということで、 以下のように設定しました。

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

8) Apacheモジュールのインストール

上記のインストールでは、Apache AXIS C++のApacheモジュールは、 本来インストールされるるべきところにおかれていません。 以下のようにしてインストール(というか、単なるコピー)します。

# cp /usr/local/axis/lib/libaxiscpp_mod2.so \
    /usr/pkg/lib/httpd
#

9) Apacheの設定

Apacheの設定ファイルに以下の行を追加します。

LoadModule axis_module lib/httpd/libaxiscpp_mod2.so

<Location /axis>
  SetHandler axis
</Location>

10) Apacheの起動

Apacheを(再)起動します。 ここで、Apache AXIS C++は環境変数AXISCPP_DEPLOYを参照し、 $AXISCPP_DEPLOY/etc/axiscpp.confを読みにいきます。 OSの起動時に/etc/rc.d/apacheで自動的に起動させる場合には、 どこかで環境変数を設定しておかなければなりません! このダサさをなんとかしたいところですが、 とりあえず/etc/rc.d/apacheの先頭で環境変数を設定することにします(涙

おわったらいつもの要領で、

# /etc/rc.d/apache start
Starting apache.
#

で起動です。 ただしくhttpdがいることを確認してください。

11) 動作確認

まず、サービスが正しくdeployされているかを確認します。 http://localhost/axisにアクセスして、 サービスの一覧が見えたらOKです。

つぎに、baseという試験用のサービスで確認します。

$ /usr/local/axis/bin/base

 Using service at http://localhost/axis/base

invoking echoString...
successful
  :
invoking echoDecimal...
successful
$

ここでも環境変数AXISCPP_DEPLOYが必要なことに注意してください。 ここまででサーバのインストールはおしまいです。


つぎに、SWDLからskeltonを生成するツール、 WSDL2Wsです。

1) 必要なパッケージのインストール

WSDL2WsはJavaで記述されているので、 Javaの実行環境が必要です。

Java(tm) 2 Runtime Environment
Javaの実行環境には、 lang/sun-jre{13,14,15}のみっつのバージョンが用意されています。 どれでも問題ないとは思いますが、以下では1.5.0を利用しています。 なお、linux emulationにはsuse91_linuxをインストールしました。

Javaの実行ファイルはコンパイルされた状態で配布されていますが、 コンパイルするためにはJava(tm) 2 SDKが必要です。 どうせsun-jreもインストールしなければならないので、 ついでにsun-jdkもインストールしておくとよいでしょう。

2) jarファイルのインストール

$AXISCPP_HOME/lib/axisjavaにいくつかのjarファイルがあります。 これらを適当な場所にコピーします。 ここでは$AXISCPP_DEPLOY/javaにコピーします。

# mkdir $AXISCPP_DEPLOY/java
# cp $AXISCPP_HOME/lib/axisjava/* $AXISCPP_DEPLOY/java
#

さらに、$AXISCPP_HOME/lib/axisにwsdl2ws.jarがあるので、 同じようにコピーします。

# cp $AXISCPP_HOME/lib/axis/wsdl2ws.jar \
    $AXISCPP_DEPLOY/java
#

3) 環境変数の設定

環境変数CLASSPATHを設定します。 上記でコピーしたjarファイルのフルパスを":"で接続してください。 このとき、wsdl2ws.jarが最初になるようにする必要があります。

4) WSDL2Wsの実行

これから生成するサービスのWSDLを用意し、 以下のように実行します。

$ sun15-java  org.apache.axis.wsdl.wsdl2ws.WSDL2Ws \
    TEST.wsdl -lc++ -sserver
  :
Code generation completed.
$

これでめでたくskeltonが生成されているはずです。

5) コンパイル

skeltonの中身を埋めたら、コンパイルしましょう。

$ g++ -shared -I$AXISCPP_HOME/include -olibTEST.so *.cpp
$

6) サービスのdeploy

コンパイルでできたライブラリを$AXISCPP_DEPLOY/libにコピーし、 service.wsddに記述を追加してdeployします。 設定が終わったらapacheを再起動する必要があることに注意してください。

Comments

Post a comment




Remember Me?