目次へ

Download NetBeans!使ってみる?

バフンウニ1.4

J2EE1.4がついに出た。と言っても他に勉強しなければならないことが山のようにあって、特に待ってたわけじゃないんだけどサ。出たっちゅーなら、使ってみねえわけには行かねえべさ。ということで使ってみましたJ2EE1.4のSDK。積み上げ方式ですので、新しいトピックほど上のほうにあります。

/新たな穴発見/NB3.6と、蟻と友達に!/クライアントのビルドと実行/あなたはハマっていませんか!?/お久しぶりのDeploytool/JAX-RPCでWebサービス/ソース作成はもちろんアレで!/勉強の指針/俺ドメインを作る/速きゃええんじゃ!/


新たな穴発見

実は、この試みで、一時はダメかと思ったことがあった。
それは、クライアントをコンパイルしたときに、呼び出せるはずのメソッドが、そんなものはありません、と言われたのだ。
今回はHelloからHeyにコンセプトを変えた。HelloのときのメソッドはsayHelloだったが、sayHeyとは言わないだろう普通英語では。ということでメソッド名をHeyにした。これでハマったのだ。

HeyIF hey=(HeyIF)stub;
System.out.println(hey.Hey("Noniko"));

メソッドHeyがねえだと?それはHeyIFに受け継がれているはずだよな!いねえのか!?と「エクスプローラ」ウィンドウをつついてみた。こんなふうに!

ギャ。小文字になってる!サービスを作るほうでは、確かに大文字で定義したのに!
じゃあ・・・おそるおそるクライアントのコードを、

System.out.println(hey.hey("Noniko"));

に、書き換えてみた。すると、コンパイルはうまくいった。じゃあサービスはこのままで呼べるのか?・・・なぜか、呼べた。Hey Noniko!と出た。

 知ってた?サービスのメソッドは、大文字で始まっちゃいけないきまりがあるのかな?それともこれはアレ?パスワードを間違うと「ログインできません正しいパスワードかどうか確かめてもう一度入力してくださいパスワードでは大文字と小文字が区別されます」とえらそーにダラダラとたれやがるくせにファイル名は大文字と小文字の区別ができねえクソ窓野郎だけの問題?

ともかく、メソッド名は小文字で始めたほうが無難なよーだ。みなさまもお気をつけあそばせ。

2004年02月06日

ページ先頭に戻る


NB3.6と、蟻と友達に!

そうこうしているうちに、NetBeansの3.6が出たジョ。きのうダウンロードしてみた。インターフェイスがなんかえらい玄人っぽくなった。そして、今までずっと目をそらしていたもののアイコンがえらく鮮明に目についてくる。

それはAntのアイコンだ。

 蟻は勉強にならない。そうきのうこぼしていたが、もちろんそれは借りてきた蟻の話だ。ゴ〜マンにならないようにきちんと言うと、借りてきた蟻をそのまま放つだけなら、ということだ。
 借りてきた蟻などをよく検討して、マイ蟻を育て上げれば、そりゃ勉強になるわラクになるわで、さぞやウハウハでござろう。

 わたしがこれをやりながら考えていたのは、wscompileのようなコマンドはasantでbuild.xmlで動いているのだ、とすればNBの「Antプロジェクト」でそのようなものを作って動かしてやれば、コマンドラインから改めて打ち直す必要はないではないか、ということである。
 というわけで、きのうやったサンプルのお手本ビルドファイルを見てみる。すると、はは〜ん。こういうふうにやればできるのね・・・

よし、やってみよう。ホントにできてるかどうかを試すために、サービスを新しく作り直そう。といってもここで凝る必要はないんで、HelloをHeyに変えただけのHeyIF.javaとHeyImpl.javaを新しく作り直した。パッケージ名もheyserviceとかなんかそういう感じ全部。そうして、「新規作成」で「サンプルAntプロジェクト」にするっていうかしなくても「空白Antプロジェクト」でも何でもいい。どうせガーと消して空白にすんだから。とにかくntwscompile.xmlという名前でこんなファイルを作った。

