非同期 JAX-WS Web サービスクライアントのエンドツーエンドシナリオ
執筆および管理: Jaroslav Pospisil、Milan Kuchtiak、Geertjan Wielenga
このドキュメントでは、IDE を使用して、ライブ Web サービスを非同期で利用する JAX-WS Web サービスクライアントを開発する基本的な手順を学ぶことができます。 ライブ Web サービスとして eSynaps Web Service Search サービスを使用します。 このサービスは、指定された検索文字列を含む Web サービスの URL を返します。 たとえば、「weather」という文字列を Web サービスに送信すると、天気情報を提供する Web サービスの URL のリストが返されます。 このチュートリアルでは、Java SE アプリケーション内の簡単な Java クラスをクライアントとして使用します。
非同期の Web サービスクライアントは、「ポーリング」または「コールバック」のいずれかの方式で Web サービスを利用します。 「ポーリング」方式では、Web サービスメソッドを呼び出して、結果を繰り返し要求します。 ポーリングは、呼び出し側スレッドをブロックするためにブロッキング動作になります。このため、GUI アプリケーションでは使用されません。 「コールバック」方式では、Web サービスのメソッド呼び出し中にコールバックハンドラを渡します。 結果が入手可能になると、ハンドラの handleResponse() メソッドが呼び出されます。 この方式は応答を待つ必要がないため、GUI アプリケーションに適しています。 たとえば、GUI イベントハンドラから呼び出しを行ってもすぐに制御が戻り、ユーザーインタフェースが応答しやすい状態に保たれます。 ポーリング方式の欠点は、応答を受け取って利用しても、応答を受け取ったかどうかを調べるためにポーリングしなければならないことです。 したがって、このチュートリアルでは、応答が返ってくるまで通常どおりに動作するコールバック方式を使用します。 応答は、ハンドラで受け取り、処理します。 これから紹介するシナリオでは、コールバック方式を利用して、Web サービスによって検出された URL を処理します。 最初に、URL を構文解析して XML タグを削除し、その結果を JTextArea に表示します。
正常に動作するアプリケーションが完成したら、それを NetBeans Platform に移行し、NetBeans Platform のモジュール方式アーキテクチャーと、IDE でリッチクライアントアプリケーションの開発に利用できる GUI 機能を継承します。
予想される所要時間: 45 分
このチュートリアルに必要なソフトウェア
開始する前に、コンピュータに次のソフトウェアをインストールしておく必要があります。
目次
作業環境のインストールと設定
NetBeans 5.5 をインストールし、IDE を実行します。 このシナリオでは、Java SE プロジェクトで Web サービスクライアントを使用するので、Sun Java System Application Server 9.0 がインストールされている必要はありません。
Java SE アプリケーションと Web サービスクライアントの作成
Web サービスクライアントを作成するには、Java SE アプリケーション、EJB モジュール、または Web モジュールのいずれかが必要です。 ここでは、Java SE アプリケーションを使用します。
- 「ファイル」>「新規プロジェクト」(Ctrl-Shift-N) を選択します。 「一般」カテゴリから「Java アプリケーション」を選択します。 「次へ」をクリックします。
- プロジェクトに「AsyncWSClient」という名前を付けます。 「主クラスを作成」チェックボックスを選択解除します。 「完了」をクリックします。
- 「プロジェクト」ウィンドウで、「AsyncWSClient」プロジェクトノードを右クリックし、「新規」>「ファイル/フォルダ」(Ctrl-N) を選択します。 「新規ファイル」ウィザードで、「カテゴリ」リストから「Web サービス」を選択し、「ファイルの種類」リストから「Web サービスクライアント」を選択します。 「次へ」をクリックします。
- 「WSDL URL」を選択し、次の WSDL URL を入力またはペーストします。
http://www.esynaps.com/WebServices/SearchWS.asmx?WSDL
- 「パッケージ」に org.me.wsc と入力します。 「完了」をクリックします。
「プロジェクト」ウィンドウの「Web サービス参照」ノード内に新しい Web サービスクライアントが表示されます。
- 「SearchWS」を右クリックし、「Web サービス属性を編集」を選択します。 「Web サービス属性を編集」エディタが表示されます。
- エディタ内で「Search」を展開します。 次に示すように、「非同期クライアントを有効にする」チェックボックスを選択します。
- 「了解」をクリックします。
次に示すダイアログが表示されます。
- 「了解」をクリックします。
「出力」ウィンドウを見ると、IDE で Ant ターゲットを呼び出して、JAX-WS クライアント側の必要なアーティファクトが生成されていることが確認できます。
Web サービスとの非同期対話
IDE を使用して、SearchWS Web サービスを利用する Web サービスクライアントを生成したところで、次に進みます。 SearchWS Web サービスには、公式には 1 つのオペレーション、「Search」しかありません。このオペレーションは、要求パラメータとして指定された検索用語を使用して、Web 上で URL を検索します。 ただし、このオペレーションの実行には時間がかかる場合があります。 標準の同期方式で結果を利用するために待機すると、ワークフローが中断されてしまう可能性があります。 したがって、このチュートリアルでは、結果を非同期方式で利用します。
最初の手順は終了しています。ここまでで、Web サービスクライアントで非同期オペレーション呼び出しが行えるようになりました。 「SearchWS」ノードを展開すると、次に示すように、3 つのオペレーションが表示されます。
導入部分で説明したとおり、このチュートリアルでは、上記のスクリーンショットに表示されている Search [非同期コールバック] オペレーションを使用します。 2 つの非同期方式の違いについての詳細は、https://jax-ws.dev.java.net/jax-ws-20-fcs/docs/asynch.html を参照してください。
ユーザーインタフェースのデザイン
ユーザーが検索文字列を指定し、Web サービスに送信し、結果を確認できるようにするには、ユーザーインタフェースを作成する必要があります。 NetBeans の GUI ビルダー (別名 Matisse) を使用すれば、アプリケーションのユーザーインタフェースを簡単に作成できます。
- 「AsyncWSClient」プロジェクトを右クリックし、「新規」>「ファイル/フォルダ」(Ctrl-N) を選択します。 「Java GUI フォーム」カテゴリで「JFrame フォーム」を選択し、「次へ」をクリックします。 フォームに MainForm という名前を付け、「パッケージ」に org.me.forms と入力します。 「完了」をクリックします。
- 次の表に示すコントロールをコンポーネントパレット (Ctrl-Shift-8) から追加し、次のようにプロパティーを変更します。
| コンポーネント |
プロパティー |
値 |
| JLabel |
テキスト |
Enter search text: |
| JTextField |
テキスト |
|
|
変数名 |
tfWord |
| JButton |
テキスト |
Search |
|
変数名 |
btSearch |
| JProgressBar |
stringPainted |
有効 |
|
変数名 |
pgProgress |
| JLabel |
テキスト |
URLs found: |
| JTextArea |
background |
[204,204,204] |
|
editable |
無効 |
|
lineWrap |
有効 |
|
変数名 |
taResults |
注: 上記のプロパティーを変更するには、「プロパティー」ウィンドウ (Ctrl-Shift-7) を使用します。 変数名以外のすべてのプロパティーは、「プロパティー」ウィンドウの「プロパティー」タブで変更できます。変数名は「コード」タブで設定します。 変数名をより簡単に変更するには、コンポーネントを右クリックし、「変数名を変更」メニュー項目を選択します。
また、JTextArea は直接フォームに配置しましたが、GUI ビルダーによって JScrollPane に配置されることに注意してください。
- ユーザーインタフェースが次のようになるまで、コンポーネントの位置とサイズを変更します。
ビジネスロジックの追加
導入部分で説明したとおり、このチュートリアルでは、Java EE 5 の JAX-WS によって提供される非同期コールバック方式を使用して、Web サービスと対話します。 シナリオでは、非同期方式を利用して、Web サービスによって検出された URL を処理します。 最初に、URL を構文解析して XML タグを削除し、その結果を JTextArea に表示します。
- 返された URL を構文解析するコードを追加するには、ソースエディタの左上にある「ソース」ボタンをクリックし、ファイルの最後までスクロールします。 クラスの閉じ括弧のすぐ上に、次のメソッドを追加します。
private String removeTags(String str){
String text = str;
text = text.replaceAll("<Results><url>","");
text = text.replaceAll("</url><url>","/\n");
text = text.replaceAll("</url></Results>","");
return text;
}
通常は、結果を構文解析するには XML パーサーを使用しますが、このチュートリアルの目的を達成するだけであれば String.replace() で十分です。
- 次に、非同期クライアントコードを追加します。 前の手順で追加したメソッドの下に、次のコードを追加します。
public void callAsyncCallback(String word){
}
- 次に示すように、「プロジェクト」ウィンドウで、「Web サービス参照」>「SearchW」>「WebSearchWS」>「WebSearchWSSoap」の順に展開します。
- 「プロジェクト」ウィンドウの「Search [非同期コールバック]」ノードを、上記の手順 2 で作成した callAsyncCallback メソッドにドラッグ&ドロップします。
ドロップすると、追加のコーディングをしなくても、コードは次のようになります。
public void callAsyncCallback(String word) {
try { // Call Web Service Operation(async. callback)
org.me.wsc.WebSearchWS service = new org.me.wsc.WebSearchWS();
org.me.wsc.WebSearchWSSoap port = service.getWebSearchWSSoap();
// TODO initialize WS operation arguments here
java.lang.String keyWord = "";
javax.xml.ws.AsyncHandler<org.me.wsc.SearchResponse> asyncHandler = new javax.xml.ws.AsyncHandler<org.me.wsc.SearchResponse>() {
public void handleResponse(javax.xml.ws.Response<org.me.wsc.SearchResponse> response) {
try {
// TODO process asynchronous response here
System.out.println("Result = "+ response.get());
} catch(Exception ex) {
// TODO handle exception
}
}
};
java.util.concurrent.Future<? extends java.lang.Object> result = port.searchAsync(keyWord, asyncHandler);
while(!result.isDone()) {
// do something
Thread.sleep(100);
}
} catch (Exception ex) {
// TODO handle custom exceptions here
}
}
注: 別の方法で上記のコード断片を自動的に生成することもできます。 ソースエディタに表示されている callAsyncCallback メソッド内を右クリックし、「Web サービスクライアントのリソース」>「Web サービスオペレーションを呼び出す」を選択します。 表示されるダイアログで、「Search [非同期コールバック]」オペレーションを選択し、「了解」をクリックします。
- ここで、生成されたコード断片を変更して、JTextField に入力された単語を Web サービスに渡し、返された結果を JTextArea に入れるようにします。 また、イベントディスパッチスレッド (AWT) の内部で Swing 呼び出しのスケジュールを設定します。 自動的に生成された try/catch ブロックは、このシナリオでは必要ありません。 この変更をもっとも簡単に行うには、次のコードをコピー&ペーストします。
public void callAsyncCallback(String word){
org.me.wsc.WebSearchWS service = new org.me.wsc.WebSearchWS();
org.me.wsc.WebSearchWSSoap port = service.getWebSearchWSSoap();
javax.xml.ws.AsyncHandler<org.me.wsc.SearchResponse> asyncHandler = new javax.xml.ws.AsyncHandler<org.me.wsc.SearchResponse>() {
public void handleResponse(final javax.xml.ws.Response<org.me.wsc.SearchResponse> response) {
SwingUtilities.invokeLater(new Runnable() {
public void run() {
String results = "";
try {
results = response.get().getSearchResult();
results = removeTags(results);
taResults.setText(results);
} catch(Exception ex) {
ex.printStackTrace();
}
pgProgress.setIndeterminate(false);
pgProgress.setString("");
btSearch.setEnabled(true);
}
});
}
};
port.searchAsync(word, asyncHandler);
}
- 最後に、javax.swing.Utilities クラスのインポート文が必要です。 ソースエディタ内で右クリックし、「インポートを修正」(Alft-Shift-F) を選択すると、このインポート文が自動的に IDE によって生成されます。
ユーザーインタフェースとビジネスロジックの接続
この項では、前の項で用意したロジックをユーザーインタフェースに接続します。 Web サービスへの接続は、ユーザーが JButton をクリックすると行われます。 ボタンをクリックすると、進捗バーがアクティブになり、コールバックメソッドが呼び出されます。
- 次に示すように、「デザイン」ビューで「JButton」を右クリックし、「イベント」>「Action」>「ActionPerformed」を選択します。
エディタが「ソース」ビューに切り替わり、btSearchActionPerformed メソッドが表示されます。
- 次に示す太字のコードを挿入します。
private void btSearchActionPerformed(java.awt.event.ActionEvent evt) {
String word = tfWord.getText();
pgProgress.setIndeterminate(true);
pgProgress.setString("waiting for server");
btSearch.setEnabled(false);
callAsyncCallback(word);
}
最初に進捗バーが連続して実行されるように無限モードに設定し、そのテキストを「waiting for server」に設定しています。 次に、非同期コールバックメソッドを呼び出し、JTextField から取得した単語をメソッドに渡します。
アプリケーションの実行
簡単な Swing アプリケーションが完成したので、実行してみます。
- プロジェクトを右クリックし、「プロジェクトを実行」を選択します。 org.me.forms.MainForm を主クラスとして設定するよう求められます。 「了解」をクリックします。
アプリケーションが構築、実行されます。
- JTextField に「weather」などの単語を入力し、「Search」をクリックします。 次の図に示すように、進捗バーがアクティブになります。
次の図に示すように、数秒後に進捗バーが停止し、結果が JTextArea に表示されます。
進捗バーが停止したあと JTextArea が空白のままの場合は、「Search」をもう一度クリックして検索を繰り返します。 このシナリオで使用している Web サービスがある Internet サーバーは、クライアントからの要求で混雑することがあります。
注: ファイアウォールを使用している場合は、正しいプロキシサーバーとプロキシポートがアプリケーションによって自動的に認識されます。 Web サービスクライアントの作成時に、システム設定が project.properties ファイルの run.jvmargs プロパティーに書き込まれています。 「プロジェクト」ウィンドウでプロジェクトを右クリックし、「プロパティー」を選択して、「実行」カテゴリをクリックすると、「VM オプション」フィールドに、生成された値が表示されます。 必要に応じて値を変更できます。
アプリケーションの拡張と配布
正常に機能するアプリケーションが完成したところで、この節では、アプリケーションを簡単かつ効率的に拡張する方法について学びます。 たとえば、アプリケーションに Google ツールバーを追加できます。 拡張を行うための簡単な方法は、アプリケーションを NetBeans Platform に移行することです。 NetBeans Platform に移行したアプリケーションは、IDE の「ツール」メニューにあるアップデートセンターウィザードと同じウィザードを独自に組み込むことができ、それにより、Google ツールバーモジュールなど、外部のモジュールを追加できるようになります。
アプリケーションの配布方法についても学ぶ必要があります。 IDE で Java プロジェクトを構築するときは、アプリケーションの dist フォルダに JAR ファイルが作成されます。 この JAR ファイルの代わりに、またはこの JAR ファイルに加えて、実行可能ファイルを提供することができます。 Java Web Start Technology を使用して、ブラウザからアプリケーションを起動する方法もあります。 アプリケーションを NetBeans Platform に移行するときは、IDE の数多くのサポートを利用できます。たとえば、配布用 ZIP や Web Start で起動できるアプリケーションをメニュー項目を 1 回クリックするだけで作成できます。
インフラストラクチャーのラップ
前の節で作成した簡単な Swing アプリケーションには複数のアーティファクトが含まれます。これらのアーティファクトは、「ラッパー」モジュールを使用して NetBeans Platform で利用可能にできます。 ラッパーモジュールとは、コードを含まず、アプリケーションのクラスパスにライブラリを配置するモジュールです。 アプリケーションのクラスパスには、複数の JAR ファイルを配置する必要があります。 まず、IDE によって生成された JAX-WS クライアント側アーティファクトが必要です。 次に、JFrame フォームで参照した Java EE 5 JAR ファイルが必要です。 これらの JAR ファイルをクラスパスに配置したら、NetBeans Platform アプリケーションで使用できます。
- プロジェクトを右クリックし、「プロジェクトを構築」を選択します。 「ファイル」ウィンドウ (Ctrl-2) で dist フォルダ内を見ると、AsyncWSClient.jar という名前の JAR ファイルがあります。 この JAR ファイルに、前の節で Web サービスとの対話に使用した JAX-WS クライアント側アーティファクトが含まれます。
では、新しいリッチクライアントアプリケーションのフレームワークとなるモジュールスイートプロジェクトを作成します。
- 「ファイル」>「新規プロジェクト」(Ctrl-Shift-N) を選択し、「NetBeans プラグインモジュール」カテゴリから「モジュールスイートプロジェクト」を選択します。 「次へ」をクリックします。 WebServiceLocator という名前のモジュールスイートプロジェクトを作成します。 「完了」をクリックします。
「プロジェクト」ウィンドウに、新しい WebServiceLocator アプリケーションのプロジェクト構造が表示されます。 プロジェクト構造は、NetBeans Platform 上に構築されたアプリケーションのスケルトンを表します。
ここで、Web サービスクライアントのアーティファクトを含む JAR ファイルをアプリケーションに追加する必要があります。
- 「プロジェクト」ウィンドウで、「WebServiceLocator」プロジェクトを展開します。「モジュール」を右クリックし、「新規ライブラリを追加」を選択して、ライブラリラッパーモジュールプロジェクトを作成します。 「ライブラリ」テキストフィールドで、上記の手順 1 で説明した JAR ファイルを含む dist フォルダに移動します。 フォルダの内容は次のようになります。
上記のスクリーンショットに示した「AsyncWSClient.jar」を選択します。 この時点ではライセンスファイルを気にする必要はありません。 「次へ」をクリックします。
- デフォルト名の AsyncWSClient をそのまま使用します。 「次へ」をクリックし、「完了」をクリックします。
JAR ファイルラッパーを提供し、アプリケーションのクラスパスに配置しました。これにより、JAX-WS クライアント側アーティファクトを Web サービスとの対話で使用できます。
- 同じ手順で、別のライブラリラッパーモジュールプロジェクトを作成します。 今回は、上記のスクリーンショットに示した lib フォルダ内のすべての JAR ファイルをラップします。
注: Ctrl キーと Shift キーを押しながらクリックして、lib フォルダ内にあるすべての JAR ファイルを選択します。
lib フォルダ内の JAR ファイルは必要になります。これは、次の項で追加するビジネスロジックに必要な JAX-WS インフラストラクチャーを提供するためです。
ユーザーインタフェースとビジネスロジックの追加
この項では、このチュートリアルの前半で構築したユーザーインタフェースを再作成します。 ただし、今回は、JFrame フォーム内に作成する代わりに、TopComponent 内に作成します。 TopComponent は、NetBeans API に属するクラスです。 このクラスは、NetBeans IDE、または現在作成しているアプリケーションのように、NetBeans Platform 上に構築するアプリケーションに、可視コンポーネントを埋め込みます。 TopComponent にユーザーインタフェースを作成することは、JFrame フォームに作成するのと同じくらい簡単です。どちらも直感的な GUI ビルダー (別名 Matisse) によってサポートされているからです。 TopComponent を用意したら、前の項でラップした JAX-WS クライアント側アーティファクトに接続するためのビジネスロジックを用意する必要があります。 最後に、前と同じように、ユーザーインタフェースをビジネスロジックにフックする必要があります。
- 「ファイル」>「新規プロジェクト」を選択し、「NetBeans プラグインモジュール」カテゴリから「モジュールプロジェクト」を選択します。 「次へ」をクリックします。 AsyncWSClientUI という名前のモジュールプロジェクトを作成します。 次に示すように、ウィザードを使用して新しいモジュールがモジュールスイートに追加されるように設定し、「主プロジェクトとして設定」を選択します。
「次へ」をクリックします。
- 「基本モジュール構成」パネルで、org.netbeans.modules.asyncwsclientui など、任意のコード名ベースを入力します。 「完了」をクリックします。
ウィザードの最後で「完了」をクリックしたら、「AsyncWSClientUI」プロジェクトノードを右クリックし、「プロパティー」を選択します。コードで総称を使用するので、「ソース」タブでソースレベルを 1.5 に設定します。 警告を有効にするかどうかの確認を求められたら、必要に応じて、有効にすることができます。ただし、この設定はこのシナリオでは重要ではありません。
- 「AsyncWSClientUI」プロジェクトノードを右クリックし、「新規」>「ウィンドウコンポーネント」を選択します。 ウィンドウコンポーネントを作成し、ウィザードの最初のページで、このコンポーネントを「editor」ウィンドウの位置に配置すること、またアプリケーションの起動時に開くことを指定します。 「クラス名の接頭辞」で「AsyncWSClient」を指定します。 アイコンを指定する必要はありません。 「完了」をクリックします。
- Bundle.Properties ファイルで、CTL_AsyncWSClientTopComponent キーを次のように変更します。
CTL_AsyncWSClientTopComponent=Window
- 次に示す前述の各項を参照して、ユーザーインタフェースと、基盤となるビジネスロジックを再作成します。
注: 複数の行に赤の下線が表示されます。 これらの下線は、まだ宣言されていないコード依存関係があることを示しています。 次の手順で、必要な依存関係を宣言します。
- 「AsyncWSClientUI」プロジェクトノードを右クリックし、「プロパティー」を選択します。「プロジェクトプロパティー」ダイアログで「ライブラリ」を選択します。 「依存関係を追加」をクリックします。 「AsyncWSClient」、「JAX-WS-JARS」、「Swing レイアウト拡張統合」、「UI ユーティリティー API」、「ユーティリティー API」、「ウィンドウシステム API」の各依存関係がまだ追加されていない場合は追加します。 同じ手順を AsyncWSClient プロジェクトについて繰り返します。ただし、このプロジェクトでは JAX-WS-JARS だけを追加します。
- 「WebServiceLocator」プロジェクトを右クリックし、「すべての生成物を削除して構築」を選択します。 アプリケーション全体が構築され、「出力」ウィンドウに「構築成功」というメッセージが表示されます。
アプリケーションの微調整と実行
これで、3 つの部分から構成されるアプリケーションが完成しました。3 つの部分とは、アプリケーションのコアである NetBeans Platform、NetBeans IDE によって提供されるすべてのモジュール、および独自に作成したモジュール、つまり 2 つのラッパーモジュールおよびユーザーインタフェースとビジネスロジックを提供するモジュールです。 ただし、NetBeans IDE によって提供されるモジュールは不必要なため、先に進む前に、これらのモジュールをアプリケーションから除外します。 作成したアプリケーションを元のアプリケーションにできるだけ近い形にするため、NetBeans Platform でデフォルトで提供されるメニューとツールバーもすべて削除します。 また、アプリケーションのタイトルバーにタイトルを設定します。 NetBeans IDE 内からアプリケーションを実行し、テストします。アプリケーションが、このチュートリアルの前半で操作した Web サービスの Web サービスクライアントとして正常に機能することを確認します。
- 「WebServiceLocator」プロジェクトノードを右クリックし、「プロパティー」を選択します。「プロジェクトプロパティー」ダイアログで「アプリケーション」をクリックします。 「スタンドアロンアプリケーションを作成」を選択します。 次に示すように、「除外」をクリックします。
「WebServiceLocator」にスペースを追加して、アプリケーションタイトルを「Web Service Locator」に変更します。 「了解」をクリックします。
- 「AsyncWSClientUI」>「重要なファイル」>「XML レイヤー」>「<コンテキスト内のこのレイヤー>」>「メニューバー」の順に展開します。 「メニューバー」内のすべての項目を選択します。最初の項目を Ctrl キーを押しながらクリックし、最後の項目を Shift キーを押しながらクリックします。 右クリックし、「削除」を選択します。削除の確認を求められたら、「はい」をクリックします。 IDE によって layer.xml ファイルにタグが追加される間、しばらく待ちます。 これと同じ手順を「ツールバー」フォルダについて繰り返します。 XML レイヤーファイルの XML ビューを見ると、次のタグが追加されています。
<folder name="Menu">
<file name="Edit_hidden"/>
<file name="File_hidden"/>
<file name="GoTo_hidden"/>
<file name="Help_hidden"/>
<file name="Tools_hidden"/>
<file name="View_hidden"/>
<file name="Window_hidden"/>
</folder>
<folder name="Toolbars">
<file name="Edit_hidden"/>
<file name="File_hidden"/>
<file name="Memory_hidden"/>
<file name="Standard.xml_hidden"/>
</folder>
注: この手順で説明した「削除」メニュー項目を使用する代わりに、上記のタグを layer.xml ファイルに直接ペーストすることもできます。
- 「Web Service Locator」アプリケーションを右クリックし、「実行」を選択します。 アプリケーションが起動し、NetBeans Platform のデフォルトのスプラッシュ画面が表示され、新しいアプリケーションが表示されます。
注: アプリケーションを初めて実行するときは、大きく表示されます。 これは、NetBeans Platform のデフォルトの解像度が使用されるからです。 アプリケーションの実行中にサイズを変更すれば、設定は保存されます。 ただし、「プロジェクトの生成物を削除」コマンドまたは「プロジェクトの生成物を削除して構築」コマンドを使用してプロジェクトの生成物を削除すると、アプリケーションの解像度は NetBeans Platform のデフォルト設定に戻ります。
次に示すように、アプリケーションを実行してみると、NetBeans Platform 上で動作している点を除いて、元のアプリケーションと同じように機能することがわかります。
ウィンドウコンポーネントが自動的に開かない場合、またはあとに続く手順を実行する前にウィンドウを閉じてしまった場合は、layer.xml ファイルに次のコードを挿入します。次に、IDE 内からアプリケーションを再起動して、新しく作成されるクライアントメニューからウィンドウコンポーネントを開きます。
<folder name="Menu">
<folder name="Client">
<file name="org-netbeans-modules-asyncwsclientui-AsyncWSClientAction.shadow">
<attr name="originalFile" stringvalue="Actions/Window/org-netbeans-modules-asyncwsclientui-AsyncWSClientAction.instance"/>
</file>
</folder>
</folder>
次に、layer.xml ファイルから上記のタグを削除し、アプリケーションを再実行します。 このとき、クライアントメニューは表示されませんが、ウィンドウコンポーネントは開きます。これは、クライアントメニューを使用してウィンドウを開いたとき、開いた状態が保存されたためです。
- 「ファイル」ウィンドウ (Ctrl-2) で、「Web Service Locator」>「ブランド」>「モジュール」の順に展開します。 「org-netbeans-core-windows.jar」を展開し、Bundle.properties ファイルに到達するまで展開を続けます。 ファイルを開くと、次のキーと値のペアが記述されています。
CTL_MainWindow_Title=Web Service Locator {0}
CTL_MainWindow_Title_No_Project=Web Service Locator {0}
各行から {0} を削除します。 これにより、上記の手順 3 のスクリーンショットでタイトルバーに表示されていた数値が削除されます。 アプリケーションを再実行し、操作すると、画面は次のようになります。
配布用ファイルの作成
基本的なアプリケーションが完成したら、その配布用ファイルを用意します。 配布用ファイルは、次に説明する ZIP ファイル形式か、Web Start で起動できる形式にできます。
- 「Web Service Locator」アプリケーションを右クリックし、「配布用 ZIP を構築」を選択します。 IDE で Ant ターゲットが実行されます。 「出力」ウィンドウに、ZIP ファイルが作成された場所が表示されます。
- ファイルシステム内で ZIP ファイルを検索し、展開します。 配布用ファイルの etc フォルダには CONF ファイルが入っています。 このファイルを開き、JDK を設定します。 たとえば、次のように設定します。
jdkhome="C:\Program Files\Java\jdk1.5.0_06"
- 次に、default_options 変数に -J-Dnb.tabs.suppressCloseButton=true を追加します。 これにより、ウィンドウコンポーネントの右上隅にある「x」が非表示になり、ユーザーはそのウィンドウを閉じることができなくなります。
CONF ファイルは次のようになります。変更箇所は太字で示しています。
# ${HOME} will be replaced by JVM user.home system property
default_userdir="${HOME}/.${APPNAME}/dev"
default_mac_userdir="${HOME}/Library/Application Support/${APPNAME}/dev"
# options used by the launcher by default, can be overridden by explicit
# command line switches
default_options="-J-Xms24m -J-Xmx64m -J-Dnetbeans.logger.console=true -J-ea -J-Dnb.tabs.suppressCloseButton=true"
# default location of JDK/JRE, can be overridden by using --jdkhome <dir> switch
jdkhome="C:\Program Files\Java\jdk1.5.0_06"
# clusters' paths separated by path.separator (semicolon on Windows, colon on Unices)
#extra_clusters=
- bin フォルダの実行可能ファイルからアプリケーションを実行します。 タブの右端に「x」が表示されていないことがわかります。
アプリケーションへの Google ツールバーの追加
IDE によって提供される 1 つのモジュールによって、「ツール」メニューに「アップデートセンター」メニュー項目が追加されます。 ユーザーがこのメニュー項目を選択すると、「アップデートセンター」ウィザードが表示されます。 このウィザードを使用すると、モジュールを選択してアプリケーションにインストールできるので、ユーザーは簡単かつ効率的にアプリケーションを拡張できます。
- Google ツールバーを作成します。
- このツールバーに限らず、モジュールをインストールするときは、「Web Service Locator」アプリケーションを右クリックし、「プロパティー」を選択します。 「プロジェクトプロパティー」ダイアログで「ライブラリ」をクリックします。 「nb5.5」を展開し、「アップデートセンター」を選択します。
- 次に、「platform6」を展開し、「オートアップデート」を選択します。 「了解」をクリックして、「プロジェクトプロパティー」ダイアログを終了します。
- layer.xml ファイルで、「ツール」メニューを非表示にする次のタグを削除します。
<file name="Tools_hidden"/>
- プロジェクトを右クリックし、「すべての生成物を削除して構築」を選択します。 右クリックし、「プロジェクトを実行」を選択します。
- 「ツール」メニューで「アップデートセンター」を選択し、これを使用してモジュールをインストールします。 たとえば、Google ツールバーをインストールし、外部 HTML ブラウザをその依存モジュールとともに追加した場合、アプリケーションは次のようになります。