■■■■■■■■■■■■■■■■■■■■■■■■■■■■■
                      2009年01月04日

    Java総合講座 - 初心者から達人へのパスポート
                  vol.134

                                セルゲイ・ランダウ
 バックナンバー: http://www.flsi.co.jp/Java_text/
■■■■■■■■■■■■■■■■■■■■■■■■■■■■■


[このメールマガジンは、画面を最大化して見てください。]


========================================================
◆ 01.SOAPのアプリケーション(Webサービス)
========================================================


続いて、

   <target name="wsdl2java" depends="java2wsdl">
     <axis-wsdl2java
      implementationClassName="jp.co.flsi.lecture.soap.WebService1"
      output="${work.dir}"
      serverside="true"
      url="${local.wsdl}" >
     </axis-wsdl2java>
   </target>

の部分を見てみましょう。

このaxis-wsdl2javaというタスクは、vol.127で実行したWSDL2Javaコマンド
(org.apache.axis.wsdl.WSDL2Java)をAntで使用できるようにしたものです。
Antでは、直接コマンドを呼び出して実行することも可能なのですが、このようにAnt専用
のタスクが用意されている場合は、それを使ったほうがビルド・ファイルの記述が容易
になります。

ただし、ここでaxis-wsdl2javaタスクを実行するのは、vol.127とは目的が違います。
ここでは、クライアントのプログラムに使用するファイルを出力するのが目的では
なく、WSDDファイルを生成させることが目的です。言わば、サーバー・サイド用のファイ
ルを出力することが目的なので、serverside="true"という属性を指定します。

あと、output属性には、出力するファイルを書き出すディレクトリーを指定し、
url属性には、WSDLファイルのURLを指定します。ここでは、WSDLファイルは、その前の
ターゲット("java2wsdl"ターゲット)で生成されたものを使いますので、そのファイル名
を指定すれば済みます。(ちなみにWSDLファイルもXMLで書かれたファイルです。)

<target>タグのdepends属性に"java2wsdl"が指定されていることにも注目しましょう。
この"wsdl2java"ターゲットを実行するためには、その前に"java2wsdl"ターゲットを実行
してWSDLファイルを生成しておく必要があるので、このように指定しておきます。

implementationClassName属性にはWebサービスを実装しているクラスの名前を指定します
が、標準の名前を使っている場合にはこの属性は不要です。(標準の名前については後で
説明します。)



続いて、

   <target name="deploy" depends="wsdl2java">
     <axis-admin port="8080" hostname="localhost" failonerror="true"
      servletpath="${axisservlet}" debug="true" xmlfile="${wsdd.deployfile}" />
   </target>

の部分を見てみましょう。

このaxis-adminというタスクは、vol.127で実行したAdminClientコマンド
(org.apache.axis.client.AdminClient)をAntで使用できるようにしたものです。
vol.127のときと同様に、WSDDファイルを指定することによってAxisのデプロイを行う
ことができます。(ちなみにWSDDファイルもXMLで書かれたファイルです。)

ここで、axis-adminタスクでは、Axisによって提供されている管理作業用のサーブレット
(org.apache.axis.util.Admin)を使用して作業を行うのですが、そのサーブレットを呼び
出すためのURLとして、ホスト名(原則として同一のコンピューター内でデプロイを行うので
localhostでよい)をhostname属性に指定し、URLのパス部分(axis/services/AdminService
を指定すればよい)をservletpath属性に指定します。また、URLのポート番号(通常は8080)
の部分はport属性に指定します。(通常、これらは上記のサンプル通りに指定すればよい。)

そして、xmlfile属性にはWSDDファイルのファイル名(パス名)を指定するのですが、この
WSDDファイルは、<target>タグのdepends属性で前提として指定している"wsdl2java"ターゲ
ットで生成していますね。
このとき、このWSDDファイルはJavaのソース・ファイルと同じ場所にdeploy.wsddという
ファイル名で書き出されることになっています。
したがって、これらのソース・ファイルのパッケージ名を表すフォルダー(カレント・ディ
レクトリー配下のjp/co/flsi/webserviceフォルダー)の中にdeploy.wsddというファイル名
で書き出されますので、ファイル名(パス名)は"./jp/co/flsi/webservice/deploy.wsdd"
と指定すればいいのですが、当サンプルではwsdd.deployfileというプロパティーを通して
指定してあります。
そこで、build.propertiesファイルの中を見ると、このプロパティーは、いったんwsdd.dir
というプロパティーでフォルダーの部分を設定しておいてから、wsdd.dirとファイル名
(deploy.wsdd)を組み合わせてwsdd.deployfileプロパティーを設定していることがわかり
ますね。
これは、このフォルダーの部分が2箇所以上使われる(あとでwsdd.undeployfileでも使われ
る)ことがわかっているために1つのプロパティーにまとめておいたものです。
このように同じものを複数の場所で使うときは、なるべく1つのプロパティーにまとめて
おきます。(後の変更・管理を容易にするためです。)

その他、failonerror="true"という属性の指定は、このタスクでエラーが発生したときに
Antの実行を失敗(中止)させることを意味し、debug="true"という属性の指定は、デバッ
グ情報をログ出力させることを意味します。通常は、この設定にしておきます。


さて、この"deploy"ターゲットは、<project>タグのdefault属性に指定してあります
から、ターゲット名を指定せずにAntを実行した場合には、自動的にこのターゲットが
指名されることになります。

