Java Web Start

**Java Web Start**（ジャバウェブスタート）はJava製アプリケーションをウェブサーバなどから自動ダウンロード、自動インストール、自動アップデートして、サンドボックス上にて実行可能な仕組み。Java 5〜10に搭載され、Java 9にて廃止予定（deprecated）となり、Java 11で廃止された。

## 概要
Swing APIなどで記述されたGUIアプリケーションを実行できる。問題点が多いためにFlashよりも劣ると言われるJavaアプレットの代替リッチクライアントと言われている。

たとえば、ウェブブラウザでJava Web Startに対応したJavaアプリケーションへのリンクをクリックすると、Javaアプレットのようなブラウザ埋め込み型ではなくメディアプレーヤーなどの外部アプリケーションのようにJava Web Startが起動する。Java Web Startがインストールされていないときは、Java Web Startソフトウェア（Java Web Startの管理・実行ソフトウェア）が自動ダウンロード、自動インストールされる。JREがインストールされていないときは、それも自動的にインストールされる。さらに、JRE、Java Web Startそれぞれのバージョンが古いときは自動的にアップデートされる。また、Java Web Start対応Javaアプリケーションが古く、最新バージョンがサーバにアップロードされている場合は、実行前の事前確認により自動的にアップデートされる。

なお、Java Web Start対応Javaアプリケーションはローカルマシンに保存される。よって、二回目以降の起動は、ダウンロードなどが不要となり高速に起動できる。

現在のJava Web Start はOSとの協調動作も行なわれる。たとえば、Windowsにおいて「プログラムの追加と削除」を利用したJava Web Startアプリケーションのアンインストールが可能である。また、プログラムメニューやデスクトップへのショートカットアイコンの作成なども行なわれる。

## 実装
開発者はJNLP拡張子をつけた特別なXMLファイルを作る（JNLPファイル）。このファイルはアプリケーションの要求事項、コードの場所、パラメータ、および（もしあれば）追加的な権限を指定したものだ。ブラウザはこのファイルを他のファイルと同様にダウンロードし、（そのMIMEタイプとして指定された`application/x-java-jnlp-file`に従って）それをWeb Startツールで開く。Web Startツールは、必要なすべてのリソースをダウンロードし、アプリケーションを起動する。

Java Web Startは`[http://java.sun.com/products/javawebstart/docs/javadoc/index.html javax.jnlp]`パッケージ内の一連のクラス群を提供している。これらがアプリケーションに対して様々なサービスを提供する。これらのサービスのほとんどをSun社が設計した。その目的は、アプリケーションの動作を許可された操作の範囲内に制限しつつ、注意深く制御された範囲内のリソース（たとえばファイルや、システムクリップボードなど）にはアクセスを許可することにある。

サン・マイクロシステムズは2001年3月にWeb Startのバージョン1.0を導入した。一方、64ビット版Windowsへのサポートは、（64ビット版Javaが最初に使えるようになった時よりも後になって）Java 6のみで追加された。J2SE 1.4 以降、Web StartはJava実行環境（Java Runtime Environment、JRE）に`javaws`という名前でデフォルトで入ってくるようになったので、コンピュータ管理者は、Web Startを別途インストールする必要はもはやなくなった。

## Java Network Launching Protocol (JNLP)
プログラマーたちは **Java Network Launching Protocol** (**JNLP**)の同義語として"Web Start"という用語を使うことが多い。 JNLPプロトコルは、Java Web Startアプリケーションをどのように起動するかを指定するためのものであり、XMLスキーマで定義されている。JNLPは起動メカニズムをどのように正確に実装するかを定義する規約の集まりで構成されている。JNLPファイルはJARファイルの場所、アプリケーションのメインクラス名、その他のパラメータなどの情報を含んでいる。適切に設定されたブラウザはJNLPファイルをJREに渡し、するとJREがそのアプリケーションをユーザーのマシン上にダウンロードし、その実行を開始する。JNLP規約の開発は Java Community ProcessのJSR 56で行われた。最初の1.0版リリース以降、何度か保守リリースが行われている。

Web Startの重要な機能として、ユーザがJavaをインストールしていない場合には自動的にJREをダウンロードしてインストールする機能、またプログラムを実行させるべきJREのバージョンをプログラマーが指定できる機能などがある。ダウンロードしたプログラムは、ローカルに保持したキャッシュから実行されるため、ユーザーは、そのプログラムを実行するためにインターネットに接続し続ける必要はない。ソフトウェアのアップデートはウェブからダウンロードされ、ユーザーがインターネットに接続している時に利用可能になるので、デプロイの負担を軽減できる。

