作成 2002/10/11
先日買った本を読んでいるとApache Axisの記事が載ってました。 J2EE1.4(次バージョン)では、Webサービスも仕様に入る らしいし、ちょっと調べとこうかということで、Apache Axisのページを 覗いてみました。トップページを見ると、NEWS (October 7, 2002) : Axis 1.0 is now available! とのこと。これは旬だわ〜、ということでさっそく触ってみました。
ここでは、以下の環境で話をすすめます。環境によっては、別途必要な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の下にコピーしました。
簡単にWebサービスのデプロイを行う方法がこれ。 .javaファイルを拡張子を.jwsに変え、Axis Webアプリケーションの コンテキストルートに置くだけ。 最初にWebサービスのリクエストがあったときに、コンパイルされ、 Webサービスが実行されます。 Webサービス版、JSPみたいなものでしょうか?
最初ということで、Hello.javaを作成します。
public class Hello{ public String sayHello(){ System.out.println("call sayHello"); return "hello!"; } }
作成した.javaをウェブサービスとしてpublishします。
作成したHello.javaの拡張子を.jwsにして、Axis Webアプリケーションのルートにコピーします。
ブラウザを開いて以下のURLへアクセスします。
http://localhost:8080/axis/Hello.jws?wsdl
何かソレっぽいものが出来てますね。
クライアントから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(Web Service Deployment Descriptor)ファイルを使ってデプロイ を行います。 JWSを使う方法は簡単ですが、融通がききません。 WSDDファイルを使うことで、デプロイ設定をカスタマイズすることができます。
さっき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/
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サービスが登録されていることが、 わかります。
ここでは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使えってことかしら。