Rich Internet Application の開発および配備 > Rich Internet Application 配備アドバイス
目次
Java SE 6 update 10 リリース以降の Java Network Launch Protocol (JNLP) は、Rich Internet Application (RIA – アプレットと Java Web Start アプリケーション) を配備するための統一されたメカニズムを提供します。JNLP を使用して起動された RIA には、次のような、自由に使用できる強力な機能があります。
配備ツールキットスクリプトは、ブラウザの互換性の問題を回避できるように、RIA の配備に必要な HTML を自動生成する JavaScript 関数を提供します。開発者は、さまざまなブラウザにわたって一貫性のある方法でソリューションを配備するために、これらの関数を呼び出すようにしてください。
このスクリプトは、次の public 関数を含む、deployJava という名前の 1 つのオブジェクトを公開します。
createWebStartLaunchButton(jnlp, minimumVersion)
- 指定された JNLP URL の起動ボタンを出力します。このボタンがクリックされると、適切な JRE がインストールされたあと、JNLP アプリケーションを起動することが保証されます。createWebStartLaunchButtonEx(jnlp, minimumVersion)
- 指定された JNLP URL の起動ボタンを出力します。このボタンがクリックされると、適切な JRE がインストールされたあと、JNLP アプリケーションを起動することが保証されます。JNLP ファイルで codebase
属性の値を指定する必要はありません。この関数を使用するには、Java SE 6 update 18 リリースがクライアント上に存在する必要があります。Java SE 6 update 18 リリースがクライアント上に存在しない場合、ユーザーはその必要なソフトウェアをインストールするよう指示されます。getBrowser()
- 現在実行中のブラウザの名前を返します。getJREs()
- 現在インストールされている JRE のバージョン文字列の配列を返します。installJRE(requestVersion)
- 指定された requestVersion
、指定された requestVersion
に一致する最新バージョン、または最新の JRE のインストールをトリガーします。 installLatestJRE()
- 最新の JRE のインストールをトリガーします isPlugin2()
- 次世代 Java Plug-in がデフォルトかどうかを判定します。isWebStartInstalled(minimumVersion)
- 指定された minimumVersion
の Java Web Start のインストールが検出可能な場合は true を返します。 launch
- JNLP アプリケーションを起動します。runApplet(attributes, parameters, minimumVersion)
- 適切な JRE がインストールされていることを確認したあと、アプレットを実行します。 setAdditionalPackages(packageList)
- カーネルインストーラで使用される追加パッケージのリストを設定します。 setInstallerType(type)
- 優先するインストールのタイプ (null、online、kernel) を設定します。versionCheck(version)
- (getJREs()
関数で検出される JRE のうちで) 一致する JRE のバージョンが現在インストールされている場合は、true を返します。 writeAppletTag(attributes, parameters)
- 指定された属性とパラメータを含む applet タグを出力します。parameters 引数はオプションです。 これらの public 関数の詳しい説明については、人間が読める形式の配備ツールキットを参照してください。RIA の配備に関する詳細については、Java チュートリアルの次のレッスンを参照してください。
古い Java Plug-in では、アプレットは常にクライアントマシンにインストールされた最新版の JRE を使って実行されます。この動作の詳細については、古い配備セキュリティーポリシーを参照してください。
Java SE 6 update 10 リリースで導入された次世代 Java Plug-in では、指定された最小バージョンの JRE がまだクライアントにインストールされていなければ、配備ツールキットの使用時にオンラインのインストーラが自動的にダウンロードされるように指定できます。指定された最小バージョンの JRE が存在しない場合は、www.java.com
から最新版の JRE がダウンロードされます。
アプレットは、APPLET タグを使用して配備できます。配備を設定するためのパラメータは、APPLET タグへの属性およびパラメータとして指定できます。
deployJava
の runApplet()
関数を使用して、アプレットを起動する前に、クライアントマシン上で最小限の Java Runtime Environment が確実に使用可能になるようにします。
<script src="https://www.java.com/js/deployJava.js"></script> <script> var attributes = {codebase:'http://sample-url/Java2D', code:'java2d.Java2DemoApplet.class', archive:'Java2Demo.jar', width:710, height:540} ; var parameters = {fontSize:16, permissions:'sandbox'} ; var version = '1.6' ; deployJava.runApplet(attributes, parameters, version); </script>
上記のサンプルコードは、2 つのパラメータ (fontSize および permissions) を使ってアプレットを起動する方法を示しています。permissions パラメータは、そのアプレットがセキュリティーサンドボックス内で実行されるのか (値を sandbox
に設定する)、そのサンドボックスの外側にあるリソースへのアクセス権を必要とするのか (値を all-permissions
に設定する) を決めます。
Java カーネルおよび追加パッケージのインストールをトリガーするには、deployJava.runApplet() 関数の前に次の行を追加します。
deployJava.setInstallerType('kernel'); deployJava.setAdditionalPackages('javax.swing, javax.xml');
JNLP を使用してアプレットを配備するには、次のように、APPLET タグで jnlp_href パラメータを指定します。
<script src="https://www.java.com/js/deployJava.js"></script> <script> var attributes = { code:'java2d.Java2DemoApplet', width:710, height:540} ; var parameters = {jnlp_href: 'java2d.jnlp'} ; deployJava.runApplet(attributes, parameters, '1.6'); </script>
この例では、java2d.jnlp には、次の配備情報が含まれています。
<?xml version="1.0" encoding="UTF-8"?>
<jnlp href="java2d.jnlp">
<information>
<title>Java2D Demo</title>
<vendor>My Company, Inc.</vendor>
<offline-allowed />
</information>
<resources>
<j2se version="1.4+"
href="http://java.sun.com/products/autodl/j2se" />
<jar href="Java2Demo.jar" main="true" />
<!-- Specify if using JNLP extensions <extension name="SomeExtension"
href="http://some.server.com/some_extension.jnlp" /> -->
</resources>
<applet-desc
name="Java2D Demo"
main-class="java2d.Java2DemoApplet"
width="710"
height="540">
</applet-desc>
</jnlp>
古い Java Plug-in と新しい Java Plug-in で実行されるアプレットを配備するには、APPLET タグの属性と JNLP パラメータを次の例に示すように指定します。
var attributes = {codebase:'http://sample-url/Java2D', code:'java2d.Java2DemoApplet.class', archive:'Java2Demo.jar', width:710, height:540} ; var parameters = {fontSize:16, jnlp_href:'java2d.jnlp'} ; var version = '1.6' ; deployJava.runApplet(attributes, parameters, version);
APPLET タグと JNLP ファイルによって、同じ情報を指定するための重複したメカニズムが提供されます。たとえば、幅、高さ、コードなどを、JNLP ファイルと APPLET タグの両方の属性として指定できます。最終的な配備情報を決定するために、さまざまな属性に対して次の規則が適用されます。
width
および height
: これらの属性は常に、JNLP ファイルではなく <applet>
タグから取得されます。これは、Web ページ上に表示すべきアプレットの大きさはブラウザがもっともよく認識しており、ページに相対的な幅と高さ (たとえば、width="50%"
) をサポートできるのはブラウザのみであることを前提にしています。codebase
: 次のいずれかを実行することをお勧めします。
<applet>
タグがコードベースを暗黙的に指定できるようにするか、または詳細は、「コードベースの決定」を参照してください。
code
: <applet>
タグ内の code
属性は無視されます。<param>
タグを使用して指定されたアプレットパラメータはすべて、JNLP ファイルで指定されたアプレットパラメータとマージされます。<applet>
タグと JNLP ファイルの両方で同じパラメータが指定されている場合は、java_arguments
と java_version
パラメータを除き、<applet>
タグのパラメータが JNLP ファイルのパラメータを上書きします。java_arguments
パラメータと java_version
パラメータは JNLP アプレットでは必要ありません。代わりに、JRE バージョンを要求するか、またはコマンド行引数を JVM に引き渡すための JNLP ファイルのメカニズムが使用されます。JNLP ファイルからのコマンド行引数や JRE バージョン要求によって、アプレットの HTML で指定された値が上書きされます。<applet>
タグのpermissions
パラメータは無視されます。アプレットがセキュリティーサンドボックスに制限されるか、アクセス権を使って実行されるかは、JNLP ファイル内の <security>
タグによって決まります。 image
や boxbgcolor
など) を JNLP ファイルにではなく HTML に指定すると、Web ページがロードされるとただちに使用可能になり、最初に JNLP ファイルを個別にダウンロードする必要がなくなるのでお勧めです。
Java Web Start アプリケーションは、そのアプリケーションのタイトル、ベンダー、Java バージョン、jar ファイル、およびメインクラスのみを記述した JNLP ファイルを作成することによって簡単に配備できます。Java Web Start アプリケーションの JNLP ファイルの例を、次に示します。
<jnlp spec="0.2 1.0" codebase="http://sample-url/desktop/javawebstart/apps" href="notepad.jnlp"> <information> <title>Notepad App</title> <vendor>Sun Microsystems, Inc.</vendor> <homepage href="http://sample-url/desktop/javawebstart/demos.html"/> <description>Notepad Demo Description</description> <description kind="short">Notepad Demo Short Description</description> <icon href="images/notepad.gif"/> <offline-allowed/> </information> <resources> <j2se version="1.3+" href="http://javadl.sun.com/webapps/jawsautodl/AutoDL/j2se"/> <j2se version="1.3+"/> <jar href="notepad.jar" main="true" download="eager"/> </resources> <application-desc main-class="Notepad"/> </jnlp>
次に、Web ページでこの JNLP ファイルへのリンクを指定することによって、アプリケーションを簡単に配備できます。
<a href="http://sample-url/desktop/javawebstart/apps/notepad.jnlp">Launch Notepad</a>
JNLP ファイルにその他の多くの要素を追加すると、アプリケーションのユーザーの操作性、セキュリティー、および更新プロセスを制御したり、Java Network Launching Protocol (JNLP) のその他のいくつかの機能を利用したりすることができます。
アプリケーションで、特定のバージョンに追加された JNLP や Java Web Start の高度な機能を使用する場合は、Java Web Start を起動する前に少なくともそのバージョンが確実にインストールされているようにすることをお勧めします。
アプリケーションが (1.5.0 で導入された) SingleInstance Service を使用するとします。単に <jnlp spec="1.5.0" .../> と指定して、1.4.2 以前のみがインストールされているシステムでアプリケーションが失敗するのに任せるのではなく、deployJava JavaScript を使用して、Java Web Start を起動する前に少なくとも Version 1.5.0 がインストールされるように保証できます。
<script src="https://www.java.com/js/deployJava.js"></script> <script> var url = "http://sample-url/desktop/javawebstart/apps/notepad.jnlp"; deployJava.createWebStartLaunchButton(url, '1.5.0'); </script>
バージョンに対する特定の要件がないアプリケーションの場合は、minimumVersion を指定しないでこの関数を使用できます。
<script> var url = "http://sample-url/desktop/javawebstart/apps/notepad.jnlp"; deployJava.createWebStartLaunchButton(url); </script>
RIA のロード動作をカスタマイズして、スプラッシュ画面やカスタマイズされたロード進捗インジケータを提供することで、ロード処理中にエンドユーザーの注意を引き、測定可能な進捗情報を伝えます。詳細は、次のトピックを参照してください。
同じマシン上でさまざまな Java Plug-in アプレットを実行するために複数の JRE が必要な場合は、各 JRE をバージョン順にインストールすることをお勧めします。もっとも古いバージョンを最初にインストールし、もっとも新しいバージョンを最後にインストールするようにしてください。これにより、動的な clsid {8AD9C840-044E-11D1-B3E9-00805F499D93} が、マシン上の最新バージョンの JRE を使用していないオブジェクトタグで使用されるという問題が回避されます。
SSV のサポートを備えた JRE 5.0u6 からは、マシン上の最新バージョンの JRE が使用されるため、上の問題は発生しません。さらに、新しい動的なバージョンの clsid {CAFEEFAC-FFFF-FFFF-FFFF-ABCDEFFEDCBA} が追加されました。この新しい動的な clsid がオブジェクトタグで使用されている場合は、JRE のインストール順序とは独立に、最新バージョンの JRE が使用されます。
インストール順序は、Java Web Start には影響を与えないはずです。いずれの場合も、システム上のもっとも高いバージョンの JRE に、実行されるバージョンの Java Web Start が含まれます。
Java Web Start アプリケーションまたは Java Plug-in アプレットでアクセスされるリソースは、クライアントマシン上の配備キャッシュ内にキャッシュされる可能性があります。このキャッシュの形式または内容は、バージョンごとに変更される可能性があるため、これを前提にすることは良い方法ではありません。
スタンドアロンのプログラムを Java Web Start または Java Plug-in に移植するとき、コードが本質的に SystemClassLoader によってロードされることを前提にしていると、問題が発生することがあります。Java Plug-in では、リソースは PluginClassLoader (sun.applet.AppletClassLoader を拡張したもので、これは java.net.URLClassLoader を拡張する) によってロードされます。Java Web Start では、リソースは JNLPClassLoader (JDK 6 の時点では java.net.URLClassLoader を拡張する) によってロードされます。
使用されている ClassLoader にアクセスするには、次のコードを使用します。
ClassLoader cl = Thread.getCurrent().getContextClassLoader();
ClassLoader.getResource() によって URL が返されますが、この URL が FileURL に対する JarURL であることを前提にして、次に基盤となるファイルパスを検索するためにその FileURL を分解しようとするコードはすべて失敗します。リソースにアクセスするための正しい方法は、使用されている ClassLoader のタイプにかかわらず正しい内容を返す getResourceAsStream() を使用してリソースにアクセスすることです。リソースがすでにキャッシュされている場合は、そのリソースの内容がキャッシュから直接返されるため、リソース自体への余分なネットワーク接続は発生しません。
Java 配備キャッシュの内容を直接変更することはお勧めしません。キャッシュは Java Web Start/Java Plug-in の非公開実装であるため、いつでも変更される可能性があります。
多くのアプリケーションおよびライブラリは、プロパティーファイルやその他の「リソース」を、それらのリソースを使用している jar ファイルと同じディレクトリに含めることによって配備しようとし、次に getResource() から返された URL を分解してこれらのファイルへのパスを生成できることを期待します。開発者はこれが必要な理由として、アプリケーションがこれらのプロパティーファイルやその他の「リソース」を、そのアプリケーションの以降の起動での使用のためにあとで変更できるようにするためであると主張します。開発者は、Web 配備のアプリケーションに移植するときに、これらをアプリケーションの jar ファイルに再パッケージ化する必要があることに気付き、それが「デフォルトの」内容のみであると見なして、ほかのいくつかのメカニズムのうちの 1 つを使用して (ファイルを書き込むか、設定 API または JNLP PersistenceService のどちらかを使用することによって) クライアントマシン上の変更されたバージョンを持続させます。
アプリケーションが大きい場合は、そのアプリケーションのうちの起動に必要な部分のみをダウンロードしたあと、残りをオンデマンドでダウンロードすると有効なことがあります。このプロセスのことを、遅延ダウンロードと呼びます。
Java Web Start は遅延ダウンロードをサポートしていますが、これを使用している開発者はほとんどいません。アプリケーションによっては、この方法によって、ダウンロードや起動時間が大幅に改善される場合があります。遅延ダウンロードを効果的に使用するには、Java Web Start が、特定のリソースへの要求を解決するためにどの jar をダウンロードするかを認識している必要があります。以前のバージョンの Java Web Start でこの情報を提供するには、部品とパッケージの複雑な指定が必要でした。バージョン 6.0 からは、Jar インデックスを使用して同じ処理を実現できます。
Jar インデックスは、必要な jar のみをダウンロードするための簡単かつ効果的な方法であり、存在しないリソースが要求された場合にすべてをダウンロードすることを回避できます。「Jar インデックス」を参照してください。
Java Plug-in には遅延ダウンロードのサポートが組み込まれており (つまり、ダウンロードがデフォルトで遅延される)、さらに Jar インデックスもサポートしています。また、開発者も個々のクラスを使用しようとせずに、代わりにそれらを JAR としてパッケージ化するようにしてください。