いかなるコンピュータでも単純にJNLPクライアント（最も一般的にはJava Web  Start）をインストールすることによりJNLPを使うことができる。このインストールも自動的に行わせることができるので、エンドユーザがJavaアプリケーションを最初に実行した時、クライアントのランチャーがダウンロードしてインストールするのをユーザーはみていればよい。

JNLPは HTTP/HTMLがウェブのために働くのと似た働きをする。HTTP/HTMLの仕組みでは、ユーザーがウェブのリンクをクリックすると、ウェブブラウザはURLをウェブサーバに送り、ウェブサーバがHTMLファイルを返してきて、ブラウザがHTMLで書かれたウェブページを表示する。次にブラウザはこのファイルが参照しているリソース（画像、CSSなど）を要求し、十分な情報を受け取ったら最終的にページを表示する。全てのリソースのダウンロードが終わる前にページの表示が始まる場合も多い。ページのレイアウトに不可欠ではない（画像のような）いくつかのリソースは、後で追加してもよい。

JNLPは、ウェブブラウザがウェブページを表示する上記の方式を模倣している。つまり、JNLPクライアントがJavaアプリを「表示」する。ユーザがウェブのリンクをクリックすると、ブラウザはURLをウェブサーバーに送り、ウェブサーバーは指定されたアプリの（HTMLファイルではなく）JNLPファイルを返す。JNLPクライアントはこのファイルを解釈し、指定されたリソース（jarファイル群）を要求し、必要な全てのリソースを取得できるまで待ってから、アプリを起動する。JNLPファイルはいくつかのリソースを「lazy」（遅延）指定する事ができる。これは、アプリ起動のためにそれらのリソースは必要ではないので、後でアプリがそれらを要求した時に取得すればいいことをJNLPクライアントに対して示す指定である。

## JNLPファイルの例
アプレットを起動するための単純なJNLPファイルの例を下に示す。この例では、コードベース、ソース、メインクラスとウィンドウサイズを指定している。JNLPファイルは、このような形で必要な情報を全て書き込んであり、それによって自己完結的にアプリを起動できるようになっている。この例では特別な権限を要求していないので、このコードはサンドボックス内で実行されることになる。また、このJNLPは、このアプリがオフラインで実行できること（キャッシュ済であれば）、またバックグラウンド・プロセスでアップデートされるべきことを指定している。


```xml
<?xml version="1.0" encoding="UTF-8"?>
<jnlp spec="1.0+" codebase="http://ultrastudio.org/upload" href="">
    <information>
        <title>Launch applet with Web Start</title>
        <vendor>Foo Bar Inc.</vendor>
        <offline-allowed/>
    </information>
    <resources>
        <j2se version="1.5+" href="http://java.sun.com/products/autodl/j2se"/>
        <jar href="Ray-2.3-4ca60e46-0956-3f22-983c-e3ed986dfd03.jar" main="true" />
    </resources>
    <applet-desc name="Ray diagram applet" main-class="raydiagramsapplet.Main" width="300" height="200">
    </applet-desc>
  <update check="background"/>
</jnlp>
```


## Pack200 圧縮
Java Web Startアプリケーションの大きさを減らすために、サン・マイクロシステムズはJava 1.5.0においてPack200という圧縮方式を導入した。この圧縮方式では、大きなjarファイルがjavaクラスだけを含む場合、そのjarファイルを元の9分の1の大きさまで圧縮できる。

Java Web Startが最初に登場したときはPack200をサポートしていたが、当初はこの機能をセットアップするために、サーバ側の協力と、ある程度の専門技術が必要であった。サン・マイクロシステムズが Java SE 6u10を導入したとき、Pack200サポートはサーバ側の特別なサポートの必要なしに使えるようになった。アプリケーション開発者はこの機能の有効/無効をJNLPファイルの中で設定できる。

遅い接続条件の下では、Pack200はアプリケーションの起動時間とダウンロード時間の性能を加速させる。

## 署名付き Web Start アプリ
デフォルト設定で Java Web Startアプリは「制限付き」で実行される。つまり、アプリはローカルファイルのようなある種のシステムリソースにはアクセス権がない。しかし、アプリ配布側がJDK付属の`jarsigner`ツールで Web Startアプリに署名しておき、ユーザ側がこの署名を受け入れて使うことに同意すれば、これらの制約を取り払うことができる。

## [[MIMEタイプ]]における拡張子
*.jnlp

## 作り方
Java Web Start対応Javaアプリケーションを作るには、作成したSwingアプリケーションに、Java Web Startの仕様に従って記述されたXML形式のファイル（拡張子*.jnlpファイル）を追加してウェブサーバにアップロードする。

## 類似技術
類似技術としてマイクロソフトが後発で開発したClickOnce（ノータッチデプロイメント）がある。

## 参考文献

## 外部リンク

* Java Web Start
* JSR 56 - JNLP 1.0, 1.5 and 6.0