1概要

この記事では、Java Web Start(JWS)とは何か、サーバー側でそれを構成する方法、そして簡単なアプリケーションを作成する方法について説明します。


2前書き

JWSは、クライアントのWebブラウザ用のJava SEに付属するランタイム環境であり、Javaバージョン5以降使用されています。

WebサーバーからJNLPファイル(Java Network Launch Protocolとも呼ばれます)をダウンロードすると、この環境で、それによって参照されるJARパッケージをリモートで実行できます。

簡単に言うと、このメカニズムは、通常のJREインストールを使用してクライアントのコンピュータにJavaクラスをロードして実行します。それは同様にJava EEからの追加の指示を可能にします。ただし、セキュリティ制限はクライアントのJREによって厳密に適用され、通常は信頼できないドメイン、HTTPSの欠如、さらには署名されていないJARについてユーザーに警告します。

一般的なWebサイトからJNLPファイルをダウンロードしてJWSアプリケーションを実行できます。ダウンロードしたら、デスクトップのショートカットまたはJava Cache Viewerから直接実行できます。その後、JARファイルをダウンロードして実行します。

このメカニズムは、安全なファイル転送アプリケーション、電卓、安全なキーボード、ローカル画像ブラウザなど、Webベースではない(HTMLフリー)グラフィカルインタフェースを提供するのに非常に役立ちます。


3簡単なJNLPアプリケーション

良い方法は、アプリケーションを作成して通常のWebサーバー用のWARファイルにパッケージ化することです。必要なのは、(通常Swingを使用して)目的のアプリケーションを作成し、それをJARファイルにパッケージ化することだけです。このJARは、次に、通常はそのアプリケーションの

Main

クラスを参照、ダウンロード、および実行するJNLPとともにWARファイルにパッケージ化する必要があります。

以下に示すように、JWSを有効にするにはJNLPファイルが必要であることを除けば、WARファイルにパッケージされた通常のWebアプリケーションと違いはありません。



3.1. Javaアプリケーション


簡単なJavaアプリケーションを書くことから始めましょう:

public class Hello {
    public static void main(String[]args) {
        JFrame f = new JFrame("main");
        f.setSize(200, 100);
        f.setLocationRelativeTo(null);
        f.setDefaultCloseOperation(JFrame.EXIT__ON__CLOSE);
        JLabel label = new JLabel("Hello World");
        f.add(label);
        f.setVisible(true);
    }
}

これはかなり簡単なSwingクラスであることがわかります。実際、JWSに準拠させるためのものは何も追加されていません。



3.2. ウェブアプリケーション


このSwingクラスの例を以下のJNLPファイルとともにWARファイルにJARパッケージ化するだけです。

<?xml version="1.0" encoding="UTF-8"?>
<jnlp spec="1.0+"
  codebase="http://localhost:8080/jnlp-example">
    <information>
        <title>Hello</title>
        <vendor>Example</vendor>
    </information>
    <resources>
        <j2se version="1.2+"/>
        <jar href="hello.jar" main="true"/>
    </resources>
    <application-desc/>
</jnlp>

それを

hello.jndl

と名付けて、WARの任意のWebフォルダの下に配置しましょう。

JARとWARはどちらもダウンロード可能なので、JARを

lib

フォルダーに入れることを心配する必要はありません。

最終的なJARへのURLアドレスはJNLPファイルにハードコードされているため、配布に問題が生じる可能性があります。配備サーバーを変更すると、アプリケーションは機能しなくなります。

この記事の後半で、それを適切なサーブレットで修正しましょう。ここでは、ダウンロード用のJARファイルを

index.html

としてルートフォルダーに配置し、それをアンカー要素にリンクします。

<a href="hello.jnlp">Launch</a>

  • JARマニフェスト** にもメインクラスを設定しましょう。これは、

    pom.xml

    ファイルでJARプラグインを構成することによって実現できます。同様に、JARファイルは

    WEB-INF/lib

    の外側に移動します。これはダウンロード専用であり、クラスローダー用ではないためです。

<plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-jar-plugin</artifactId>
    ...
    <executions>
        <execution>
            <phase>compile</phase>
            <goals>
                <goal>jar</goal>
            </goals>
            <configuration>
                <archive>
                    <manifest>
                        <mainClass>
                            com.example.Hello
                        </mainClass>
                    </manifest>
                </archive>
                <outputDirectory>
                    ${project.basedir}/target/jws
                </outputDirectory>
            </configuration>
        </execution>
    </executions>
</plugin>


4特別な設定



4.1. セキュリティ上の問題