<?xml version="1.0" encoding="UTF-8"?>
<project basedir="." default="all" name="antwscompile">
<target name="wscompile-wsdl"
description="Runs wscompile to generate the WSDL file and mapping file">
<exec executable="c:/Sun/AppServer/bin/wscompile.bat">
<arg line="-define -mapping mapping.xml -classpath . config-interface.xml"/>
</exec>
</target>

</project>

そう。実行ファイルの呼び出しは

<exec executable="Windowsでも/で区切っていいヨファイルパス">
<arg line="引数ズラズラ"/></exec>

だったのだ。もう、これはアレだ。パラメータですっきりまとめるとか一切してない、パスもコマンドラインもチョク書きである。いいんだこれで!動きゃええんじゃ!

そして見よ、NB3.6のカッチョエエインターフェイスを!日食野郎がかすんで見えるぜ!見えない?

ゴメーヌ。もういろんなファイルできちまったあとのショットです。antwscompile.xmlという名前で、場所はまあマウントしたファイルのルートだ。きのうとファイル構造が変わっているのも統一性がなくてすみません。
で、antwscompile.xmlのアイコンをチクとやると、ターゲットwscompile-wsdlが出てくるのヨ。かっけー。
とにかく、実行にはantwscompile.xmlを右クリックして、「Run Target」を選ぶとサブメニューに「wscompile-wsdl」が出てくるからそれを選ぶ。やってないけどwscompil-wsdlのアイコンを右クリックして「Execute」選んでもいいかも知れない。

すると、おもろいことが起こる。実は最初に、非常にのに子らしく、antwscompile.xmlにチョクで書いたコマンドラインを間違えた。そしたらエラーメッセージが出るが、そのあとにBUILD SUCCESSFULLと出る。そう。antwscompile.xmlの仕事は、コマンドラインを入力するところまでだ。それが正しかろうがまちがってようが、ヤツにとってはどうでもよいことなのだ。おもろいっていうか、本当はこんないい加減なビルドファイルではなく、ちゃんとコマンドの実行がなされたかどうかも確認するようなものを書かなければお客様にお出しすることは到底できないだろうという教訓だ。

でも、ちゃんと引数とか間違えずに書けば、ちゃんとWSDLファイルもmapping.xmlもできるのだ!やったッ!これでもうあの、わたしがここで騒ぐこともないほどのコマンド プロンプトを使わなくていいぜ!蟻!やるぢゃねえか!今まで避けてて、悪かったな!

これをDeploytoolでデプロってしまう。なんだっけHeyImplのEndpointのSun Specificなアレもちゃんと設定する。

じゃあクライアントは?同じように、antwscompile-client.xmlを作る。
そのまえにひとつ。Webサービスのクライアントというのは、サービスプロバイダからWDSLをもらってきて作るんだったよな。とすれば、もらってしまおう。serviceディレクトリのHeyService.wsdlをclientディレクトリにコピーする。そうすればconfig-wsdl.xmlの内容は、

<?xml version="1.0" encoding="UTF-8"?>
<configuration xmlns="http://java.sun.com/xml/ns/jax-rpc/ri/config">
<wsdl location="HeyService.wsdl" packageName="heyclient" />
</configuration>

と、パスの指定がより簡単になる。そして、antwscompile-client.xmlだ。

<?xml version="1.0" encoding="UTF-8"?>
<project basedir="." default="all" name="antwscompile-client">
<target name="wscompile-client"
description="Runs wscompile to generate client">
<exec executable="c:/Sun/AppServer/bin/wscompile.bat">
<arg line="-gen:client -classpath . config-wsdl.xml"/>
</exec>
</target>

</project>

もうこれもチョクガキだッ!そうしてターゲット実行!すると、HeyIFとか、スブタやなんやがみんなできる!そしたら、あとはHeyClient.java をコンパイルして実行するだけだ。ちゃんとできたゾ!