ところが、この"deploy"ターゲットでは、"wsdl2java"ターゲットをdepends属性に指定し
ており、"wsdl2java"ターゲットでは、"java2wsdl"ターゲットをdepends属性に指定し
ており、"java2wsdl"ターゲットでは、"jar"ターゲットをdepends属性に指定しており、
"jar"ターゲットでは、"copy2work"ターゲットをdepends属性に指定していますから、
結局のところ、"copy2work"ターゲット→"jar"ターゲット→"java2wsdl"ターゲット
→"wsdl2java"ターゲット→"deploy"ターゲットの順にターゲットが実行されること
になります。このようにしてソフトウエアの構築作業の手順が自動制御されます。



ところで、"wsdl2java"ターゲットでWSDDファイルを生成するときに、deploy.wsddという
WSDDファイルのほかにundeploy.wsddというWSDDファイルも同時に生成されます。

このundeploy.wsddは、文字通り、アンデプロイ(undeploy)をするためのWSDDファイルで、
アンデプロイというのはAxisへデプロイ済みのWebサービスを解除する(Axisからデプロイ
に関する情報を削除する)ためのものです。
Webサービスを廃止したときや、Webサービスに変更があるためにいったんデプロイを解除
しておきたいときなどに使用します。

このアンデプロイを実行するためのターゲットとして用意しておいたのが、最後の"undeploy"
というターゲットです。

   <target name="undeploy">
     <axis-admin port="8080" hostname="localhost" failonerror="true"
      servletpath="${axisservlet}" debug="true" xmlfile="${wsdd.undeployfile}" />
   </target>

これは先ほどの"deploy"ターゲットとはWSDDファイルが違うだけで、タスクは同じaxis-admin
ですね。
ただし、この<target>にはdepends属性が指定されていませんから、このターゲットを実行
する際には前提のターゲットは無く、単独で実行されることになります。

このターゲットを実行したいときは、コマンド・プロンプトでAntを実行するときに
下記のようなコマンドを入力します。

ant -f build_deploy.xml undeploy

このように、特定のターゲット名を引数に指定すると、そのターゲットが実行されます。

ただし、ターゲット名を引数に指定した場合でも、もしそのターゲットにdepends属性が
指定されていると、depends属性に指定されたターゲットが事前に実行されることになり
ます。


実際に、このアンデプロイを実行してみてください。(事前にTomcatを起動しておくこと
をお忘れなく(Axisの起動のため)。)
その後で、いつものように、クライアントのプログラム(WebService1Client)を実行して
みてください。(WebService1のデプロイ情報が解除されているために)エラーになること
がわかりますね。

なお、このようにAxisのアンデプロイを行っても、Axisのlibディレクトリーに入れておい
たJARファイルは削除されずに、そのまま残ったままであることも確認しておいてください。
Axisのデプロイやアンデプロイは、デプロイに関する情報だけを変更し、Webサービスを実装
しているJARファイルやクラス・ファイル自体には何もしません。
したがって、不要になったJARファイルやクラス・ファイルを削除したいときは、自分で削除
するか、あるいはAntに削除のタスクを組み込んでおく必要があります。(Antにはdeleteと
いう削除のタスクがあります。)

Antのタスクの詳細については、Antのマニュアル

http://www.jajakarta.org/ant/ant-1.5/docs/ant-1.5/j/docs/manual/index.html

から、「Antのタスク」を選んで調べてください。
あるいは、Antのインストール時に展開したフォルダーのうちdocsフォルダーの中にもマニュ
アルが入っています。




さて、これまでは、簡単な例を用いて、Webサービスの開発手順を説明してきましたが、今度
は、実用的なアプリケーションの開発に近い例を用いて説明していくことにしましょう。

実は、実用的な開発の場面で使う手順は、もう少し違ったものになります。
というのは、サーバー側とクライアント側が並行して開発に取り組めるように、先にインター
フェース(Webサービスの呼び出し方)を決めておいてから、あとはお互いが同時に開発を
進められるようにしておくのが普通だからです。
また、これまでに使った例では、Webサービスの引数や戻り値が極めて単純でしたが、実用的
なアプリケーションでは、これらがかなり複雑になっている場合が多いので、そこらへんの
扱い方についても、これから実用的なレベルに似せたアプリケーション例を使って説明して
いきたいと思います。

お楽しみに。



(次回に続く)


では、今日はここまでにします。

何か、わからないところがありましたら、下記のWebページまで質問を
お寄せください。



┏━━━━━━━━━━━━━━━━━━━━━━━━━━━┓
★ホームページ:
      http://www.flsi.co.jp/Java_text/
★このメールマガジンは
     「まぐまぐ(http://www.mag2.com)」
 を利用して発行しています。
★バックナンバーは
      http://www.flsi.co.jp/Java_text/
 にあります。
★このメールマガジンの登録/解除は下記Webページでできます。
      http://www.mag2.com/m/0000193915.html
★このメールマガジンへの質問は下記Webページにて受け付けて
 います。わからない所がありましたら、どしどしと質問をお寄
 せください。
      http://www.flsi.co.jp/Java_text/
┗━━━━━━━━━━━━━━━━━━━━━━━━━━━┛

Copyright (C) 2009 Future Lifestyle Inc. 不許無断複製