アプリケーションを実行するには、JARに署名する必要があります。有効な証明書を作成してJAR Sign Mavenプラグインを使用することはこの記事の範囲を超えていますが、開発目的のため、またはユーザーのコンピューターへの管理アクセスがある場合は、このセキュリティーポリシーを迂回することができます。

そのためには、ローカルURLを追加する必要があります(例えば:



http://localhost:8080


)は、アプリケーションが実行されるコンピュータ上のJREインストールのセキュリティ例外リストに追加されます。セキュリティタブのJavaコントロールパネル(Windowsではコントロールパネルから開くことができます)を開くと確認できます。


5

JnlpDownloadServlet




5.1. 圧縮アルゴリズム


私たちのWARに含めることができる特別なサーブレットがあります。利用可能であれば、JARファイルの最も圧縮されたコンパイル済みバージョンを探すことでダウンロードを最適化し、JLNPファイル上のハードコードされた

codebase

値も修正します。

JARはダウンロード可能になるので、Pack200などの圧縮アルゴリズムを使用してパッケージ化し、通常のJARとJAR.PACK.GZまたはJAR.GZのいずれかの圧縮バージョンを同じサーブレットに配布して、各ケースに最適なオプションを選択してください。

残念ながら、この圧縮アルゴリズム用のMavenプラグインの安定版はまだありませんが、JREに同梱されているPack200実行可能ファイルを使用することがあります(通常、パス\ \ {JAVA

SDK

HOME}/jre/bin/__にインストールされます)。

JNLPを変更せずに、

jar.gz

バージョンと

jar.pack.gz

バージョンのJARを同じフォルダに配置することによって、サーブレットはリモートJNLPからの呼び出しを取得した後でより良いものを選択します。これにより、ユーザーエクスペリエンスが向上し、ネットワークトラフィックが最適化されます。



5.2. コードベースの動的置換


サーブレットは、

<jnlp spec =” 1.0” codebase =”

http://localhost:8080/jnlp-example”&gt

;

タグ内のハードコードされたURLの動的置換も実行できます。 JNLPをワイルドカード

<jnlp spec =” 1.0” codebase =” $$ context”>

に変更することで、同じ最終レンダリングタグが配信されます。

サーブレットは、ワイルドカード

codebase__、__ hostname



name__、および__ site

でも機能します。これにより、“


http://localhost:8080/jnlp-example/


”、“

localhost:8080

”が解決されます。 “、“

hello.jnlp

”、および“


http://localhost:8080




5.3. クラスパスへのサーブレットの追加


サーブレットを追加するために、JARおよびJNLPパターン用の通常のサーブレットマッピングを

web.xml

に設定します。

<servlet>
    <servlet-name>JnlpDownloadServlet</servlet-name>
    <servlet-class>
        jnlp.sample.servlet.JnlpDownloadServlet
    </servlet-class>
</servlet>
<servlet-mapping>
    <servlet-name>JnlpDownloadServlet</servlet-name>
    <url-pattern>** .jar</url-pattern>
</servlet-mapping>
<servlet-mapping>
    <servlet-name>JnlpDownloadServlet</servlet-name>
    <url-pattern>** .jnlp</url-pattern>
</servlet-mapping>

サーブレット自体は、現在デモに配置されている一連のJAR(

jardiff.jar

および

jnlp-servlet.jar

)に入っています。

GitHubの例では、これらのファイルは

java-core-samples-lib

フォルダーに含まれており、Maven WARプラグインによってWebリソースとして含まれています。

<plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-war-plugin</artifactId>
    ...
    <configuration>
        <webResources>
            <resource>
                <directory>
                    ${project.basedir}/java-core-samples-lib/                </directory>
                <includes>
                    <include>** ** /** .jar</include>
                </includes>
                <targetPath>WEB-INF/lib</targetPath>
            </resource>
        </webResources>
    </configuration>
</plugin>


6. 最終的な考え

Java Web Startは、アプリケーションサーバーが存在しない(イントラネット)環境で使用される可能性があるツールです。また、ローカルユーザーファイルを操作する必要があるアプリケーション用です。

セキュリティ上の問題(HTTPS、署名付きJARなど)を除いて、アプリケーションは追加の依存関係や設定なしで、単純なダウンロードプロトコルによってエンドユーザに出荷されます。


Gitの例

では、この記事に記載されている完全なソースコードをダウンロードできます。 TomcatとApache Mavenを使ってGitHubから直接OSにダウンロードできます。ダウンロードしたら、ソースディレクトリから

mvn install

コマンドを実行し、生成された

jws.war

ファイルを

target

からTomcatインストールの

webapps

フォルダにコピーする必要があります。

その後は、通常どおりTomcatを起動できます。

デフォルトのApache Tomcatインストールから、この例はURL

http://localhost:8080/jws/index.htmlで利用可能になります。