Java Web Startガイド

Java Web Startのガイド

1. 概要

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

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パッケージ化することです。



    
        Hello
        Example
    
    
        
        
    
    

hello.jndlという名前を付けて、WARの任意のWebフォルダーの下に配置します。 JARとWARはどちらもダウンロード可能であるため、JARをlibフォルダーに配置することを心配する必要はありません。

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

この記事の後半で、適切なサーブレットを使用してこれを修正しましょう。 今のところ、ダウンロード用のJARファイルをルートフォルダーにindex.htmlとして配置し、アンカー要素にリンクします。

Let’s also set the main class in our JAR Manifest。 これは、pom.xmlファイルでJARプラグインを構成することで実現できます。 同様に、JARファイルはダウンロードのみを目的としているため、WEB-INF/libの外に移動します。 クラスローダー用ではありません:


    org.apache.maven.plugins
    maven-jar-plugin
    ...
    
        
            compile
            
                jar
            
            
                
                    
                        
                            com.example.Hello
                        
                    
                
                
                    ${project.basedir}/target/jws
                
            
        
    

4. 特別な構成

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

アプリケーションを実行するには、we need to sign the JAR。 有効な証明書を作成してJARSign Mavenプラグインを使用することはこの記事の範囲を超えますが、開発目的で、またはユーザーのコンピューターへの管理アクセス権がある場合は、このセキュリティポリシーをバイパスできます。

これを行うには、アプリケーションが実行されるコンピューター上の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/にインストールされています)で動作する可能性があります。

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

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

サーブレットは、<jnlp spec=”1.0+” codebase=”http://localhost:8080/jnlp-example”>タグ内のハードコードされたURLの動的置換を実行することもできます。 JNLPをワイルドカード<jnlp spec=”1.0+” codebase=”$$context”>に変更することにより、同じ最終レンダリングタグを配信します。

サーブレットはワイルドカードcodebase_, _hostnamename_ and _siteでも機能し、「http://localhost:8080/jnlp-example/」、「localhost:8080」、「hello.jnlp」、および「%(それぞれt5)s」。

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

サーブレットを追加するには、JARおよびJNLPパターンの通常のサーブレットマッピングをweb.xmlに構成しましょう。


    JnlpDownloadServlet
    
        jnlp.sample.servlet.JnlpDownloadServlet
    


    JnlpDownloadServlet
    *.jar


    JnlpDownloadServlet
    *.jnlp

サーブレット自体は、Java SDKダウンロードページのデモとサンプルセクションにあるJARのセット(jardiff.jarjnlp-servlet.jar)で提供されます。

GitHubの例では、これらのファイルはjava-core-samples-libフォルダーに含まれており、MavenWARプラグインによってWebリソースとして含まれています。


    org.apache.maven.plugins
    maven-war-plugin
    ...
    
        
            
                
                    ${project.basedir}/java-core-samples-lib/
                
                
                    **/*.jar
                
                WEB-INF/lib
            
        
    

6. 最終的な考え

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

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

Git Exampleでは、この記事で説明されている完全なソースコードをダウンロードできます。 GitHubからTomcatとApache Mavenを使用してOSに直接ダウンロードできます。 ダウンロード後、ソースディレクトリからmvn installコマンドを実行し、生成されたjws.warファイルをtargetからTomcatインストールのwebappsフォルダーにコピーする必要があります。

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

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