[Indexへ戻る]

 Java Web Start編

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点の開発を行います。

  1. ローカルリソースを使用しないプログラムをダウンロードして実行する
  2. ローカルリソースを使用するプログラムをJNLP APIを使用して許可を取って実行する
  3. ローカルリソースを使用するプログラムをJ2SE APIと電子署名によって許可を取って実行する

Java Web Start対応プログラムは、ネットワークからダウンロードする際にバージョンアップの自動照合や差分ダウンロードといった機能を持たせることができます。そこで、次の3点の設定を開発します。

  1. バージョン管理は適用せずにダウンロードをする
  2. バージョン管理を適用して最新版があれば全てをダウンロードして更新する
  3. バージョン管理を適用して最新版があれば既にダウンロードしたものからの差分だけをダウンロードして更新する

プログラム

上述の要求定義には3種類のプログラムが必要となります。

要求定義 開発プログラム 備考
1 EX1 ローカルリソースを使用しないプログラム
2 EX2 JNLP APIを使用してファイルを読み込むプログラム
3 EX3

ローカルリソースを使用しないプログラム(EX1)

mainメソッドを持つEx1Mainクラスと、JFrameを継承してメッセージ文字列を表示するだけのEx1Frameクラスの2つからなる極めて単純なプログラムです。mainメソッドはコマンドライン引数を取るようにしています。後述のJNLPファイルからコマンドライン引数を指定しています。

ソースファイル

クラス名 ファイル名 備考
Ex1Main
Ex1Main.java
Ex1Frame
Ex1Frame.java

JNLPファイル

ファイル名 備考
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>

JNLP APIを介してローカルリソースを使用するプログラム(EX2)

ローカルマシン上にあるテキストファイルの内容を表示するプログラムです。

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();
    }

JNLPファイル

ファイル名 備考
nuwaraeliya_ex2.jnlp

jnlp.jarは、アプリケーションと一緒に配布する必要はありません。Java Web Start自身が持っているからです。

通常にローカルリソースを使用するプログラム(EX3)

Hello Again Desktop編(プロジェクト名"Kanday")で開発したアプリケーションを使用します。JNLP APIを使用せずにセキュリティ制限(Sandbox)を超えるためには、JARファイルに電子署名を行います。

電子署名が施されたプログラムをユーザが受け入れることを選択した場合、プログラムをユーザが信頼したことになり、セキュリティ制限(Sandbox)を超えたアクセスが可能になるというモデルです。

今回は、プロジェクトKandayのVer.1.0.1のJARをそのまま利用します。

電子署名

3番目のプログラムで面倒なのは、電子署名を行う作業です。また、電子署名の仕組みは少々煩雑なので分かりにくい作業でもあります。

電子署名を使ったセキュリティ確保に必要なものは、以下です。

1.鍵の作成
C:\work> keytool -genkey -dname "cn=Takahashi Toru,ou=Soft develop,o=torutk,c=JP"
  -alias mykey -keypass <鍵を格納するファイル> -keystore <秘密鍵のパスワード>
  -storepass <キーストアへのアクセスパスワード> -validity 180

設定

ダウンロードすべきファイルを保持するサーバ側の設定については、どこまでの機能を実現するかによって必要な範囲が変わります。

  1. MIMEタイプの設定

MIMEタイプの設定

Apacheの場合

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 

実行例

EX1のバージョン管理なしによる実行

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のアプリケーションマネージャに、このアプリケーションが登録されています。

EX2のバージョン管理なしによる実行

アプリケーションのキャプションが表示されるところまでは、EX1のバージョン管理なしによる実行と同じです。

JNLP APIを使用しているので、プログラムのウィンドウが表示される前に、セキュリティの警告ダイアログが表示されます。

EX2プログラムでは、JNLP APIのFileOpenServiceを使用しています。そこで、ローカルファイルシステムへの読み取りが発生するためセキュリティの警告ダイアログが表示されたのです。ここで[はい]を押すと、FileOpenServiceクラスのopenFileDialogメソッドによるファイル選択ダイアログが表われます。

テキストファイルを指定して[開く]を押すと、テキストファイルの先頭一行を表示するウィンドウが現れます。

環境構築

Java環境

Java Web Start対応アプリケーションの開発において、JNLP APIを使用する場合、ダウンロードサーブレットを使用する場合は、JNLP開発者向けパックが必要になります。Sunから無償入手できます。

Mavenでjnlp.jarを扱う

この開発者向けパックに含まれる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)を指定します。

project.xmlのdependencies要素に追加
  <dependencies>
    <dependency>
      <groupId>jnlp</groupId>
      <artifactId>jnlp</artifactId>
      <version>1.2</version>
    </dependency>
  </dependencies>

ディレクトリ作成

ビルド環境

参考文献

  1. Javaルック&フィールデザインガイドライン
    サン・マイクロシステムズ=著、豊福剛=訳、ピアソン・エデュケーション刊、2000

TAKAHASHI, Toru