Apache Axis にさわる

作成 2002/10/11

先日買った本を読んでいるとApache Axisの記事が載ってました。 J2EE1.4(次バージョン)では、Webサービスも仕様に入る らしいし、ちょっと調べとこうかということで、Apache Axisのページを 覗いてみました。トップページを見ると、NEWS (October 7, 2002) : Axis 1.0 is now available! とのこと。これは旬だわ〜、ということでさっそく触ってみました。

Apache Axisとは?

Apache AxisとはJavaで書かれたSOAP実装の一つです (SOAPというのはWebサービスで使われる通信プロトコルです。 XMLで書かれており.NETとJavaでさえ通信可能です。一応)。 Apache SOAP2.xの後継にあたり、Apache SOAPに比べ JAX-RPC、WSDLへの対応など大幅機能追加されています。 ついでに、パーサーがSAXで書き直され、かなり高速になったそうです。 はじめてのWebサービス、とかいう場合に(機能的、名前的に) 比較的安心して使えるツールなのではないかと。。。。思われます。

準備

ここでは、以下の環境で話をすすめます。環境によっては、別途必要なjar(XMLパーサとか)があるかもしれません。

JDK 1.4
Tomcat 4.0.4

http://xml.apache.org/axis/
よりxml-axis-10.zipをダウンロードします。

展開したアーカイブの中のwebapps/axisがWebアプリケーションの 雛形になっています。これをそのままWebアプリケーションとして使います。

axisフォルダを%TOMCAT_HOME%/webapps以下にコピーします。

TOMCATを起動し、ブラウザでhttp://localhost:8080/axisにアクセスします。

メニューからValidateをクリックします。

Validateでは、必要なJARが認識できるかどうかのチェックが行われます。 うちの環境では、 "xmlsec.jarが見つからないのでXML Securityがサポートされません" との警告が出ましたが、必須ではないので、無視して進みました。

また、このページのNoteで、"Tomcat 4.xでは、java.*、javax.*ではじまるクラスのJARはCATALINA_HOME/commons/libに置かなければいけない"と書いてあるので、 jaxrpc.jarはTOMCATのcommon/libの下にコピーしました。

Java Web Serviceを使っての簡単デプロイ

簡単にWebサービスのデプロイを行う方法がこれ。 .javaファイルを拡張子を.jwsに変え、Axis Webアプリケーションの コンテキストルートに置くだけ。 最初にWebサービスのリクエストがあったときに、コンパイルされ、 Webサービスが実行されます。 Webサービス版、JSPみたいなものでしょうか?

Webサービスの作成

最初ということで、Hello.javaを作成します。

public class Hello{
  public String sayHello(){
    System.out.println("call sayHello");
    return "hello!";
  }
}

Webサービスのpublish

作成した.javaをウェブサービスとしてpublishします。

作成したHello.javaの拡張子を.jwsにして、Axis Webアプリケーションのルートにコピーします。

ブラウザを開いて以下のURLへアクセスします。

http://localhost:8080/axis/Hello.jws?wsdl

何かソレっぽいものが出来てますね。

Webサービスの利用

クライアントからHelloウェブサービスを利用します。 WSDLからJavaプロキシコードを生成して、それを利用する方法も あるのですが、それは後にして、ここでは、 チマチマとメソッド名などを指定して実行してみましょう。

クライアントを実行するには、クライアント側で Axisのjarをクラスパスに通す必要があります。 やることは単調なんですが、けっこう間違いやすい作業なので、 くじけずにがんばりましょう。

以下は環境設定のバッチファイルの例です。 展開したアーカイブがC:\apps\xml-axis-10にあるとして、 lib以下のすべてのjarにクラスパスを通します。 なお、後で使う各種ツールの利用にはservlet.jarも必要みたいなので、 ここで追加しておきます。

set AXIS_LIB=C:\apps\xml-axis-10\lib

set CLASSPATH=.
set CLASSPATH=%CLASSPATH%;%AXIS_LIB%\axis.jar
set CLASSPATH=%CLASSPATH%;%AXIS_LIB%\axis-ant.jar
set CLASSPATH=%CLASSPATH%;%AXIS_LIb%\commons-discovery.jar
set CLASSPATH=%CLASSPATH%;%AXIS_LIB%\commons-logging.jar
set CLASSPATH=%CLASSPATH%;%AXIS_LIB%\jaxrpc.jar
set CLASSPATH=%CLASSPATH%;%AXIS_LIB%\log4j-1.2.4.jar
set CLASSPATH=%CLASSPATH%;%AXIS_LIB%\saaj.jar
set CLASSPATH=%CLASSPATH%;%AXIS_LIB%\wsdl4j.jar

set CLASSPATH=%CLASSPATH%;C:\apps\jakarta-tomcat-4.0.4\common\lib\servlet.jar

クライアントコードを作成します。

import org.apache.axis.client.Call;
import org.apache.axis.client.Service;
import javax.xml.namespace.QName;

