![]() |
開発者ガイドJava TM Web Startバージョン 1.2 |
この「開発者ガイド」は、JavaTM Web Start および JNLP テクノロジを使用してアプリケーションを配備する方法を説明します。コメントおよびフィードバックの送付先 : javawebstart-feedback@sun.com
Java Web Start テクノロジ
Java Web Start のダウンロード
要件 (デスクトップおよびサーバ)
Web サイトの設定
自動インストール機能の使用
アプリケーション開発上の考慮点
パッケージ化による効率的なアプリケーション配備
このリリースでの使用に合わせた JNLP ファイルの変換
JNLP ファイルの構文
JNLP API の例
JNLP API (JavaDoc)
Java Web Start は、Web ブラウザに関連付けて使用するヘルパーアプリケーションです。ユーザが特別な起動ファイル (JNLP ファイル) を指すリンクをクリックすると、ブラウザが Java Web Start を起動します。Java Web Start は、指定された Java テクノロジベースのアプリケーションを自動的にダウンロード、キャッシュ、および実行します。通常すべての処理は自動的に完了し、ユーザは最初にクリックを 1 回するだけで済みます。技術的な面で、Java Web Start にはアプリケーションを配備するために使用するプラットフォームを魅力的にする多くの利点があります。
Java Web Start の基本となるテクノロジは、現在 Java Community Process (JCP) により開発が行われている、JavaTM Network Launching Protocol & API (JNLP) テクノロジです。Java Web Start は、JNLP 仕様のリファレンス実装 (RI) です。JNLP テクノロジでは、ほかの定義に加えて、JNLP ファイルと呼ばれる標準ファイル形式が定義されています。JNLP ファイルには、アプリケーションの起動方法が記述されます。
- Java Web Start は、Java 2 Platform, Starndard Edition (J2SE) プラットフォーム向けに作成されたアプリケーションの起動に特化して構築されています。このため、単一のアプリケーションを Web サーバで利用可能にしてから、Windows 98/NT/2000/ME/XP、Linux、および SolarisTM オペレーティング環境などのさまざまなプラットフォームに配備できます。Java プラットフォームは、非常に堅牢で、生産性が高く、また表現力豊かな開発プラットフォームであることが証明されてきました。さらに、開発およびテストに要するコストを最小限に抑えることができるため、大幅なコスト削減が可能になります。
- Java Web Start は、J2SE の複数のバージョンをサポートしています。このためアプリケーションは、J2SETM 1.4.0 のように、必要とする特定バージョンのプラットフォームを要求できます。複数のアプリケーションを、異なるバージョンのプラットフォームで競合を引き起こすことなく、同時に実行できます。また、アプリケーションがクライアントシステムにインストールされていないバージョンのプラットフォームを要求すると、Java Web Start は自動的にそのバージョンをダウンロードおよびインストールします。
- Java Web Start を使用すると、Web ブラウザとは別にアプリケーションを起動できます。これは、ブラウザからアプリケーションを起動するのが不便または不可能なオフライン操作で使用されます。デスクトップのショートカットを使用することにより、Web に配備されたアプリケーションを、ネイティブアプリケーションと同じ方法で起動できます。
- Java Web Start は、Java プラットフォーム固有のセキュリティ機構を利用します。アプリケーションは、デフォルトで、ローカルディスクおよびネットワークリソースへのアクセスが制限された保護環境 (「サンドボックス」) で実行されます。このため、ユーザは信頼できないソースから取得したアプリケーションでも安全に実行できます。
- Java Web Start から起動されたアプリケーションは、ローカルにキャッシュされます。このため、ダウンロード済みのアプリケーションの起動方法は、従来のインストール済みのアプリケーションの起動方法と同じです。
使用可能な Java Web Start のダウンロードについては、Java Web Start の Web サイト http://java.sun.com/products/javawebstart/ja/index_ja.html を参照してください。JNLP の仕様については、http://java.sun.com/aboutJava/communityprocess/jsr/jsr_056_jnlp.html を参照してください。
デスクトップ / クライアント要件
クライアントマシンは、Java 2 Runtime Environment (J2RE), version 1.2.2 以降をサポートしている必要があります。Java Web Start は、Windows 95/98/NT/2000/ME/XP、Solaris オペレーティング環境、および Linux で使用可能です。詳細は、「README」 ドキュメントを参照してください。
サーバ要件
標準的な Web サーバを使用して、アプリケーションを配備できます。Java Web Start を使用するには、次に説明する方法で、新規 MIME タイプをサポートするように Web サーバを構成する必要があります。
Java Web Start は、HTTP プロトコルや Web サーバなど、既存のインターネットを利用します。このため、HTML ベースのコンテンツを配備するための既存のインフラストラクチャを、Java Web Start を使用して Java テクノロジベースのアプリケーションを配備することに再利用できます。アプリケーションをクライアントマシンに配備するためには、アプリケーションを含むすべてのファイルが Web サーバ経由でアクセス可能でなければなりません。通常、これは、1 つ以上の JAR ファイルを JNLP ファイルと共に Web サーバのディレクトリにコピーすることを意味します。Java Web Start をサポートするための Web サイトの設定要件は、HTML ベースのコンテンツを配備する場合と非常に似ています。1 つだけ注意が必要なのは、Web サーバで新規 MIME タイプを設定する必要があることです。
1. Java Web Start の MIME タイプを使用するように Web サーバを構成する
拡張子 .jnlp を持つすべてのファイルが application/x-java-jnlp-file MIME タイプに設定されるように、Web サーバを構成します。
たいていの Web ブラウザは、Web サーバからコンテンツと共に返される MIME タイプを使って、特定のコンテンツの処理方法を決定します。Java Web Start の呼び出しを有効にするには、サーバが JNLP ファイルに対して application/x-java-jnlp-file MIME タイプを返す必要があります。
Web サーバごとに、MIME タイプを追加する特定の方法があります。たとえば、Apache Web サーバでは、.mime.types 構成ファイルに次の行を追加する必要があります。
application/x-java-jnlp-file JNLP
使用する Web サーバの仕様については、マニュアルを参照してください。
2. アプリケーション用の JNLP ファイルを作成する
このファイルを作成するもっとも簡単な方法は、既存の JNLP ファイルを要件に合わせて変更することです。
JNLP ファイルの構文および書式については、後述の節で説明します。
3. アプリケーションを Web サーバからアクセス可能にする
アプリケーションの JAR ファイルおよび JNLP ファイルが、JNLP ファイルに記述された URL でアクセス可能であることを確認してください。
4. Web ページから JNLP ファイルへのリンクを作成する
JNLP ファイルへのリンクは、標準の HTML リンクです。次に例を示します。
<a href="MyApp.jnlp">Launch My Application</a>
ステップ 1 の設定に基づき、Web サーバは、拡張子 .jnlp を持つすべてのファイルとともに、自動的に application/x-java-jnlp-file MIME タイプを返します。このファイルのダウンロード時に、Web ブラウザにより Java Web Start が起動することを確認することが重要です。
Java Web Start インストールプログラムへのリンクも、Web ページに設定しておく必要があります。これにより、Java Web Start をまだインストールしていないユーザは、このソフトウェアをダウンロードおよびインストールできます。
Java Web Start がインストールされているかどうかを確認する
数行の JavaScript/VBScript を HTML ページに追加することにより、Java Web Start がインストールされているかどうかを確認できます。次に示すサンプルスクリプトを使用して、アプリケーションへのリンクを挿入します。
<SCRIPT LANGUAGE="Javascript">
<!--
insertLink("http://www.mycompany.com/my-app.jnlp",
"My Application");
// -->
</SCRIPT>このサンプル JavaScript では、Java Web Start が Gecko ベースのブラウザ (Netscape 6.x など) にインストールされているかどうかを検出できないことに注意してください。
insertLink メソッドは、Java Web Start がインストールされているかどうかを検出します。インストール済みの場合、HTML は、次のようになります。
<a href="http://www.mycompany.com/my-app.jnlp">My Application</a>
Java Web Start がインストールされていない場合、次の HTML が発行されます。
Need to install Java Web Start
実稼働環境では、通常この HTML をダウンロードページにリンクさせる必要があります。
サンプルの JavaScript/VBScript を次に示します。
<!---- This initializes the navigator.family object ----> <SCRIPT LANGUAGE="JavaScript"> SRC="xbDetectBrowser.js"> </SCRIPT>
<SCRIPT LANGUAGE="JavaScript">
var javawsInstalled = 0;
isIE = "false";if (navigator.mimeTypes && navigator.mimeTypes.length) {
x = navigator.mimeTypes['application/x-java-jnlp-file'];
if (x) javawsInstalled = 1;
} else {
isIE = "true";
}function insertLink(url, name) {
<!-- Developers should be aware that for Gecko-based browsers (NS 6.x) -->
<!-- Java Web Start might not be installed ------------------------------>
if (javawsInstalled || navigator.family == 'gecko') {
document.write("<a href=" + url + ">" + name + "</a>");
} else {
document.write("Need to install Java Web Start");
}
}
</SCRIPT><SCRIPT LANGUAGE="VBScript">
on error resume next
If isIE = "true" Then
If Not(IsObject(CreateObject("JavaWebStart.IsInstalled"))) Then
javawsInstalled = 0
Else
javawsInstalled = 1
End If
End If
</SCRIPT>上記のサンプルスクリプトでは、ブラウザ検出スクリプトである xbDetectBrowser.js を実行します。xbDetectBrowser.js の内容は、xbDetectBrowser.html ファイルとしてこのガイドに含まれています。ファイルは、ブラウザで参照できるように HTML ファイル形式になっているので、このスクリプトを実際に使用するときは、HTML タグを削除し、ファイル名を xbDetectBrowser.html から xbDetectBrowser.js に変更してください。
Java Web Start バージョン 1.2 では「ワンクリック」による自動インストールが可能であり、このインストール方法を使用すれば、Java Web Start を入手する必要のあるエンドユーザの操作性を改善できます。
注意 : この機能は、Microsoft Windows プラットフォームでのみ利用できます。
この新機能を利用するには、開発者が、アプリケーションを提供する Web ページにいくつかのスクリプトを実装しなければなりません。そのスクリプトでは、エンドユーザのブラウザが Netscape Navigator と Internet Explorer のどちらであるか、およびシステムにすでに Java Web Start がインストールされているかどうかを判別します。その判別の結果に応じて、アプリケーションの Web ページ上の別のスクリプトが、Java Web Start を自動的にダウンロードしてインストールしたあと、アプリケーションをダウンロードしてインストールします。
Netscape Navigator ブラウザ用の JavaScript
JavaScript の最初のコードは、次のようになります。このスクリプトでは、エンドユーザのブラウザが Internet Explorer であるかどうかを判別し、その場合は変数 isIE に true を設定します。一方、ブラウザが Netscape Navigator である場合は false を設定します。さらに、ブラウザが Netscape Navigator である場合は、MIME マップをチェックして、Java Web Start のいずれかのバージョンがインストールされているかどうかを判別します。インストールされている場合は、変数 javawsInstalled および javaws12Installed に 1 を設定します。このスクリプトでは、インストールされている Java Web Start のバージョンを区別することはできません。<SCRIPT LANGUAGE="JavaScript"> var javawsInstalled = 0; var javaws12Installed = 0; isIE = "false"; if (navigator.mimeTypes && navigator.mimeTypes.length) { x = navigator.mimeTypes['application/x-java-jnlp-file']; if (x) { javawsInstalled = 1; javaws12Installed=1; } } else { isIE = "true"; } </SCRIPT>Internet Explorer ブラウザ用の VBScript
上記の JavaScript のあとに、Internet Explorer で変数を設定する VBScript が続きます。この VBScript は、先行する JavaScript からの変数 isIE が true である場合、つまりエンドユーザのブラウザが Internet Explorer である場合に実行されます。このスクリプトでは、JavaWebStart.dll の「isInstalled」COM オブジェクトのインスタンスを生成し、このオブジェクトによって次の 2 点を判別します。<SCRIPT LANGUAGE="VBScript"> on error resume next If isIE = "true" Then If Not(IsObject(CreateObject("JavaWebStart.isInstalled"))) Then javawsInstalled = 0 Else javawsInstalled = 1 End If If Not(IsObject(CreateObject("JavaWebStart.isInstalled.2"))) Then javaws12Installed = 0 Else javaws12Installed = 1 End If End If </SCRIPT>Java Web Start 1.2 がインストールされている場合、スクリプトは変数 javawsInstalled と javaws12Installed の両方に 1 を設定します。1.2 以前の Java Web Start 製品だけがインストールされている場合は、javawsInstalled に 1 が設定され、javaws12Installed には 0 が設定されます。どのバージョンの Java Web Start ソフトウェアもインストールされていない場合は、両方の変数に 0 が設定されます。
- クライアントのマシンに Java Web Start の最新バージョン (1.2) がインストールされているかどうか。
- クライアントのマシンに Java Web Start のいずれかのバージョンがインストールされているかどうか (バージョン番号は問わない)。
自動ダウンロードの開始
上記の 2 つのスクリプトが実行されたあと、変数 javawsInstalled と javaws12Installed は、次の基準で 1 か 0 に設定されます。
javawsInstalled javaws12Installed Internet Explorer Java Web Start のいずれかのバージョンがインストールされていれば 1、そうでなければ 0 Java Web Start 1.2 がインストールされていれば 1、そうでなければ 0 Netscape Navigator Java Web Start のいずれかのバージョンがインストールされていれば 1、そうでなければ 0 Java Web Start のいずれかのバージョンがインストールされていれば 1、そうでなければ 0 以下の JavaScript では、この情報を使用して、Java Web Start ソフトウェアの自動ダウンロードを開始するか、それともアプリケーションの jnlp ファイルへのリンクを提供するだけにするかを判断できます。以下にサンプルを示します (以下のサンプルスクリプトでは、開発者のアプリケーションが www.yyy.zzz という Web アドレスのサーバに置かれているものとします)。
(上記のコード例で、? と & のあとの改行は、読みやすくするために挿入したものです。実際のスクリプトでは、href の文字列には途中に改行を入れないでください。)<!---- This initializes the navigator.family object ----> <SCRIPT LANGUAGE="JavaScript"> SRC="xbDetectBrowser.js"> </SCRIPT> <SCRIPT LANGUAGE="JavaScript"> <!-- Developers should be aware that for Gecko-based browsers (NS 6.x) --> <!-- Java Web Start might not be installed ------------------------------> if (javawsInstalled || navigator.family == 'gecko') { document.write("<a href=http://www.yyy.zzz/app.jnlp>Launch the application</a>"); } else { document.write("Click "); document.write("<a href=http://dlres.java.sun.com/PluginBrowserCheck? pass=http://www.yyy.zzz/download.html& fail=http://java.sun.com/cgi-bin/javawebstart-platform.sh>here</a> "); document.write("to download and install the Java Web Start product and the application."); } </SCRIPT>上記のサンプルスクリプトでは、ブラウザ検出スクリプトである xbDetectBrowser.js を実行します。xbDetectBrowser.js の内容は、xbDetectBrowser.html ファイルとしてこのガイドに含まれています。ファイルは、ブラウザで参照できるように HTML ファイル形式になっているので、このスクリプトを実際に使用するときは、HTML タグを削除し、ファイル名を xbDetectBrowser.html から xbDetectBrowser.js に変更してください。
javawsInstall が 1 である場合、つまりクライアント上ですでに Java Web Start を利用できる場合は、スクリプトはアプリケーションの jnlp ファイルへのリンクを提供します。一方、クライアント上に Java Web Start がインストールされていない場合、スクリプトは、java.sun.com Web サイト上の PluginBrowserCheck プログラムへのリンクを提供します。PluginBrowserCheck は、クライアントが Microsoft Windows プラットフォーム上で Internet Explorer を使用しているかどうかをチェックします。使用している場合は、PluginBrowserCheck はユーザを http://www.yyy.zzz/download.html に送ります。
download.html ファイルは、開発者によってサーバ上に用意されます。このファイルには特殊な OBJECT および PARAM タグが含まれ、Java Web Start の自動インストールプログラムをクライアントマシンにダウンロードするのに使用されます。Java Web Start と一緒に、ActiveX コントロールがクライアントにダウンロードされます。この ActiveX コントロールは、新しくインストールされた Java Web Start を使用してアプリケーションを起動します。以下に示すのは、サンプルの download.html ファイルです。
<HTML> <BODY> <OBJECT CODEBASE="http://java.sun.com/products/javawebstart/autodl/jinstall_javaws-1_2-windows-i586.cab" CLASSID="clsid:5852F5ED-8BF4-11D4-A245-0080C6F74 284" HEIGHT=0 WIDTH=0> <PARAM NAME="app" VALUE="http://www.yyy.zzz/app.jnlp"> <PARAM NAME="back" VALUE="true"> <!-- Alternate HTML for browsers which cannot instantiate the object --> <A HREF="http://java.sun.com/cgi-bin/javawebstart-platform.sh?"> Download Java Web Start</A> </OBJECT> </BODY> </HTML>この OBJECT タグでは、Java Web Start 1.2 の自動インストールプログラムを含む cab ファイルを取得します。この cab ファイルには、Java Runtime Environment (JRE) は含まれていないので、この自動ダウンロード機能を使用する前に JRE のインストールを済ませておく必要があります。PARAM タグには、アプリケーションの jnlp ファイルの位置を指定します。これにより、クライアント上に Java Web Start がインストールされたあと、アプリケーションを自動的に起動できます。
JavaScript の例に話を戻します。PluginBrowserCheck による判別の結果、エンドユーザが Microsoft Windows 上で Internet Explorer を実行していない場合、エンドユーザは java.sun.com 上のシェルスクリプトにリダイレクトされ、適当な Java Web Start の手動ダウンロードページが呼び出されます。
一般に、Java Web Start を使って配備可能なアプリケーションを開発することは、Java 2 プラットフォームでスタンドアロンアプリケーションを開発することと同じです。このため、アプリケーションのエントリポイントは、標準的な public static void main(String[] argv) です。ただし、Web 配備機能 (アプリケーションの自動ダウンロードおよび自動起動) をサポートし、確実にセキュリティ保護された「サンドボックス」内でアプリケーションを実行するためには、考慮すべき点がいくつかあります。
- アプリケーションを、JAR ファイルのセットとして配信する必要があります。
- すべてのアプリケーションリソース (ファイルやイメージなど) を JAR ファイル内に格納し、Java 2 プラットフォームの getResource 機構を使用して参照する必要があります (以下を参照)。
- アプリケーションが、セキュリティ保護された「サンドボックス」内で実行されるように記述されている場合、次の制限に従う必要があります。
- ローカルディスクへのアクセスを行わない。
- すべての JAR ファイルを同じホストからダウンロードする。
- JAR ファイルのダウンロード元ホストへのネットワーク接続だけが許可される。
- セキュリティマネージャはインストールできない。
- ネイティブライブラリは使用しない。
- システムプロパティへのアクセスは制限される。アプリケーションは、JNLP ファイルで定義されたすべてのシステムプロパティに、読み取りおよび書き込みのアクセス権を持つ。また、アプレットがアクセス可能なプロパティセットには、読み取り専用のアクセス権を持つ。
アプリケーションは、System.exit 呼び出しを使用できます。
- システムへの無制限のアクセスを必要とするアプリケーションは、署名付きの JAR ファイルセットで配信する必要があります。各 JAR ファイル内のすべてのエントリで署名が必要です。
JAR ファイルからのリソースの取得
Java Web Start は、Web サーバからクライアントマシンへ JAR ファイルの転送のみを行います。Java Web Start は、JAR ファイルをローカルマシン内のどこに格納するかを決定します。このため、アプリケーションは、イメージや構成ファイルなどのリソースへのディスク相対参照を使用することはできません。すべてのアプリケーションリソースは、JNLP ファイルの resources セクションで指定された JAR ファイルから取得するか、または Web サーバへの HTTP 要求を使用して明示的に取得する必要があります。JAR ファイルは Java Web Start によりローカルマシンにキャッシュされるため、リソースを JAR ファイルに含めることをお勧めします。
次のコード例は、JAR ファイルからイメージを抽出する方法を示します。
// Get current classloader
ClassLoader cl = this.getClass().getClassLoader();
// Create icons
Icon saveIcon = new ImageIcon(cl.getResource("images/save.gif"));
Icon cutIcon = new ImageIcon(cl.getResource("images/cut.gif"));
...この例では、アプリケーション用の JAR ファイルのいずれかに、次のエントリが存在することを前提にしています。
images/save.gif
images/cut.gifセキュリティおよびコード署名
Java Web Start は、次のようなセキュリティ上の問題に対応しています。Java Web Start で起動されるアプリケーションは、デフォルトで、ローカルなコンピュータリソース (記憶装置やローカルネットワークなど) へのアクセスが制限された環境内で実行されます。この「サンドボックス」環境により、Java Web Start は、ダウンロードされた、信頼できないアプリケーションがローカルのファイルまたはネットワークのセキュリティを低下させないことを保証できます。
- ローカルファイルに影響を与える可能性のある悪意のあるコード (意図的であっても、意図的でなくても) からユーザを保護する。
- ネットワーク上のデータへアクセスしたり、破壊したりするコードから企業を保護する。
Java Web Start がサポートするもう 1 つのセキュリティ機能は、デジタルコード署名です。呼び出し中のアプリケーションが 1 つ以上の署名付き JAR ファイルで配信される場合、Java Web Start は JAR ファイルの内容が署名されたあとで変更されていないことを確認します。Java Web Start によるデジタル署名の検証で問題があった場合、第三者によりセキュリティが侵害された可能性があるため、アプリケーションは実行されません。
コード署名のサポートは、ユーザとアプリケーションサービスプロバイダの両者にとって重要です。このサービスにより、ユーザはアプリケーションの提供元が信頼できることを確認できます。コードに署名を行うのはアプリケーションサービスプロバイダであるため、ユーザもアプリケーションサービスプロバイダも、第三者が Web 上でそのアプリケーションに扮することができないことを保証されています。ユーザにより信頼された署名付きのアプリケーションは、ローカルディスクへのアクセスなど、システム権限の追加を要求することもできます。
Java Web Start は、アプリケーションを起動する前に、署名者の証明書に基づいて、アプリケーションの出所を示すダイアログを表示します。これにより、ユーザは情報を取得した上で、ダウンロードしたコードに追加権限を許可するかどうかを決定できます。
すべての JAR ファイルが署名されている場合、JNLP ファイル内に次の設定を含めることにより、アプリケーションからクライアントシステムへのフルアクセスを要求できます。
<security>
<all-permissions/>
</security>Java Web Start でのコード署名の実装は、コア Java 2 プラットフォームのセキュリティ API に基づいています。J2RE 1.2.x は、SHAwithSDA アルゴリズムを使用したコード署名をサポートします。J2RE 1.3 は、MD2withRSA および MD5withRSA もサポートします。MD5withRSA は、現在もっとも頻繁に使用されるアルゴリズムです。
開発者は、Java Web Start での使用を可能にするために、Java アプレットの場合と同様に、Java 2 SDK (J2SDK) の標準 jarsigner ツールを使用してコードに署名します。jarsigner ツールのマニュアルには、コードの署名方法、テスト証明書の作成方法、および署名に関連するほかの問題の解決方法が、実例付きで説明されています。
Java Web Start は、J2RE 1.3.0 とともに使用する場合、Netscape signtool の使用もサポートします。詳細は、Netscape の Web サイト http://developer.netscape.com/software/signedobj/ を参照してください。
テスト証明書を使用した JAR ファイルの署名
ここでは、テスト証明書を使用して、JAR ファイルの署名を行う方法について説明します。
- J2SDK 1.2 または J2SDK 1.3 の keytool および jarsigner へのパス (J2SDK の bin ディレクトリ) が設定されていることを確認します。
- 次の方法で、キーストアに新規キーを作成します。
keytool -genkey -keystore myKeystore -alias myself新規キーの情報 (パスワード、名前など) の入力が求められます。入力した情報に基づいて、ディスク上に myKeystore ファイルが作成されます。
- 次に、自己署名テスト証明書を次の方法で作成します。
keytool -selfcert -alias myself -keystore myKeystoreパスワードの入力が求められます。証明書の生成には、数分かかります。
- 設定が適切であることを確認します。キーストアの内容を一覧表示するには、次のコマンドを使用します。
keytool -list -keystore myKeystoreコマンドの実行結果は、次のようになります。Keystore type: jks
Keystore provider: SUN
Your keystore contains 1 entry:
myself, Tue Jan 23 19:29:32 PST 2001, keyEntry,
Certificate fingerprint (MD5):
C2:E9:BF:F9:D3:DF:4C:8F:3C:5F:22:9E:AF:0B:42:9D
- 最後に、テスト証明書を使って JAR ファイルへの署名を行います。
jarsigner -keystore myKeystore test.jar myselfすべての JAR ファイルに対して、この手順を繰り返します。
自己署名テスト証明書は、ユーザの識別情報に関する保証を一切提供するものではないため、信頼することはできません。このため、自己署名テスト証明書は、内部でのテスト目的にのみ使用してください。アプリケーションを生産する際には、信頼できる証明書を使用する必要があります。信頼できる証明書は、VeriSign などの証明書発行機関から取得できます。
JNLP ファイルを UTF-8 に符号化する方法
Java Web Start バージョン 1.2 より、JNLP ファイルに J2SE プラットフォームでサポートされる任意の文字エンコーディングを使用できるようになりました (サポートされているエンコーディングの一覧は、J2SE ドキュメントを参照してください)。
JNLP ファイルの XML 宣言でエンコーディングを指定します。 たとえば、次の行は、JNLP ファイルが UTF 16 でエンコードされることを示しています。
XML 宣言そのものは、UTF-8 でエンコードされる必要があります。<?xml version="1.0" encoding="utf-16"?>
開発者向けパックには、JNLP アプリケーションを Web アーカイブ (WAR) ファイルにバンドルする際に使用可能なサーブレットが含まれます。詳細は、「Web アーカイブでの JNLP アプリケーションのパッケージ化」を参照してください。
1.0 および このリリースとの間には、JNLP ファイル形式の変更はありません。1.0 より前のバージョンの Java Web Start と互換性がある JNLP ファイルを使用している場合、JNLP ファイル形式が大幅に変更されたことに留意してください。以下に示す変更点は、0.4 JNLP ファイルを Java Web Start 1.0 以上と互換性を持たせるために、適用する必要のあるもっとも一般的なものです。
- spec 属性 を 1.0 に設定する。
- unrestricted 要素の名前を all-permissions に変更する。
- jre 要素の名前を j2se に変更し、この要素を resources 要素の内部に移動する (つまり、j2se を resources のサブ要素にする)。
1.0 ベータリリースまたは 1.0-rc リリースで使用された JNLP ファイルを変換する場合に必要なのは spec 属性を「1.0」に更新することだけです。
このリリースで使用される書式は、Java Network Launching Protocol and API (JNLP) Specification, v1.0 で指定された書式に基づいています。この「開発者ガイド」では、JNLP ファイルでもっとも一般的に使用される要素について説明します。書式の詳細については、「Specification」を参照してください。JNLP ファイルは、XML ドキュメントです。JNLP ファイルの完全な例を次に示します。
<?xml version="1.0" encoding="utf-8"?>
<!-- JNLP File for SwingSet2 Demo Application -->
<jnlp
spec="1.0+"
codebase="http://javaweb.eng.com/jaws/apps"
href="swingset2.jnlp">
<information>
<title>SwingSet2 Demo Application</title>
<vendor>Sun Microsystems, Inc.</vendor>
<homepage href="docs/help.html"/>
<description>SwingSet2 Demo Application</description>
<description kind="short">A demo of the capabilities of the Swing Graphical User Interface.</description>
<icon href="images/swingset2.jpg"/>
<icon kind="splash" href="images/splash.gif"/>
<offline-allowed/>
</information>
<security>
<all-permissions/>
</security>
<resources>
<j2se version="1.3"/>
<jar href="lib/SwingSet2.jar"/>
</resources>
<application-desc main-class="SwingSet2"/>
</jnlp>以下は、この例に沿って説明します。ルート要素は jnlp で、4 つのサブ要素 information、security、resources、および application-desc を保持します。さらに Java Web Start は、applet-desc 要素を使用したアプレットの起動もサポートします。要素の詳細は、以下で説明します。
JNLP 要素
spec 属性 : このリリースで機能するには、この属性は 1.0 以上である必要があります。デフォルト値は「1.0+」であるため、通常この属性は省略可能です。
codebase 属性 : JNLP ファイルの href 属性で指定される相対 URL はすべて、この URL を基本に作成されます。
href 属性 : JNLP ファイル自体の位置を指す URL です。アプリケーションをアプリケーションマネージャに含めるために、Java Web Start でこの属性を設定する必要があります。
information 要素
title 要素 : アプリケーションの名前。vendor 要素 : アプリケーションベンダーの名前。
homepage 要素 : アプリケーションのホームページを示す URL である、単一の href 属性を含みます。これは、アプリケーションマネージャが、アプリケーションの詳細情報を得ることのできる Web ページをユーザに示す際に使用されます。
description 要素 : アプリケーションに関する短い説明文。description 要素はオプションです。kind 属性は、この要素の使用方法を定義する属性で、次の値のいずれかを設定できます。
指定できるのは、各種類ごとに 1 つの description 要素だけです。kind 属性のない description 要素は、デフォルト値として使用されます。このため、Java Web Start が kind 属性の short の description 要素を必要とするが、これが JNLP ファイルで指定されていない場合、属性のない description 要素のテキストが使用されます。
- one-line: アプリケーションへの参照がリストまたはテーブルの 1 行に表示される場合、この説明が使用されます。
- short: アプリケーションへの参照が段落で表示される場合、この説明が使用されます。
- tooltip: ツールヒントとして表示される、アプリケーションの説明です。
すべての description 要素には、プレーンテキストが使用されます。HTML タグなどの書式はサポートされません。
icon 要素 : GIF または JPEG 形式のイメージファイルへの HTTP URL が含まれます。Java Web Start が起動すると、アイコンは、アプリケーションマネージャ内、およびデスクトップのショートカットとしてユーザに表示されます。アイコンは、ダウンロード時には 64x64 で表示され、デスクトップアイコンおよびアプリケーションマネージャ内では 32x32 で表示されます。Java Web Start は、アイコンを自動的に適切なサイズに変更します。
オプションの width および height 属性は、イメージのサイズ指定に使用できます。
オプションの kind="splash" 属性をアイコン要素で使用すると、アプリケーションの起動時にイメージが「スプラッシュ」画面として使用されます。JNLP ファイルに kind="splash" 属性をもつ icon 要素が含まれておらず、別の icon タグが含まれている場合、Java Web Start は、左側にその icon 要素で指定されたイメージ、右側にアプリケーションのタイトルとベンダーという構成のスプラッシュ画面を表示します。
JNLP ファイルに icon イメージが含まれていない場合、スプラッシュイメージは、JNLP ファイルから取得されたアプリケーションのタイトルおよびベンダー情報で構成されます。
スプラッシュイメージは、Java Web Start で定義された枠で囲まれます。
JNLP ファイルの icon 要素を追加または変更したあとの初回起動時には、表示されるスプラッシュイメージに変更が反映されません。新しいスプラッシュイメージは、アプリケーションを 2 回目以降に起動したときに表示されます。
offline-allowed 要素 : オプションの offline-allowed 要素は、アプリケーションをオフラインで起動可能かどうかを示します。
アプリケーションマネージャでオフラインチェックボックスがチェックされている場合、JNLP ファイル内でオフラインのマークが付けられていないアプリケーションを、アプリケーションマネージャから起動することはできません。デフォルトでは、クライアントシステムがオンラインの場合にのみ、アプリケーションが動作します。
offline-allowed 要素は、Java Web Start がアプリケーションの更新をチェックする方法も制御します。要素が指定されていない (つまり、アプリケーションをオンラインで実行する必要がある) 場合、Java Web Start は常に更新されたバージョンがあるかどうかをチェックしてから、アプリケーションを起動します。更新されたバージョンが見つかると、新しいアプリケーションがダウンロードおよび実行されます。このように、最新バージョンのアプリケーションの実行が常に保証されます。ただし、オフラインの場合、アプリケーションを実行することはできません。
offline-allowed が指定されると、Java Web Start は更新されたバージョンがあるかどうかをチェックします。ただし、ダウンロード済みのアプリケーションが存在する場合、チェックは数秒後にタイムアウトし、キャッシュされたアプリケーションの起動が実行されます。このため、サーバへの接続が高速な場合には、たいていは最新バージョンのアプリケーションが実行されますが、常にそれが保証されるわけではありません。ただし、オフラインでの起動はサポートされます。
security 要素
デフォルトでは、各アプリケーションは、アプレットの「サンドボックス」と同様の制限された実行環境で動作します。security 要素は、無制限のアクセスを要求する場合に使用できます。all-permissions 要素が指定された場合、アプリケーションから、クライアントマシンおよびローカルネットワークへのあらゆるアクセスが可能になります。アプリケーションがフルアクセスを要求する場合、すべての JAR ファイルに署名が必要です。アプリケーションの初回起動時に、ユーザは証明書に同意するよう求められます。
resources 要素
resources 要素は、アプリケーションを構成するすべてのリソース (Java クラスファイル、ネイティブライブラリ、システムプロパティなど) の指定に使用されます。os、arch、および locale 属性を使うことにより、リソース定義を特定のオペレーティングシステム、アーキテクチャ、またはロケールに限定できます。resources 要素には、指定可能な 6 つのサブ要素 (jar、nativelib、j2se、property、package、および extension) が含まれます。この「開発者ガイド」では、package 要素および extension 要素については説明しません。詳細については、「specification」を参照してください。
jar 要素には、アプリケーションのクラスパスの一部である JAR ファイルを指定します。次に例を示します。
<jar href="myjar.jar"/>
jar ファイルは、ClassLoader オブジェクトを使って JVM にロードされます。一般に、jar ファイルには特定のアプリケーションのコードを含む Java クラスが含まれますが、アイコンや構成ファイルなどの、getResource 機構を介して利用可能なほかのリソースを含めることもできます。
nativelib 要素には、ネイティブライブラリを含む JAR ファイルを指定します。次に例を示します。
<nativelib href="lib/windows/corelib.jar"/>
JNLP クライアントは、JAR ファイルのルートディレクトリ (/) 内の各ファイルエントリを、System.loadLibrary メソッドを使って実行中のプロセスにロード可能であることを確認する必要があります。各エントリには、適正な命名規約 (Windows の場合は *.dll、Solaris/Linux の場合は lib*.so) に準拠した、プラットフォーム依存の共有ライブラリを含める必要があります。アプリケーションは、System.loadLibrary への実際の呼び出しを担当します。
通常、ネイティブライブラリは resources 要素に含められ、特定のオペレーティングシステムおよびアーキテクチャから保護されます。次に例を示します。
<resources os="SunOS" arch="sparc">
<nativelib href="lib/solaris/corelibs.jar"/>
</resource>デフォルトでは、jar および nativelib リソースは、事前にダウンロードされます (つまり、アプリケーションを起動する前に、アプリケーションを実行する JVM へダウンロードされ、ローカルで使用可能になります) 。jar および nativelib 要素では、リソースを lazy に指定することも可能です。これは、アプリケーションを起動する前に、必ずしもリソースをクライアントシステムにダウンロードする必要がないことを意味します。
download 属性を使用して、リソースのダウンロード方法を eager (事前)、または lazy (遅延) に設定できます。次に例を示します。
<jar href="sound.jar" download="lazy"/>
<nativelib href="native-sound.jar" download="eager"/>j2se 要素には、アプリケーションがサポートする J2RE のバージョン、および Java 仮想マシンへの標準パラメータを指定します。複数の JRE を優先順位を付けて指定できます。その場合、もっとも優先度の高いバージョンをリストの最初に指定します。次に例を示します。
<j2se version="1.3" initial-heap-size="64m"/>
<j2se version="1.2"/>デフォルトでは、version 属性は、Java 2 プラットフォームの特定のバージョンを参照します。現在定義されているバージョンは、「1.2」および「1.3」です。JNLP 仕様でも、特定の製品バージョンの指定が可能です (Sun Microsystems 社の J2RE 1.2.2-001 など)。
Java Web Start では、特定の「プラットフォーム」バージョンに対する要求と一致させるため、FCS 版以外の JRE を考慮しません。たとえば、<j2se version="1.4+"> という形式の要求は、JRE "1.4.0-beta" を要求に一致するものとしてみなしません。1.3.0 以降の慣例により、Sun Microsystems 社が提供する J2RE の製品バージョンの文字列にダッシュ文字 (-) が含まれている場合は、FCS 版以外のバージョンであることを意味します。J2RE の Beta 版で稼働させたいアプリケーションには、j2se 要素の href 属性を使用して「製品」バージョンを明示的に指定する必要があります。J2RE の Beta 版を選択する場合の正しい要求の例を示します。
<j2se version="1.4-beta" href="http://java.sun.com/products/autodl/j2se"/>property 要素には、System.getProperty および System.getProperties メソッドを介して使用可能なシステムプロパティを定義します。この要素には、2 つの必須属性 (name および value) があります。次に例を示します。
<property name="key" value="overwritten"/>
application-desc 要素
application 要素は、JNLP ファイルが起動しているのが、(アプレットではなく) アプリケーションであることを示します。application 要素には、オプション属性 main-class があります。main-class 属性は、アプリケーションのメインクラス (public static void main(String argv[]) メソッドを含む、最初に実行されるクラス) の名前指定に使用されます。JNLP ファイルで指定された最初の JAR ファイルに、メインクラスを含むマニフェストファイルが含まれる場合、main-class 属性は省略可能です。
application 要素には、1 つ以上の入れ子の argument 要素を含めることができます。次に例を示します。
<application-desc main-class="Main">
<argument>arg1</argument>
<argument>arg2</argument>
</application-desc>applet-desc 要素
Java Web Start は、Java アプレットの起動もサポートします。このため、既存のコードを Java Web Start に簡単に移行できます。アプレットの起動には、application-desc 要素ではなく applet-desc 要素を使用します。次に例を示します。
<applet-desc
documentBase="http://..."
name="TimePilot"
main-class="TimePilot.TimePilotApp"
width="527"
height="428">
<param name="key1" value="value1"/>
<param name="key2" value="value2"/>
</applet-desc>アプレットを構成する JAR ファイルは、アプリケーションの場合と同様、resources 要素を使って記述されます。JNLP ファイルが HTML ページに組み込まれていないため、documentBase を明示的に指定する必要があります。その他の属性は、個々の HTML アプレットタグ要素に対応します。
code 属性の代わりに main-class 属性が使用されます。main-class 属性には、Applet クラスの名前が (.class 拡張子なしで) 割り当てられます。メインの JAR ファイルの Main-Class マニフェストエントリに Applet クラスが存在する場合、この属性は省略できます。
注意 : Java Web Start でアプレットを動作させるには、アプレットを JAR ファイルにパッケージ化する必要があります。
JNLP API は、標準 J2SE API を使用しても入手できない補足情報をアプリケーションに提供するために設計されています。以下のコーディング例は、BasicService、ClipboardService、DownloadService、FileOpenService、FileSaveService、PrintService、および PersistenceService サービスの使用方法を示します。JNLP API の public クラスおよびインタフェースは、jnlp.jar ファイルに含まれます。JNLP API を使用するソースファイルをコンパイルする際、この JAR ファイルを classpath に含める必要があります。Windows での例を次に示します。
javac -classpath .;jnlp.jar *.java
jnlp.jar ファイルは、JNLP Developers Pack に含まれています。
BasicService サービスの使用
javax.jnlp.BasicService サービスは、環境に対して問い合わせおよび対話処理を行うためのメソッドのセットを提供します。これは、AppletContext が Java アプレットに対して提供するメソッドセットに似ています。showURL メソッドは JNLP API を使って、プラットフォームのデフォルトブラウザに対し、指定された URL を表示するよう指示します。要求が成功すると true が、失敗すると false が返されます。
import javax.jnlp.*;
...// Method to show a URL
boolean showURL(URL url) {
try {
// Lookup the javax.jnlp.BasicService object
BasicService bs = (BasicService)ServiceManager.lookup("javax.jnlp.BasicService");
// Invoke the showDocument method
return bs.showDocument(url);
} catch(UnavailableServiceException ue) {
// Service is not supported
return false;
}
}ClipboardService サービスの使用
javax.jnlp.ClipboardService サービスは、システム全体で共有されるクリップボードへアクセスするためのメソッドを、制限された実行環境内で実行されるアプリケーションに対しても提供します。Java Web Start は、信頼できないアプリケーションがクリップボード内の機密情報にアクセスしたり、クリップボードに保存されている内容を書き換えるなどといった、セキュリティ面の潜在的な危険についてユーザに警告します。
import javax.jnlp;
...private ClipboardService cs;
try {
cs = (ClipboardService)ServiceManager.lookup
("javax.jnlp.ClipboardService");
} catch (UnavailableServiceException e) {
cs = null;
}if (cs != null) {
// set the system clipboard contents to a string selection
StringSelection ss = new StringSelection("Java Web Start!");
cs.setContents(ss);
// get the contents of the system clipboard and print them
Transferable tr = cs.getContents();
if (tr.isDataFlavorSupported(DataFlavor.stringFlavor)) {
try {
String s = (String)tr.getTransferData(DataFlavor.stringFlavor);
System.out.println("Clipboard contents: " + s);
} catch (Exception e) {
e.printStackTrace();
}
}
}DownloadService サービスの使用
javax.jnlp.DownloadService サービスは、アプリケーションが内部リソースのキャッシュ方法を制御することを可能にします。アプリケーションは、このサービスを利用して、キャッシュするリソースの決定、リソースの強制的なキャッシュ、およびキャッシュからのリソースの削除を行うことができます。
import javax.jnlp.*;
...DownloadService ds;
try {
ds = (DownloadService)ServiceManager.lookup("javax.jnlp.DownloadService");
} catch (UnavailableServiceException e) {
ds = null;
}if (ds != null) {
try {
// determine if a particular resource is cached
URL url =
new URL("http://java.sun.com/products/javawebstart/lib/draw.jar");
boolean cached = ds.isResourceCached(url, "1.0");
// remove the resource from the cache
if (cached) {
ds.removeResource(url, "1.0");
}
// reload the resource into the cache
DownloadServiceListener dsl = ds.getDefaultProgressWindow();
ds.loadResource(url, "1.0", dsl);
} catch (Exception e) {
e.printStackTrace();
}
}FileOpenService サービスの使用
javax.jnlp.FileOpenService サービスは、ローカルディスクからファイルをインポートするメソッドを、制限された実行環境内で実行されるアプリケーションに対しても提供します。このインタフェースは、Web に配備された信頼できないアプリケーションに対して、Web 開発者が HTML を使用する場合と同様のディスクアクセスを提供する目的で設計されました。HTML 形式では、[ファイルを開く] ダイアログを表示することにより、ファイルを含めることができます。
import javax.jnlp.*;
...FileOpenService fos;
try {
fos = (FileOpenService)ServiceManager.lookup("javax.jnlp.FileOpenService");
} catch (UnavailableServiceException e) {
fos = null;
}if (fos != null) {
try {
// ask user to select a file through this service
FileContents fc = fos.openFileDialog(null, null);
// as user to select multiple files through this service
FileContents [] fcs = fos.openMultiFileDialog(null, null);
} catch (Exception e) {
e.printStackTrace();
}
}FileSaveService サービスの使用
javax.jnlp.FileSaveService サービスは、ファイルをローカルディスクにエクスポートするためのメソッドを、制限された実行環境内で実行されるアプリケーションに対しても提供します。このインタフェースは、Web に配備された信頼できないアプリケーションに対して、Web ブラウザが表示しているコンテンツを提供するのと同レベルのディスクアクセスを提供する目的で設計されました。たいていのブラウザは、ユーザインタフェースの 1 つとして、[別名保存] ダイアログを提供します。
import javax.jnlp.*; ... FileSaveService fss; FileOpenService fos; try { fos = (FileOpenService)ServiceManager.lookup("javax.jnlp.FileOpenService"); fss = (FileSaveService)ServiceManager.lookup ("javax.jnlp.FileSaveService"); } catch (UnavailableServiceException e) { fss = null; fos = null; } if (fss != null && fos != null) { try { // get a file with FileOpenService FileContents fc = fos.openFileDialog(null, null); // one way to save a file FileContents newfc = fss.saveFileDialog(null, null, fc.getInputStream(), "newFileName.txt"); // another way to save a file FileContents newfc2 = fss.saveAsFileDialog(null, null, fc); } catch (Exception e) { e.printStackTrace(); } }「FileContents の使用」も参照してください。
PrintService サービスの使用
javax.jnlp.PrintService サービスは、印刷機能にアクセスするためのメソッドを、制限された実行環境内で実行されるアプリケーションに対しても提供します。アプリケーションは、このサービスを使用して印刷ジョブを渡します。Java Web Start は、この要求をユーザに表示し、受け入れられた場合は要求をプリンタに送信します。
import javax.jnlp.*; ... PrintService ps; try { ps = (PrintService)ServiceManager.lookup("javax.jnlp.PrintService"); } catch (UnavailableServiceException e) { ps = null; } if (ps != null) { try { // get the default PageFormat PageFormat pf = ps.getDefaultPage(); // ask the user to customize the PageFormat PageFormat newPf = ps.showPageFormatDialog(pf); // print the document with the PageFormat above ps.print(new DocToPrint()); } catch (Exception e) { e.printStackTrace(); } } // Code to construct the Printable Document class DocToPrint implements Printable { public int print(Graphics g, PageFormat pageformat, int PageIndex){ // code to generate what you want to print } }PersistenceService サービスの使用
javax.jnlp.PersistenceService サービスは、データをローカルのクライアントシステムに格納するメソッドを、制限された実行環境内で実行されるアプリケーションに対しても提供します。このサービスは、cookie 機構が HTML ベースのアプリケーションに提供するのとある程度類似したサービスを提供する目的で設計されました。cookie を使用すると、少量のデータをローカルのクライアントシステムに格納できます。格納されたデータは、ブラウザによりセキュリティ保護された状態で管理されます。このデータを取得できるのは、データを格納したページと同じ URL を元とする HTML ページだけです。
import javax.jnlp.*; ... PersistenceService ps; BasicService bs; try { ps = (PersistenceService)ServiceManager.lookup("javax.jnlp.PersistenceService"); bs = (BasicService)ServiceManager.lookup("javax.jnlp.BasicService"); } catch (UnavailableServiceException e) { ps = null; bs = null; } if (ps != null && bs != null) { try { // find all the muffins for our URL URL codebase = bs.getCodeBase(); String [] muffins = ps.getNames(url); // get the attributes (tags) for each of these muffins. // update the server's copy of the data if any muffins // are dirty int [] tags = new int[muffins.length]; URL [] muffinURLs = new URL[muffins.length]; for (int i = 0; i < muffins.length; i++) { muffinURLs[i] = new URL(codebase.toString() + muffins[i]); tags[i] = ps.getTag(muffinURLs[i]); // update the server if anything is tagged DIRTY if (tags[i] == PersistenceService.DIRTY) { doUpdateServer(muffinURLs[i]); } } // read in the contents of a muffin and then delete it FileContents fc = ps.get(muffinURLs[0]); long maxsize = fc.getMaxLength(); byte [] buf = new byte[fc.getLength()]; InputStream is = fc.getInputStream(); long pos = 0; while((pos = is.read(buf, pos, buf.length - pos)) > 0) { // just loop } is.close(); ps.delete(muffinURLs[0]); // re-create the muffin and repopulate its data ps.create(muffinURLs[0], maxsize); fc = ps.get(muffinURLs[0]); // don't append OutputStream os = fc.getOutputStream(false); os.write(buf); os.close(); } catch (Exception e) { e.printStackTrace(); } } void doUpdateServer(URL url) { // update the server's copy of the persistent data // represented by the given URL ... ps.setTag(url, PersistenceService.CACHED); }FileContents の使用
FileContents オブジェクトは、ファイルの名前および内容をカプセル化します。このクラスのオブジェクトは、FileOpenService、FileSaveService、および PersistenceService によって使用されます。以下の例は、FileContents のインスタンスをファイルからの読み取りおよびファイルへの書き込みに使用する方法を示します。import javax.jnlp.*; ... FileOpenService fos; //Initialize fos (see Using a FileOpenService Service example) ... if (fos != null) { try { // get a FileContents object to work with from the // FileOpenService FileContents fc = fos.openFileDialog(null, null); // get the InputStream from the file and read a few bytes byte [] buf = new byte[fc.getLength()]; InputStream is = fc.getInputStream(); int pos = 0; while ((pos = is.read(buf, pos, buf.length - pos)) > 0) { // just loop } is.close(); // get the OutputStream and write the file back out if (fc.canWrite()) { // don't append OutputStream os = fc.getOutputStream(false); os.write(buf); } } catch (Exception e) { e.printStackTrace(); } }JNLPRandomAccessFile の使用
JNLPRandomAccessFile のインスタンスは、ランダムアクセスファイルに対する読み取りと書き込みの両方をサポートします。ランダムアクセスファイルは、ファイルシステムに格納された大規模なバイト配列のように機能します。JNLPRandomAccessFile のインスタンスをランダムアクセスファイルへの書き込みに使用する方法を、以下の例で示します。import javax.jnlp.*; ... FileOpenService fos; //Initialize fos (see Using a FileOpenService Service example) ... if (fos != null) { try { // ask the user to choose a file to open FileContents fc = fos.openFileDialog(null, null); // attempt to increase the maximum file length long grantedLength = fc.getLength(); if (grantedLength + 1024 > fc.getMaxLength()) { // attempt to increase the maximum file size defined by // the client grantedLength = fc.setMaxLength(grantedLength + 1024); } // if we were able to increase the maximum allowable file size, // get a JNLPRandomAccessFile representation of the file, and // write to it if (fc.getMaxSize() > fc.getLength() && fc.canWrite()) { JNLPRandomAccessFile raf = fc.getRandomAccessFile("rw"); raf.seek(raf.length() - 1); raf.writeUTF("Java Web Start!"); raf.close(); } } catch (Exception e) { e.printStackTrace(); } }
コメントの送付先: javawebstart-feedback@sun.com |
Copyright © 2002, Sun Microsystems, Inc.
All rights reserved. |