Axis

最終更新日時:2007-03-01 17:53:33
その他のめも

Axis は Apache プロジェクトが作成した Java で書かれた SOAP 実装の一つです。
Apache SOAP という、その名の通り Apache プロジェクトが作成した SOAP 実装がありますが、これの後継にあたります。
SOAP とは Web サービスで使用するプロトコルであり、Web サービスとは・・・と書いていくと大変なので言葉の定義は調べてください(/o\)

インストール


Axis はサーブレットとして動くので、サーブレットエンジンが必要です。
当然 J2SDK も必要となります。
以降、j2sdk-1.4.1_01, tomcat-4.1.12, axis-1.0 の環境の例です。

J2SDK, Tomcat は既にインストール・設定済みとします。

まず、WebServices - Axisよりアーカイブをダウンロードし、展開します。
展開後の webapps/axis 以下がそのまま Web アプリケーションとなっているので、これを Tomcat をインストールしたディレクトリの下に持っていきます。
また、Tomcat の仕様で java.* や javax.* なパッケージは webapps からは読み込まれないので、saaj.jar, jaxrpc.jar は $TOMCAT_HOME/common/lib に置きます。(他にもあったかも)

 % gzip -dc xml-axis-10.tar.gz |tar xvf -
 % mv xml-axis-10 /usr/local
 % cd /usr/local/tomcat/webapps
 % ln -s /usr/local/xml-axis-10/webapps/axis
 % cd axis/WEB-INF/lib
 % cp saaj.jar jaxrpc.jar /usr/local/tomcat/common/lib


Tomcat を起動し、http://localhost:8080/axis/ をブラウザで見てみます。
エラーも無く表示されたら、Validate をクリックします。
Validateでは、必要な JAR のチェックが行われ、認識できないものはエラーが出力されます。
例えば、私の場合は activation.jar が見つからないと言われたので、jaf-1.0.2 をダウンロードし、activation.jar に追加しました。
こうやって足りないものを追加し、エラーが出なくなればOKです。

CLASSPATHの設定


まず、Axis を使用する際には CLASSPATH を適切に設定しておく必要があります。
CLASSPATH は、axis/lib 以下の jar ファイル全てと XML パーサとなる jar ファイル(xerces.jar とか)を設定しておく必要があります。
※ドキュメントには書かれていないみたいだけど、何故か servelt.jar も CLASSPATH に含めておかないとエラーが発生。
1つ1つ真面目に jar ファイルを羅列してもいいのですが、私は以下のようなスクリプト(set_classpath.sh)を作りました。

 #!/bin/sh
 
 AXISLIB=/usr/local/axis/lib
 for i in `ls $AXISLIB/*.jar`
 do
 CLASSPATH="$CLASSPATH:$i"
 done
 CLASSPATH="$CLASSPATH:/usr/local/tomcat/common/lib/servlet.jar"
 
 echo $CLASSPATH


これを使って

 % setenv CLASSPATH `set_classpath.sh` 


として CLASSPATH を設定しています。

以下、Axis を使用して Web サービスを公開する側をサーバ側、Web サービスを呼び出して独自のサービスを行う側をクライアント側とします。

サンプルを動かしてみる


Axis に付属してくるサンプル $AXIS_HOME/samples/userguide/example3 を動かしてみます。
まず、サーバ側から。
Axis を使用して Web サービスを行うには、デプロイ (deploy:配置) という作業が発生します。
これは Java のクラスファイルを Axis が認識可能な場所に置いて Axis に通知し、サービスを有効にさせるという作業です。
まず普通にコンパイルして出来た class ファイルを $TOMCAT_HOME/webapps/axis/WEB-INF/classes/samples/userguide/example3に置きます。(これは最初に既に置いてあるのでやらなくてもOKですが)
次に以下のコマンドで Axis にサービスを有効にさせます。

 % java org.apache.axis.client.AdminClient $AXIS_HOME/samples/userguide/example3/deploy.wsdd


以下のように表示されれば成功です。

 <Admin>Done processing</Admin>


デプロイは以上です。
これだけで Web サービスとして使用することができます。
ちなみに、以下のコマンドで現在 Web サービスとして有効になっているものを表示することが出来ます。

 % java org.apache.axis.client.AdminClient list


次にクライアント側。
これは簡単。
単純にコンパイルして実行すればOK・・・のはずなんですが、何故かエラーが出て動かない。
endpointURL に明示的にアドレスを入れないとダメっぽい。。。。
例えば、

 endpointURL="http://localhost:8080/axis/services/MyService"


のような感じです。
ちなみに、axis/services/... といったパスにすると、Axis を使用するサーブレットだと自動的に判断されます。
この example3 の例だと、

 java samples.userguide.example3.Client こんにちは 


を実行すると、「You typed : こんにちは」が表示されます。

Java Web Service


実は上記のサンプルの方法よりももっと簡単にデプロイする方法があります。
それが Java Web Service と呼ばれるもので、.java なファイルを .jws と拡張子を変更して、Axis が認識できるディレクトリに置くだけです。雰囲気としては Web サービス版 JSP という感じですね。
実際にちゃんと有効になっているかどうかを調べてみるには、例えば http://localhost:8080/axis/Hello.jws?wsdl のような感じでブラウザでチェックすればOKでしょう。
ただし、JWS はとても簡単なんですが、応用が利かない(らしい)です。

Java クラスから WSDL ファイルを作成


Axis では、Java のクラスファイルから WSDL を作成することが出来ます。

 % java org.apache.axis.wsdl.Java2WSDL -o Test.wsdl -l http://localhost:8080/axis/services/Test \
  -n "koumei2.net" Test 


Test.wsdl が出力する WSDL ファイル、-l の後の URL は Web サービスの場所、-n の後の文字列はWSDL のターゲットの名前空間、最後の Test はクラス名(Test.class がカレントディレクトリに存在する)です。
エラーが無ければ、カレントディレクトリに Test.wsdl が作成されているはずです。

WSDL から Java コードを作成


上記で作成した WSDL ファイルから Java のコード(一般的にスタブと呼ばれる?)を作成することができます。
WSDL ファイルはローカルにある必要はなく、http で入手可能な場所にあればOKです。

 % java org.apache.axis.wsdl.WSDL2Java http://koumei2.net:8080/axis/services/Test.wsdl 


上記を実行すると、ターゲットとなった WSDL の名前空間のようにディレクトリが作成され、Java コードが作成されます。
この Java コードを使用して Web サービスにアクセスするコードは以下のようなコードになります。

 import net.koumei2.*;
 
 public class TestClient {
    public static void main(String[] args) throws Exception {
        TestService l = new TestServiceLocator();
        Test t = l.getTest();
        String s = t.print_Test();
        System.out.println(s);
    }
 }


ちなみに、「Test」は Web サービスのクラス名、「print_Test」は Test のメソッド名です。
このように、自力で Web サービスにアクセスするようなクライアントのコードを書くよりも、WSDL からスタブを作成し、それを利用してクライアントのコードを書く方がかなり楽になります。

お問い合わせは 掲示板 にて。