1. 概要

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

ノート: JWSは、Java11以降のOracleJDKから削除されました。 別の方法として、OpenWebStartの使用を検討してください。

2. 序章

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

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

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

一般的なWebサイトから、JNLPファイルをダウンロードしてJWSアプリケーションを実行できます。 ダウンロードすると、デスクトップショートカットまたはJavaキャッシュビューアから直接実行できます。 その後、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に署名する必要があります。 有効な証明書を作成してJARSignMavenプラグインを使用することは、この記事の範囲を超えていますが、開発目的で、またはユーザーのコンピューターへの管理アクセス権がある場合は、このセキュリティポリシーをバイパスできます。

これを行うには、アプリケーションが実行されるコンピューター上のJREインストールのセキュリティ例外リストにローカルURL(たとえば、 http:// localhost:8080 )を追加する必要があります。 これは、[セキュリティ]タブの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 / [X224X ])。

JNLPを変更せずに、JARのjar.gzバージョンとjar.pack.gzバージョンを同じフォルダーに配置することにより、サーブレットは、リモートJNLP。 これにより、ユーザーエクスペリエンスが向上し、ネットワークトラフィックが最適化されます。

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

サーブレットは、ハードコードされたURLの動的置換を実行することもできます。 鬼ごっこ。 JNLPをワイルドカードに変更する 、同じ最終レンダリングタグを配信します。

サーブレットは、ワイルドカード $$ 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 )現在、JavaSDKダウンロードページのデモとサンプルセクションにあります。

GitHubの例では、これらのファイルは java-core-samples-lib フォルダーに含まれており、MavenWARプラグインによって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の例では、この記事で説明されている完全なソースコードをダウンロードできます。 GitHubからTomcatとApacheMavenを搭載したOSに直接ダウンロードできます。 ダウンロード後、ソースディレクトリから mvn install コマンドを実行し、生成されたjws.warファイルをtargetからwebappsにコピーする必要があります。 Tomcatインストールのフォルダー。

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

デフォルトのApacheTomcatインストールから、この例はURL http:// localhost:8080 / jws /index.htmlで入手できます。