よし。よーやくNBの中で蟻を使えるようになれた。もうSun ONE Studioがなくても、こわくないゾッ!もっともJ2EE1.4対応版でたら、もちろんおためさせていただきますけれども。

2004年02月06日

ページ先頭に戻る


クライアントのビルドと実行

さて、クライアントの作成である。「Creating Web Service Clients with JAX-RPC」の「Static Stub Client Example」に載っているサンプルコードの通りのものを作る。ただし名前つかパッケージは「helloclient.HelloClient.java」に変更した。
作業ディレクトリを作る。C:\noni5data\tempworking\helloservice\clientを作って、それをNB上でマウント。
パッケージhelloclientを作成して、その下でHelloClient.javaを編集。
これはNBからはコンパイルできない。まず、またもwscompileで、必要なスタブだポートタイプだちうクラスを作らなければならないのだ。
まず、C:\noni5data\tempworking\helloservice\client\config-wsdl.xmlというファイルを作る。内容は、

<?xml version="1.0" encoding="UTF-8"?>
<configuration xmlns="http://java.sun.com/xml/ns/jax-rpc/ri/config">
<wsdl location="../service/MyHelloService.wsdl" packageName="helloclient" />
</configuration>

だ。わたしの場合ネ。特にwsdl locationとpackageNameが、チュートリアルと違っている。そして、コマンドはC:\noni5data\tempworking\helloservice\client上で行う。

wscompile -gen:client -classpath ..\service config-wsdl.xml

serviceディレクトリにあるHelloIFとかのクラスが欲しいわけだ。しばしの沈黙のあと、何事もなかったようにプロンプタが出る。だが、「helloclient」ディレクトリを見ると、たくさんファイルができている。ではNBにマウントしたこのファイルシステムについて「フォルダを再表示」してみよう。

この状態で、さっき作ったHelloClient.javaは晴れてコンパイルできる。

そしたらだ。こっからが「NBでよかった」と思えるところだ。この「HelloClient.java」を選択しておいて、「構築」->「引数を指定」をやる。そして、引数に

http://localhost:1110/helloservice/hello

と入れてやるのだ。で、右クリック実行!

オラアーッ。package-clientもappclientもいらねえゼッ!HelloとNonikoの間に空白ねえじゃんとか言わないでッ!このようにして初めてJ2EE1.4SDKでアプリケーションを作ってみました〜。でもSunのJAX-RPCむづけーよやっぱり!Axisのほうが簡単だヨ!

2004年02月05日

ページ先頭に戻る


あなたはハマっていませんか!?

 これはチュートリアルにちゃんと書いてあることではある。だが、わりとサラリと書いてあるのだ。mustかなんかがイタリックで書いてあったかも知れない。だがそんなでは足らない。32ptヘルベボールド影付き袋文字ぐらいに強調して、さらに「ここの修正をお粉罠カッた場合には恐ろしい結果が待ち受けています」とか十分警告して欲しかったところである。おかげで見落として、クライアント実行の際に以下のエラーを得た。

Missing Port Information

Webで検索したけど、フォーラムで泣き入れてる外人がひとりだけ、それもWSDPのだった。ヤツが解決したかどうかは、わからない。今のわたしのトラブルに関係あるかどうかも、わからない。だがわたしの原因はこれだった。

いつも、このくらいの大きさの画像は75%くらいに縮小して出すのだが、これは100%で出さないわけにはいくまい。書いてあるんだホ、チュートリアルには。「HelloImpl」を選択して「Endpoint」タブをつついてSun-specificなEndpoint Addressの欄がHelloIFとかなってるからhelloに直せ(ぞれ以前の設定により、コンボで選択できるようになっている)と。でも、結構見落とすと思うヨ。「見落としてた」ってヒト、メールください。「これだけ見落とすヒトがいるのよ、もっとハッキリ書いてよ」とスコットにねじこむから。うそぴょーん。

で、デプロイする。

ページ先頭に戻る


お久しぶりのDeploytool

