「JBoss」JAX-WS な Web サービスを作成する

JBoss AS ( わけあってバージョンは 5.1.0.GA ) で JAX-WS な Web サービスを作成してみたのでメモを残しておきます。

Eclipse なりを使ってやってもいいんですが、今回は男らしくコマンドでやります。

0.JBoss なり必要なものをインストールする


今回は以下の環境を対象とします。

[ 環境情報 ]
Windows 7 SP1
JBoss AS 5.1.0.GA ( jdk6 の方 )
Java SE 6 Update 34

JBoss AS のダウンロード先。
JBoss Community - Browse /JBoss/JBoss-5.1.0.GA at SourceForge.net
http://sourceforge.net/projects/jboss/files/JBoss/JBoss-5.1.0.GA/

必要な環境変数を設定しておく。

set JBOSS_HOME=C:\devspace\jboss\jboss-5.1.0.GA-jdk6\jboss-5.1.0.GA
set JAVA_HOME=C:\Program Files\Java\jdk1.6.0_34
set PATH=%JAVA_HOME%\bin;%JBOSS_HOME%\bin;%PATH%

JBoss AS、Java のインストールは先は適宜読み替えてください。


1. サーバ側


1-1. サーバ側アプリケーションの作成


与えられたパラメータを返すだけの簡単なクラスとしました。
■ Echo.java

package echo;

import javax.jws.WebMethod;
import javax.jws.WebService;

@WebService
public class Echo {
  @WebMethod
  public String echo(String param) {
    return param;
  }
}


コンパイルしておきます。

javac -cp . echo\Echo.java


上記 Echo クラスを web.xml に設定します。
■ web.xml

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" id="WebApp_ID" version="2.5">
  <display-name>JBossWSTest</display-name>  
  <servlet>
    <description></description>
    <display-name>Echo</display-name>
    <servlet-name>Echo</servlet-name>
    <servlet-class>echo.Echo</servlet-class>
  </servlet>
  <servlet-mapping>
    <servlet-name>Echo</servlet-name>
    <url-pattern>/Echo</url-pattern>
  </servlet-mapping>
</web-app>


1-2. .war ファイルにパッケージング


アプリケーション名は「JBossWSTest」としました。とりあえず何でもいいんですが JBossWSTest ディレクトリを作成してそこに Echo クラス、web.xml、EchoService.wsdl を配置します。

├─JBossWSTest
│  │
│  └─WEB-INF
│      │  web.xml
│      │
│      ├─classes
│      │  └─echo
│      │          Echo.class
│      │
│      └─lib


(JBossWSTest に移動して ) jar コマンドで .war ファイルにパッケージングします。

jar cvf JBossWSTest.war .
マニフェストが追加されました。
WEB-INF/ を追加中です。(入 = 0) (出 = 0)(0% 格納されました)
WEB-INF/classes/ を追加中です。(入 = 0) (出 = 0)(0% 格納されました)
WEB-INF/classes/echo/ を追加中です。(入 = 0) (出 = 0)(0% 格納されました)
WEB-INF/classes/echo/Echo.class を追加中です。(入 = 376) (出 = 261)(30% 収縮
WEB-INF/lib/ を追加中です。(入 = 0) (出 = 0)(0% 格納されました)
WEB-INF/web.xml を追加中です。(入 = 641) (出 = 288)(55% 収縮されました)


1-3. デプロイ


%JBOSS_HOME%\server\default\deploy に JBossWSTest.war を配置して、run.bat で JBoss AS を起動する。
特に例外とか発生せずに「Started in 20s:286ms」と出て、http://127.0.0.1:8080/JBossWSTest/Echo?wsdlWSDL の内容が見れれば OK かと思います。

念のため WSDL の内容を。

<definitions xmlns="http://schemas.xmlsoap.org/wsdl/" xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/" xmlns:tns="http://echo/" xmlns:xsd="http://www.w3.org/2001/XMLSchema" name="EchoService" targetNamespace="http://echo/">
<types>
<xs:schema xmlns:tns="http://echo/" xmlns:xs="http://www.w3.org/2001/XMLSchema" targetNamespace="http://echo/" version="1.0">
<xs:element name="echo" type="tns:echo"/>
<xs:element name="echoResponse" type="tns:echoResponse"/>
<xs:complexType name="echo">
<xs:sequence>
<xs:element minOccurs="0" name="arg0" type="xs:string"/>
</xs:sequence>
</xs:complexType>
<xs:complexType name="echoResponse">
<xs:sequence>
<xs:element minOccurs="0" name="return" type="xs:string"/>
</xs:sequence>
</xs:complexType>
</xs:schema>
</types>
<message name="Echo_echoResponse">
<part element="tns:echoResponse" name="echoResponse"/>
</message>
<message name="Echo_echo">
<part element="tns:echo" name="echo"/>
</message>
<portType name="Echo">
<operation name="echo" parameterOrder="echo">
<input message="tns:Echo_echo"/>
<output message="tns:Echo_echoResponse"/>
</operation>
</portType>
<binding name="EchoBinding" type="tns:Echo">
<soap:binding style="document" transport="http://schemas.xmlsoap.org/soap/http"/>
<operation name="echo">
<soap:operation soapAction=""/>
<input>
<soap:body use="literal"/>
</input>
<output>
<soap:body use="literal"/>
</output>
</operation>
</binding>
<service name="EchoService">
<port binding="tns:EchoBinding" name="EchoPort">
<soap:address location="http://127.0.0.1:8080/JBossWSTest/Echo"/>
</port>
</service>
</definitions>


2. クライアント側


2-1. wsconsume.bat 使って WSDL ファイルからコードの生成


クライアント側は wsconsume.bat 使って WSDL ファイルからコードの生成します。

C:\Users\atsushi\Desktop\work\java\jbosswsclient>wsconsume.bat -k http://127.0.0.1:8080/JBossEcho?wsdl
parsing WSDL...


generating code...

echo\Echo.java
echo\EchoResponse.java
echo\EchoService.java
echo\Echo_Type.java
echo\ObjectFactory.java
echo\package-info.java

compiling code...


2-2. 生成したコードを使ってクライアントアプリケーションの作成


WSDL から生成したコードを使ってクライアントアプリケーションを作成します。
■ Client.java ( echo\Echo.java とかと同じディレクトリに作成しましょう )

package echo;

public class Client {
	public static void main(String[] args) {
		EchoService es = new EchoService();
		Echo echo = es.getEchoPort();
		System.out.println(echo.echo("HOGE"));
	}
}


コンパイルして、実行してみる。

javac -cp . echo\Client.java
java -cp . echo.Client
HOGE

うまく呼び出せてそうですね。


ちょっと長くなりましたが、以上になります。