public class HelloClient {
   public static void main(String [] args) throws Exception{

       String endpoint = "http://localhost:8080/axis/Hello.jws";

       Service  service = new Service();
       Call     call    = (Call) service.createCall();

       call.setTargetEndpointAddress( new java.net.URL(endpoint) );
       call.setOperationName(new QName("http://localhost:8080/", "sayHello"));
       String ret = (String) call.invoke( new Object[0] );

       System.out.println(ret);
   }
}

コンパイルします。 クラスパスが通ってないと、エラーが出ます。

クライアントを実行します。

C:\apps\xml-axis-10\test>java HelloClient
hello!

おおお、hello!って返ってきました。

WSDDを使ってのデプロイ

WSDD(Web Service Deployment Descriptor)ファイルを使ってデプロイ を行います。 JWSを使う方法は簡単ですが、融通がききません。 WSDDファイルを使うことで、デプロイ設定をカスタマイズすることができます。

Webサービスの作成

さっきhelloサービスをやったので、今度はechoサービスを作ります。

public class Echo{
  public String sayEcho(String message){
    System.out.println("called sayEcho : message=" + message);
    return message;
  }
}

コンパイルします。

コンパイルされたEcho.classファイルをAxis Webアプリケーションが認識できる場所 に置きます。例えば、以下にEcho.classをコピーします。

webapps/axis/WEB-INF/classes/

Webサービスのpublish

WSDDファイルを作成します。以下の内容のファイルをdeploy.wsddとして保存します。

<deployment xmlns="http://xml.apache.org/axis/wsdd/"
            xmlns:java="http://xml.apache.org/axis/wsdd/providers/java">

  <service name="echo" provider="java:RPC">
   <parameter name="className" value="Echo"/>
   <parameter name="allowedMethods" value="*"/>
  </service>

</deployment>

デプロイを実行します。 java org.apache.axis.client.AdminClientを使います。 引数は今作ったwsddファイルのパスです。

C:\apps\xml-axis-10\test>java org.apache.axis.client.AdminClient deploy.wsdd
- Processing file deploy.wsdd
- Done processing

ブラウザを開いて以下のURLへアクセスします。

http://localhost:8080/axis/services/echo?wsdl

WSDLが表示されてますね。

Axis WebアプリケーションのメインメニューからViewを選択し、 デプロイ済Webサービス一覧を見ると、echoサービスが登録されていることが、 わかります。

Webサービスの利用

ここではWDSLからjavaプロキシコードを自動生成して、 プロキシコードを利用してクライアントを作成してみましょう。

自動生成には org.apache.axis.wsdl.WSDL2Javaを使います。

C:\apps\xml-axis-10\test>java org.apache.axis.wsdl.WSDL2Java http://localhost:8080/axis/services/echo?wsdl

引数にWSDLのURLを指定して、WSDL2Javaを実行すると、デフォルトで、 localhostパッケージの中に、echoサービスのJavaコードが作成されます。

クライアントコードを作成します。

import localhost.Echo;//Echoとlocalhost.Echoが衝突する場合の対処
import localhost.*;

public class EchoClient{

  public static void main(String[] args) throws Exception{
    EchoService locator = new EchoServiceLocator();
    Echo echo = locator.getecho();
    String s = echo.sayEcho("hoge");
    System.out.println(s);
  }
}
helloサービスのときと異なり、 普通にJavaクラス&インターフェイスを操作できてますね。 helloサービスのときイチイチ書いた内容は、生成されたプロキシ(スタブ) コードに書かれています。

実行します。

C:\apps\xml-axis-10\test>java EchoClient
hoge

実行されました!

ここまでの感想

上記手順では一緒になってしまってますが、 パブリッシャー(Webサービスの作成者)とクライアント(Webサービスの利用者) が行うことを分けて考えると、理解しやすいでしょう。

パブリッシャーが行うのが、Webサービスのクラスを作って、deploy、 publishして、という作業です。

クライアントが行うのは、publishされたWSDLをもとに、 Javaインターフェイスをつくり、 クライアントコードを書き、実行することです。

感想としては、正直ちょっとめんどくさいですね。 パブリッシャーはHelloするだけなのに、WSDLを作ってデプロイしなきゃならん。 JWSの仕組みはめんどくささ低減のための面白い試みだと思います。 でも、他にもWSDL使わないpublish方法、
WebService.export(Hello.class);
とかできてもいいじゃん、とか思いました。

クライアントもAXISのクラスパスを通して、スタブを作って、実行。。。 クライアントに必要なjarがJDKに組み込まれるとクラスパスの設定などは 不要になるかもしれないけど。。。 クライアントコードの作成にインターフェイスが必ず必要なので、 WSDL2Javaははずせないか。。。
import http://localhost:8080/axis/services/hello?wsdl
とか書いて、スタブなんかは動的生成にして頂けると楽なんですが、無理か。

Webサービス補助機能のある便利なIDE使えってことかしら。

参考

Apache Axis

入門J2EEシステム開発

Introduction to Axis(豆蔵)


TOP