さて、こうしてビルドされたサービスをデプロイするんだヨ。昔のスタート画面はなんかしろーとくさくて可愛かったんだけど、今はSun Java Systemだっけ、統一され洗練された画面になっちゃってる。でも立ち上がったインターフェイスは昔とあんまり変わらなくてなつかしいぞ。

まずは、俺ドメインのサーバを追加するんだヨ。「File」->「Add Server」を選ぶ。ダイアログボックスが出てきて、「Server Name」と「Server Port」をきかれるから、それぞれ「localhost」,「8782」と入れる。「Target Server」というチェックボックスにちぇーっくを入れると、これがデプロイ先サーバになってくれる。このターゲットはあとからサーバのアイコンを選択しておいて「File」->「Set current target server 」を選べば、変更可能だ。

ポート8782のほうがターゲットになっている。

で、チュートリアルに従いながら、Web Service EndpointとなるWebモジュールを作成していく。元のディレクトリ構成が違うけれど、あまり問題はない。というのは、たぶんこれは今のDeploytoolが感激的に賢くなっているんだと思う。元のディレクトリ構成に関係なく、クラスファイルとかWSDLファイルとかを自動判別して、モジュールの適当な階層のところへ吸収してくれるのだ。
そこで「Edit」で元のファイルを追加するときは、

C:\noni5data\tempworking\helloservice\service\helloserviceディレクトリ
C:\noni5data\tempworking\helloservice\service\mapping.xml
C:\noni5data\tempworking\helloservice\service\MyHelloService.wsdl

と、順々に追加していってやるだけでよい。

ページ先頭に戻る


JAX-RPCでWebサービス

「J2EE Tutorial」の、「Building Web Services with JAX-RPC」に沿ってやってみる。
まず、サービスを作成する。該当箇所は「Creating a Web Service with JAX-RPC」。
C:\noni5data\tempworking\helloserviceというディレクトリを作った。ちと長いのだが、なにせこわごわ試しているのでこんなふうになっている。さらに

C:\noni5data\tempworking\helloservice\service

と作って、これをNetBeans上に、ファイルシステムとしてマウントする。
パッケージ「helloservice」を作る。
そうして、チュートリアルの「Coding the Service Endpoint Interface」の通りに、

helloService.HelloIF
helloService.HelloImpl

の二つを作った。NetBeans上でこれらをコンパイルする。

 さて、問題の「Building the Service」である。前述の通り、チュートリアルにはAntを使わない場合のコマンドが書いてある。「wscompile」というApplication Server配下の実行コマンドで、その目的はconfig-interface.xml という設定ファイルの情報から、ご存じWSDLファイルとmapping.xml というファイルを作ることのように書いてある。

c:\noni5data\tempworking\helloservice\serviceconfig-interface.xmlというのを自分で作る。わたくしの環境ではこのようにした。

<?xml version="1.0" encoding="UTF-8"?>
<configuration xmlns="http://java.sun.com/xml/ns/jax-rpc/ri/config">
<service
name="MyHelloService"
targetNamespace="urn:Hello"
typeNamespace="urn:Hello"
packageName="helloservice">
<interface name="helloservice.HelloIF"/>
</service>
</configuration>

名前空間はチュートリアルではurn:Fooとなっているが、まあなんとなくurn:Helloにした。あとは同じである。

Antを使うと、コンパイルしたクラスファイルはbuildとかdistとかのディレクトリに置かれる。けどNetBeansの場合、これは結構批判をくらっているのではないかという気がするのだが、わたしはもう慣れてしまった。つまりソースファイルとクラスファイルは同じフォルダに同居するのがNBのやりかたなのだ。もしかするとカスタマイズできるのかも知れないが、とにかくデフォルトはそうだ。だから「build」ディレクトリに置いたりするとNB上では「helloservice.build」パッケージだと解釈されてしまう。

