« 「おひさしぶり、めずらしいですねぇ」 | Main | 続:HND2 »
2004年12月 3日
Apache AXIS C++
今回の実装合宿は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を再起動する必要があることに注意してください。