[Indexへ戻る]
Project Nuwara Eliya
2004.6.20よりアクセス
Hello Againプロジェクトによる開発成果であるJava Web Start編では、Java 2 Standard Edition(J2SE)に含まれるJava Web Startによるアプリケーションのダウンロード・実行・最新版へのバージョンアップを扱うプログラムおよび環境設定を行います。Java Web Startは、プログラムのインストールおよびバージョンアップ作業が容易に実現できるので、多数のマシンへのプログラムの配布・更新といった用途に役立つでしょう。
意見
著者個人の主張を特に述べる際に使用
未
リリース種類 | ファイル名 | 日付 | 備考 |
---|---|---|---|
バイナリ・リリース | |||
ソース・リリース |
未
C:\work>
未
C:\work>
Hello Again Java Web Start編のプログラムおよび環境構築プロジェクトについて、開発コード名”Nuwara Eliya"と付けました。
今回は、単にプログラムだけでなく、環境設定(得にサーバ側)も重要な開発対象になります。環境設定については、何を成果として管理するのか難しい点があります。
Java Web Start対応プログラムは、ネットワークからダウンロードしたJavaコードを実行することになるため、デフォルト状態ではセキュリティ上の理由から実行するマシンのローカルリソース(例えばファイル、ネットワーク等)を利用することができません。そこで、用途に応じてセキュリティの許可を設定する必要があります。このセキュリティ設定については、次の3点の開発を行います。
Java Web Start対応プログラムは、ネットワークからダウンロードする際にバージョンアップの自動照合や差分ダウンロードといった機能を持たせることができます。そこで、次の3点の設定を開発します。
上述の要求定義には3種類のプログラムが必要となります。
要求定義 | 開発プログラム | 備考 |
---|---|---|
1 | EX1 | ローカルリソースを使用しないプログラム |
2 | EX2 | JNLP APIを使用してファイルを読み込むプログラム |
3 | EX3 |
mainメソッドを持つEx1Mainクラスと、JFrameを継承してメッセージ文字列を表示するだけのEx1Frameクラスの2つからなる極めて単純なプログラムです。mainメソッドはコマンドライン引数を取るようにしています。後述のJNLPファイルからコマンドライン引数を指定しています。
クラス名 | ファイル名 | 備考 |
---|---|---|
Ex1Main |
Ex1Main.java |
|
Ex1Frame |
Ex1Frame.java |
ファイル名 | 備考 |
---|---|
nuwaraeliya_ex1.jnlp |
ファイルの内容と簡単な解説を以下に記します。
<?xml version="1.0" encoding="utf-8"?> <jnlp spec="1.0+" codebase="http://www.foo.bar/~toru/nuwaraeliya" href="nuwaraeliya_ex1.jnlp"> <information> <title>NuwaraEliya EX1</title> <vendor>TAKAHASHI,Toru</vendor> <homepage href="http://www.foo.bar/~toru/nuwaraeliya"/> <description>Hello Again Nuwara Eliya EX1</description> <description kind="short">A example application for Java Web Start. Not using local resources, only show a frame and display a message. </description> <icon href="images/logo64.gif"/> <offline-allowed/> </information> <resources> <j2se version="1.3+"/> <jar href="nuwaraeliya_ex1-1.0.jar"/> </resources> <application-desc main-class="helloagain.nuwaraeliya.Ex1Main"> <argument>-title</argument> <argument>Hello Again JWS:Nuwara Eliya EX1</argument> </application-desc> </jnlp> |
ローカルマシン上にあるテキストファイルの内容を表示するプログラムです。
mainメソッドを持つのがEx2Mainクラスです。起動するとユーザにファイルを選択させ、そのファイルの先頭1行を読み込みます。JFrameを継承してメッセージ文字列を表示するEx2Frameクラスの2つからなるプログラムです。
JNLP APIでは、プログラムで直接ファイルを指定して読み書きすることはできず、必ずダイアログを介してユーザがファイルを指定することになります。これは、セキュリティ確保上ユーザが指定したファイルのみをアクセス対象とするためです。
クラス名 | ファイル名 | 備考 |
---|---|---|
Ex2Main |
Ex2Main.java |
|
Ex2Frame |
Ex2Frame.java |
JNLP APIを使用する部分のコード例を以下に述べます。
// JNLP APIを用いてユーザにファイルを選択させる try { FileOpenService fileOpenService = (FileOpenService) ServiceManager.lookup("javax.jnlp.FileOpenService"); FileContents contents = fileOpenService.openFileDialog( null, new String[] {"txt"} ); if (contents != null) { BufferedReader reader = new BufferedReader( new InputStreamReader(contents.getInputStream()) ); message = reader.readLine(); } } catch (UnavailableServiceException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } |
ファイル名 | 備考 |
---|---|
nuwaraeliya_ex2.jnlp |
jnlp.jarは、アプリケーションと一緒に配布する必要はありません。Java Web Start自身が持っているからです。
Hello Again Desktop編(プロジェクト名"Kanday")で開発したアプリケーションを使用します。JNLP APIを使用せずにセキュリティ制限(Sandbox)を超えるためには、JARファイルに電子署名を行います。
電子署名が施されたプログラムをユーザが受け入れることを選択した場合、プログラムをユーザが信頼したことになり、セキュリティ制限(Sandbox)を超えたアクセスが可能になるというモデルです。
今回は、プロジェクトKandayのVer.1.0.1のJARをそのまま利用します。
3番目のプログラムで面倒なのは、電子署名を行う作業です。また、電子署名の仕組みは少々煩雑なので分かりにくい作業でもあります。
電子署名を使ったセキュリティ確保に必要なものは、以下です。
C:\work> keytool -genkey -dname "cn=Takahashi Toru,ou=Soft develop,o=torutk,c=JP" -alias mykey -keypass <鍵を格納するファイル> -keystore <秘密鍵のパスワード> -storepass <キーストアへのアクセスパスワード> -validity 180
ダウンロードすべきファイルを保持するサーバ側の設定については、どこまでの機能を実現するかによって必要な範囲が変わります。
Apacheの設定ファイル(mime.types)に以下を追加します。
application/x-java-jnlp-file jnlp |
Webサーバに、MIME設定を追加するだけで、サーブレット実行環境は不要です。JNLPファイルやJARファイル、画像ファイルなどは、JNLPファイルで指定したcodebase以下に指定の相対パスで格納します。EX1の例では、以下のようになります。
ホスト(www.foo.bar)のルートディレクトリ | +--- home +--- toru +--- public_html +--- nuwaraeliya +--- nuwaraeliya_ex1.jnlp +--- nuwaraeliya_ex1-1.0.jar +--- images +--- logo64.gif |
Webブラウザで、JNLPファイルのURLを指定します。
http://www.foo.bar/~toru/nuwaraeliya_ex1.jnlp
Mozillaの場合、以下のようなダイアログが表示されます。
デフォルトのアプリケーション(JNLPFile)で開くを選択します。すると、初回はアプリケーションのダウンロードを実行します。ダウンロード中は以下のキャプション画面が表示されます。
ダウンロードが完了すると、アプリケーションのスプラッシュ画面が表示されます。JNLPファイルの中でinformation要素の子要素で指定したtitle、vendor、iconが使用されています。
一定時間後、アプリケーションのウィンドウが表示されます。
初回に実行したときは、Java Web Startのデフォルト設定のままであればデスクトップ統合設定のダイアログが表示されます。はいを選択すると、Windows2000の場合、実行しているユーザのデスクトップとスタートメニューのプログラムメニューにショートカットが生成されます。
実行後、Java Web Startのアプリケーションマネージャに、このアプリケーションが登録されています。
アプリケーションのキャプションが表示されるところまでは、EX1のバージョン管理なしによる実行と同じです。
JNLP APIを使用しているので、プログラムのウィンドウが表示される前に、セキュリティの警告ダイアログが表示されます。
EX2プログラムでは、JNLP APIのFileOpenServiceを使用しています。そこで、ローカルファイルシステムへの読み取りが発生するためセキュリティの警告ダイアログが表示されたのです。ここで[はい]を押すと、FileOpenServiceクラスのopenFileDialogメソッドによるファイル選択ダイアログが表われます。
テキストファイルを指定して[開く]を押すと、テキストファイルの先頭一行を表示するウィンドウが現れます。
Java Web Start対応アプリケーションの開発において、JNLP APIを使用する場合、ダウンロードサーブレットを使用する場合は、JNLP開発者向けパックが必要になります。Sunから無償入手できます。
この開発者向けパックに含まれるjnlp.jarを使用します。さて、このjnlp.jarをMavenに含めるには、ローカルリポジトリを設定する必要があります。Mavenは、${user.home}/.maven/repositoryの中にダウンロードしたJARファイルをキャッシュするので、ここにjnlp/jarsというディレクトリを作成してその中にjnlp.jarをjnlp-1.2.jarとバージョン番号付きの名前で置きます。バージョン番号を付けない名前ではMavenのプロジェクトで管理できないので、手動で名前に付加します。
${user.home}/.maven/repository +--- jnlp +--- jars +--- jnlp-1.2.jar |
Windows2000の場合、${user.home}は、C:\Document and Settings\ユーザ名 になります。
ローカルリポジトリにjnlp.jarを置いたら、Mavenのプロジェクト設定ファイルproject.xmlにこのjnlp.jarへの依存関係を記述します。groupId要素は、上でローカルリポジトリ直下に作成したディレクトリ名(jnlp)を指定します。artifactId要素には、jnlpとjarファイル名からバージョン番号と拡張子を取り除いた名前(jnlp)を指定します。version要素には、jarファイル名のバージョン番号(1.2)を指定します。
<dependencies> <dependency> <groupId>jnlp</groupId> <artifactId>jnlp</artifactId> <version>1.2</version> </dependency> </dependencies> |
TAKAHASHI, Toru