そこで、サービスをビルドするためのコマンド「wscompile」を実行する。これはさすがに、NetBeansからは実行できない。モジュールとか作ってやりゃあいんだろなー。日食野郎とかでそういうプラグイン作ったことあるしなー。でもまだ勉強してないのヨ〜。で、あの使えねえ「コマンド プロンプト」から実行することになる。
C:\noni5data\tempworking\helloservice\serviceを作業ディレクトリとして、

wscompile -define -mapping mapping.xml -classpath . config-interface.xml

そう。チュートリアルより簡単な構造になる。mapping.xmlもMyHelloService.wsdlファイルもここにできるし、クラスパスもここ。

さて、そのMyHelloService.wsdlなんだが、開けてみると最後のほうがなんかヘンだ。

<soap:address location="REPLACE_WITH_ACTUAL_URL"/></port></service></definitions>

チュートリアルにはナニも書いてないけど、この"REPLACE_WITH_ACTUAL_URL"はやはりアクチュアルURLにリプレースしたほーがいーんだろなー。Antの中でこういうこともやってるのかなー。
http://localhost:1110/helloservice/hello(というURLに決めたのヨ)にリプレース。

ページ先頭に戻る


ソース作成はもちろんアレで!

 J2EE1.3をやったときは、かなり統合開発環境のテキストエディタPeggyを使った。あの頃は(ハ:和田アキ子)書式を覚えるためにも、おんなじよーなHomeだExceptionだgetNameだejbCreateだを何度も何度も打ったものだ。近頃はさすがにコード補完してもらいたい。ぜひ。というわけで、マイフェイバリットIDE, NetBeansにお出まし願うことにした。
新規プロジェクトとして、「プロジェクト"J2EE1.4"」というのを作成した。そして、ここにApplication Serverのインストールディレクトリから、アーカイブをガシガシマウントしてやる。

C:\Sun\AppServer\lib の中身のうち、「appserv-ナントカ.jar」でないヤツ全部
C:\Sun\AppServer\lib\endorsed の中身全部(いろいろやってるうちに、コンパイラに足んねーと言われた)

を、とりあえず。以後も、コンパイラに足りねえと言われたら、そのつどマウントしていくことにする。

ページ先頭に戻る


勉強の指針

 さてどうやって勉強するのか。やはりチュートリアルは必須であろう。Sunのサイトから落としてくる。けど1.4のチュートリアルは1.3のときにくらべて、大いにとっつきにくい。実は1.3用でも、Sun ONE Platform用に後からでたチュートリアルはとっつきにくいんだ。1.4はその拡張版というヤツだろう。ぱっと見、やれる気が全然しない。だが、目を皿のようにして探すと、なんかやって見れそうな部はある(一緒にダウンロードしてくる大量のサンプルの中のひとつなんだが、行数が少なくて、それをどう扱うかも具体的に書いてあるような部分だ)。それをチクチクやって行こうじゃないか。

 Ant はとてもありがたいツールなのだが、なにせ勉強にならねえ!最近のチュートリアルはどいつもこいつも「添付のサンプルに ant build, ant deploy, ant runとやれば動きます」みたいな感じだ。俺アプリケーションを作って動かすには、サンプルのbuild.xml を自分のファイル名などに書き換えればいいのだろうが、それって検索置換の問題でしかない。実際にナニをどうしてるのか全然わかんねーヨ!
・・・・と思っていたら、この「J2EE 1.4 Tutorial」はさすがだった。それぞれのターゲットが実際はどんなコマンドに相当するのか、ちゃんと文書内で説明してくれている。さすがにひとつひとつというわけではないが、それくらいは自分でbuild.xmlを読んで推察できそうだ。では、わたしはステップバイステップで、コマンドを打ちながらやっていくコトにしよう。

ページ先頭に戻る


俺ドメインを作る

 Windowsですからね、インストールなんてもうヘみてえなもんですよ。サーバの起動も最強のスタートメニューから。うちのぬいぐるみのくまでもできまさあ(マウスがつかめねえヨ)。
  Sun ONE Application ServerをSolarisで動かしたときは、Default domain上の作業はroot権限でしかできないのに対し、ヒラユーザ用のアプリケーションドメインを作ってアプリのデプロイや起動はここで自由に行えるようにした、というのをやった。Windowsではアドミン権限は垂れ流しだからそんな必要もないだろうが、domain1という無粋な名前がイヤだったりするから、オリジナルのドメインを作ることにした。

やり方は オンラインドキュメントの「Administrator's guide」(http://java.sun.com/j2ee/1.4/docs/adminguide/)に書いてあった。目次から「Configureing Domains」のさらに「Creating Domains」文書へリンクしていく。まあ、昔と同じである。

asadmin create-domain --adminport 8782 --adminuser noniko nonidomain

 ここでadminuserのnonikoは、J2EE1.4 SDKのインストール時に、設定したものである。adminport 8782は、どっかで昔やったのと同じ「やなヤツ〜」という意味を持つが、無論皆様のお好みである。ただし、これは管理ポートであって、アプリケーションにアクセスするポートではないのでちょと失敗感が高い。8で始まるポートってなんかアプリケーションポートな気がするじゃない?アプリケーションにアクセスするポートは、向こうで決めちゃうみたいだ。変更する方法もあるんだろうけど、そこまではやらない。

さて、ではスタートメニューの便利なツールたちを自分好みにカスタマイズしてしまうのダ。(皮肉入ってる?少しやさぐれてる?)

「スタートメニュー」から「プログラム」->「Sun Microsystems」->「J2EE 1.4 SDK」->「Start Default domain」というヤツがある。これはdomain1を立ち上げるヤツだ。
ユーザnonikoでインストールしたので、このショートカットアイコンは C:\Documents and Settings\noniko\スタート メニュー\プログラム 以下、地獄の一丁目のような場所にある。それを同じ場所にコピーして、名前を「Start nonidomain」にしてやる。
この、「Start nonidomain」ショートカットアイコンの「プロパティ」を開く。リンク先のところに、

C:\なんとかかんとかかんとか start-domain domain1

と書いてある。このいちばんケツんとこを「domain1」から「nonidomain」に書き換えてやる。
そうすれば、「スタート メニュー」からチョクで俺オリジナルドメインを、立ち上げることができるという案配だ。
同様にして、「Stop nonidomain」ショートカットアイコンも作ってやる。

さらに、「Admin Console」ショートカットアイコンもコピーして名前を「nonidom Admin Console」みたくして、プロパティの「リンク先」を

なんとかかんとか"http://localhost:4848/なんとかかんとか から
なんとかかんとか"http://localhost:8782/なんとかかんとか にすれば、「スタート メニュー」からチョクで俺オリジナルドメインの管理コンソールを立ち上げることができる。

ということで、立ち上げてみる。ログインしてみると、サーバの情報が表示される。ここで、

HTTP Port(s): 1110, 1116, 8782

と書いてあった。このポート1110がアプリケーションのポートなのであった。以後、例などで「ポート8080にアクセス」と出たら、俺ドメインではポート1110にアクセスすればよいことになる。

2004年02月04日

ページ先頭に戻る


速きゃええんじゃ!

 さてリリースされたJ2EE1.4。入れるマシンはWindowsにしました。例によってSolaris-X86版は、なーいす!1.3はねー。解凍さえしちまえば、FCSのほうは一応動くみたいなんだけど、1.4ではもうApplication Serverがどーんとついてて、コレがさすがにごまかしはきかねえんだヨ。
 で、Windowsにしました。Blade 100にはちと、荷が重すぎるかも知れないし、なにせ別の部屋にあるのをわざわざリモートログインして動かさなくても、ここに最速スペックのWindowsマシンがある。Javaなんだからプラットフォームは問わない。Windowsをそんなにまでして忌み嫌う必要は、ないだろう。

って、こだわってる私?こだわってる?よっぽどSolaris-x86版のないのがくやしい?くやしーよ!サポート外で自己責任でいいから、出してええなSun様!

2004年02月04日

ページ先頭に戻る