Sun Java Solaris Communities My SDN Account
 
新しい Java™ Plug-In テクノロジでの JNLP サポート

JDK 6u10

新しい Java Plug-In のリリースノート Java SE 6u10 アップデートリリースノート JDK Documentation

目次

はじめに

次世代の Java Plug-In テクノロジ (以下、「Java Plug-In」) は、JNLP ファイルからのアプレットの直接起動をサポートします。以前は、Java Web Start のみが Java アプリケーションを起動するために JNLP ファイルを利用していました。現在は、同じメタ記述子を使用して Java アプレットを記述できます。

この新機能には多くのメリットがあります。

  • アプレットでの JNLP 拡張へのアクセス。OpenGL 3D API にバインドする JavaJavaFX ランタイム用のシーングラフNASA World Wind Java 地球上および地球外可視化システムなどの Java Web Start アプリケーション用に強力な JNLP 拡張が記述されています。現在、これらの拡張をアプレットから簡単に使用できます。(これらの拡張を利用するための回避方法はありましたが、これらの回避方法には常に厳しい制限事項が課せられました。)
  • JNLP API へのアクセス。サンドボックス化された Java Web Start アプリケーションは、JNLP API にアクセスして、永続ストレージ (PersistenceService)、遅れてダウンロードされる Part (DownloadService)、ローカルファイルシステム (FileOpenServiceFileSaveService)、およびその他の役に立つ機能へのユーザー制御アクセスを取得することができます。現在、この機能のすべてをアプレット開発者が透過的に使用できるようになりました。
  • 自動ダウンロード、バージョン選択など。新しい Java Plug-In のアーキテクチャー上に構築される場合、JNLP 経由で起動されるアプレットは、JRE バージョン選択、特定バージョンの JRE の自動ダウンロード、JVM へのコマンドライン引数とシステムプロパティーの提供など、Java Web Start アプリケーションがこれまで使用できた機能をすべて利用できます。
  • Java 配備の統一。Java Plug-In での JNLP のサポートにより、Web ブラウザの内外で Java コンテンツの配備メカニズムが統一され、開発者の意思決定プロセスが簡素化されます。コンポーネントモデルを使用して記述したプログラムは、Web ページ上の要素、スタンドアロンアプリケーション、またはその両方として簡単に配備できます。

このドキュメントでは、JNLP を使用してブラウザ内の Java アプレットを記述する際のわずかなセマンティクスの違いについて説明し、JNLP 経由での簡単なアプレット配備と高度なアプレット配備の例を紹介します。

使用法

JNLP ファイルからアプレットを起動するには、<applet> タグの jnlp_href パラメータを使用します。

   <applet width="300" height="300" code="com.mycompany.MyApplet">
      <param name="jnlp_href" value="my_applet.jnlp">
   </applet>
この例では、my_applet.jnlp がアプレットの JNLP 記述子です。その内容は次のようになります。
   <?xml version="1.0" encoding="UTF-8"?>
   <jnlp href="my_applet.jnlp">
     <information>
       <title>My Applet</title>
       <vendor>My Company, Inc.</vendor>
       <offline-allowed />
     </information>
     <resources>
       <j2se version="1.4+"
             href="http://java.sun.com/products/autodl/j2se" />
       <jar href="my_applet.jar" main="true" />
       <extension name="SomeExtension"
                  href="http://some.server.com/some_extension.jnlp" />
     </resources>
     <applet-desc 
         name="My Applet"
         main-class="com.mycompany.MyApplet"
         width="300"
         height="300">
     </applet-desc>
   </jnlp>

Java Web Start を使用したことがある開発者には、JNLP ファイル形式は既に馴染みのあるものでしょう。JNLP を初めて使用する開発者は、仕様については JSR-56 を、説明については『Java Web Start Developers' Guide』のアプリケーション関連の記述を参照してください。

セマンティクス

<applet> タグと JNLP ファイルでは、特定のパラメータを指定するためのメカニズムが重複します。これらの競合は次のように解決されます。

  • width および height: これらの属性は常に <applet> タグから取得され、JNLP ファイルからは取得されません。Web ページでのアプレットの大きさをもっとも適切に認識しているのはブラウザで、ブラウザのみがページに相対する幅と高さ (width="50%" など) をサポートできることを前提としています。
  • codebase: JNLP ファイルの <jnlp> タグで絶対コードベースが指定されている場合は、それが使用されます。そうでない場合は、「コードベース処理」に記載されているルールを使用して作成されます。
  • code および archive: jnlp_href パラメータが指定されている場合、新しい Java Plug-In では code パラメータや archive パラメータはすべて無視されます。 この結果、新旧の Java Plug-In で実行時の動作がまったく異なる <applet> タグを記述できるようになりました。後述のを参照してください。
  • <param> タグを使用して指定されるアプレットパラメータは、JNLP ファイルで指定されるパラメータとマージされます。<applet> タグと JNLP ファイルの両方で同じパラメータが指定されている場合は、java_arguments パラメータと java_version パラメータを除き、<applet> タグのバージョンが JNLP ファイルのバージョンよりも優先されます。
  • 新しい java_arguments パラメータと java_version パラメータは JNLP アプレットでは不要です。JNLP ファイルでは JRE バージョンを要求するためのメカニズム、または JVM にコマンドライン引数を渡すためのメカニズムが代わりに使用されます。JNLP ファイルからのコマンドライン引数および JRE バージョン要求は、アプレットに対して HTML で指定されている要求よりも優先されます。
  • imageboxbgcolor など、アプレットの起動プロセスの早い段階で必要になる特定のパラメータは、JNLP ファイルではなく HTML で指定すると便利な場合があります。最初に JNLP ファイルを個別にダウンロードすることなく、Web ページのロード時にこれらのパラメータをすぐに使用できるためです。

コードベース処理

仕様

JNLP ファイルでは、コードベースは <jnlp> タグのオプションパラメータです。その JUNLP ファイルで記述されているリソースを検索するため、および JNLP ファイル自体を見つけるために使用されます。技術上の理由から、Java Web Start は、絶対コードベースが指定されていない限り、サーバーから JNLP ファイルの内容を更新できません。

Java Plug-In では、明示的に指定される、または HTML ドキュメントの場所から暗黙的に取得されるため、コードベースは常にブラウザによって提供されます。これにより、JNLP ファイルで相対 URL を使用できます。これは、サーバー間でコンテンツのツリー全体を移動する場合に非常に便利です。

JNLP ファイルはツリー構造内の他の JNLP ファイルを参照します。JNLP アプレットのルート JNLP ファイルは、<applet> タグによって参照されます。アプレットタグのコードベースは、ルート JNLP ファイルの場所を定義するのに役立ちます。

コードベース計算のルールは次のとおりです。

  • JNLP ファイルで絶対コードベースが指定されている場合は、それが使用されます。これは、下位互換のために必要です。
  • JNLP コードベースが指定されていない場合は、JNLP ファイルを含むディレクトリが使用されます。
  • それ以外の場合は、JNLP のコードベースが JNLP ファイルを含むディレクトリにマージされます。

簡単な Java 表現では、これは次のように表すことができます。

   URL new_codebase = new URL(current_jnlp_dir, current_jnlp_codebase);

このコードベース計算は、JSR-56 の拡張ではありません。 JSR-56 では、コードベースが絶対コードベースに制限されないため、相対コードベースが可能です。

例 1:

   this JNLP's location:   http://www.sun.com/this.jnlp
   this JNLP's codebase:   http://www.foo.com/test/
   resulting codebase for
     parsing this JNLP:    http://www.foo.com/test/

例 2:

   this JNLP's location:   http://www.sun.com/test2/this.jnlp
   this JNLP's codebase:   <none>
   resulting codebase for
     parsing this JNLP:    http://www.sun.com/test2/

例 3:

   this JNLP's location:   http://www.sun.com/this.jnlp
   this JNLP's codebase:   codebasedir
   resulting codebase for
     parsing this JNLP:    http://www.sun.com/codebasedir

例 4:

相対パスは、HTML ファイルのツリーで行うのと同じように、入れ子の各 JNLP を参照するために使用されます。

   www.sun.com/html/my_applet.html
     refers to: my_applet.jnlp
     codebase:  www.sun.com/html

     my_applet.jnlp:
       codebase not specified
       inherits "www.sun.com/html"
       references JNLP extension "jogl/jogl.jnlp"

     jogl/
       jogl.jnlp
       codebase not specified
       inherits "www.sun.com/html/jogl"
         (the directory containing jogl.jnlp)
       references gluegen-rt/gluegen-rt.jnlp

       gluegen-rt/
         gluegen-rt.jnlp
         codebase not specified
         inherits "www.sun.com/html/jogl/gluegen-rt"
           (the directory containing gluegen-rt.jnlp)

ベストプラクティス

以下のいずれかをお勧めします。

  • メインまたは拡張 JNLP ファイルの両方でコードベースを空のままにし、JNLP ファイルまたは <applet> タグの参照によってコードベースが暗黙的に指定されるようにする。
  • メインまたは拡張 JNLP ファイルのコードベースに対して絶対 URL を指定する。
相対 URL を使用した拡張 JNLP の参照に加えて <jnlp> タグで相対コードベースを使用すると、わかりづらくなります。

コマンドライン引数

JNLP ファイルの構文は、コマンド行引数を JVM に渡すための複数のメカニズムをサポートします。<java> タグの java-vm-args 属性を使用するか、同じタグの max-heap-size 属性によって -Xmx 引数を暗黙的に指定するか、または <property> タグにシステムプロパティーを指定することができます。

新しい Java Plug-In はアプレット単位での JVM コマンド行引数の指定をサポートしているため、JNLP ファイル形式のこれらの機能は、すべていくつかの規則と制限付きでサポートされます。

「セキュリティー保護された」 JVM コマンド行引数およびシステムプロパティーのセットは、「Java Web Start Developers' Guide」の「JNLP File Syntax」セクションで定義されています。新しい Java Plug-In では、デフォルトで、これらのセキュリティー保護されたコマンド行引数だけがアプレット単位で指定できます。

セキュリティー保護されていないコマンド行引数は、次の場合にのみアプレット単位で指定できます。

  • アプレットが JNLP ファイル経由で起動されている
  • コマンド行引数が JNLP ファイル内に指定されている
  • アプレットの JNLP ファイルが署名されている

署名付き JNLP ファイルの概念については、「JNLP specification」の 5.4.1 節「Signing of JNLP Files」を参照してください。

これらの制限は、セキュリティー上の理由で必要です。セキュリティー保護されていないコマンド行引数を指定するためには JNLP ファイルへの署名を必要とすることで、アプレットの本来の開発者がアプレットのコマンド行引数を選択したことが保証されます。

Java コントロールパネルの「Java アプレットのランタイム設定」を使用すれば、依然としてすべてのアプレットにコマンド行引数を指定できます。ここで指定されたコマンド行引数は、アプレットごとのコマンド行引数と同じ規則の制約を受けません。特に、-Xdebug などのセキュリティー保護されていない引数を Java コントロールパネルで指定しても、アプレットの実行には影響しません。これは、開発中のアプレットをデバッグするときに便利です。アプレットごとのコマンド行引数は、Java コントロールパネルで指定された引数に追加されます。Java コントロールパネルの引数と完全に置き換わるわけではありません。

アプレットごとの JVM コマンド行引数が指定されている場合、それらの引数の条件を満たすために、新しい Java Plug-In が別の JVM インスタンスを起動しなければならない可能性があります。つまり、現在のアプレットの要求を満たすために、正しいコマンド行引数セットを使って既存の JVM インスタンスが起動されることはあまり考えられません。指定されたアプレットを開始するために新しい JVM インスタンスが起動する場合、正確性規則は意図的に指定されないままになります。それは、これが 6u10 リリースの新機能であり、以降のリリースで変更が必要になることが考えられるためです。次に、新しい JVM インスタンスを共有および作成する際のガイドラインの概要を示します。

  • 既存の JVM インスタンスの起動に使用するコマンド行引数が要求された引数のスーパーセットである場合は、既存の JVM インスタンスが使用されます。
  • JVM インスタンスがコマンド行引数の「デフォルト」 (つまり、アプレットごとの引数を使用せずに Java コントロールパネルで指定された) セットで起動される場合、この JVM インスタンスはアプレットごとのコマンド行引数を 1 つだけ含むアプレットの起動にも決して使用されません。
  • -Xmx は特殊な方法で処理されます。たとえば、既存の JVM インスタンスの起動時に -Xmx256m が指定された場合、新しいアプレットが -Xmx128m を要求すると、新しいアプレットが既存の JVM インスタンスで実行される可能性がきわめて高くなります。つまり、-Xmx の指定は、greater-than-or-equal テストと一致します。

特定のアプレットの起動に使用する JVM に「名前を付ける」ことも、後続のアプレットにその JVM インスタンスを「強制する」こともできません。

特定のアプレットを独自の JVM インスタンス内で隔離して、ほかのすべてのアプレットから分離する方法については、separate_jvm パラメータのセクションを参照してください。

この機能に関するコメントや質問がある場合は、フィードバックをお送りください

シーングラフデモ

シーングラフ開発チームから無料提供されたシーングラフデモアプレットは、アプレット内から JNLP 拡張を使用する方法、アプリケーションとアプレットの両方で再利用が容易なコードを構築する方法を示します。

各シーングラフデモは、任意の種類のコンテナに配置可能な単なるコンポーネントです。アプリケーションとして実行される場合、デモはトップレベルフレームに配置されます。アプレットとして実行される場合、デモはアプレットに配置されます。アプレット自体がコンテナです。

また、ほとんどのシーングラフデモは、特定のスタイルで記述されています (引数のないパブリックコンストラクタを持つ)。これにより、汎用アプレットおよび JNLP ファイルテンプレートを使用してデモを配備し、実行するデモンストレーションをアプレットへのパラメータとして指定できます。

次は、Egg Timer デモ用に記述された <applet> タグを示しています。

   <applet width="200" height="200"
           codebase="http://download.java.net/javadesktop/plugin2/scenegraph/"
           code="CompatibilityApplet" archive="CompatibilityApplet.jar">
     <param name="jnlp_href" value="scenario-applet.jnlp">
     <param name="demo.classname" value="demo.alarm.EggTimer">
   </applet>

CompatibilityApplet.jar には、Java Plug-In の古いバージョンのユーザーにこのコンテンツが新しい Java Plug-In を必要とすることを通知し、ダウンロードページへと導く、小さなアプレットが含まれています (そのソースコードはここでダウンロード可能)。古いバージョンの Java Plug-In は、<applet> タグの code および archive パラメータを使用します。新しい Java Plug-In は、scenario-applet.jnlp を使用してアプレットを起動し、code および archive パラメータを無視します。

アプレットのリソースは scenario-applet.jnlp に記述されます。以下はその抜粋です。

   <jnlp href="scenario-applet.jnlp">
     <resources>
        <!-- Want some extra RAM since we aim to run
             all of these in the same JVM -->
        <j2se version="1.6+"
              href="http://java.sun.com/products/autodl/j2se"
              max-heap-size="128m" />
        <extension name="Scenario-0.5" 
           href="http://download.java.net/javadesktop/scenario/releases/0.5/Scenario-0.5.jnlp"/>
        <extension name="AppFramework"
           href="http://download.java.net/javadesktop/scenario/demos/lib/AppFramework.jnlp"/>
        <jar href="Scenario-Demos.jar" main="true" />
     </resources>
     <applet-desc 
         name="Scenario Demo Applet"
         main-class="demo.applet.DemoApplet"
         width="300"   <!-- overridden by applet tag -->
         height="300"> <!-- overridden by applet tag -->
     </applet-desc>
   </jnlp>

注意が必要な要素:

  • j2se タグへの max-heap-size パラメータは、JVM に特別なヒープ領域を与えるために使用されます。この例では、リソースを集中的に使用する複数のアプレットが同じ Web ページ上で実行されていて、実験によってデフォルトのヒープサイズではすべてのアプレットを確実に実行するのに不十分であることがわかりました。標準以外のヒープサイズが要求されているにもかかわらず、新しい Java Plug-In は同じ JVM インスタンスですべてのアップレットを実行します。アプレットはすべて、同じコマンドラインオプションを要求しているためです。
  • Scenario および AppFramework 拡張 JNLP は、Java Web Started アプリケーションの場合とまったく同じように、アプレットに容易に取り込むことができます。
  • 幅と高さは無視されます。<applet> タグでの指定が優先されます。

このインフラストラクチャーでは、実際の DemoApplet クラスは簡単なものです。

   public class DemoApplet extends JApplet {
       public void init() {
           try {
               Class c = Class.forName(getParameter("demo.classname"));
               Object o = c.newInstance();
               add((Component) o);
           } catch (Exception e) {
               throw new RuntimeException(e);
           }
       }
   }

単に demo.classname パラメータを受け取り、それに基づいて名前付きクラスをインスタンス化し、それを自身に追加します。各デモは主要設計要素であるコンポーネントとして記述されています。コンポーネントにより、コードをアプレットとアプリケーションの両方で容易に再利用できます。

JavaFX Script アプレットデモ

JavaFX の技術リーダー Chris Oliver から無料提供された JavaFX アプレットデモンストレーションは、アプレットでの JavaFX Script コンテンツの配置方法を示します。ベース FXApplet クラスには、任意の JavaFX Script コンテンツをアプレットで配置する「マジック」が含まれています。TimerApplet は、FXApplet をサブクラス化し、getContent() メソッドをオーバーライドして Timer1 インスタンスを返します。Timer1 にはアプリケーションコードが含まれます。これらのソースは、JavaFX Script Compiler を使用してコンパイルされます。

バイトコードにコンパイルされたら、アプレットの配備は簡単です。<applet> は、アプレットの JNLP ファイルを参照します。

   <applet width="250" height="280" code="CompatibilityApplet" archive="CompatibilityApplet.jar">
     <param name="jnlp_href" value="TimerApplet.jnlp">
   </applet>

下位互換アプレットの説明については、前述の例を参照してください。

アプレットの JNLP ファイルは、アプレットのリソースを参照します。

   <jnlp href="TimerApplet.jnlp">
     <resources>
        <jar href="TimerApplet.jar" main="true" />
        <jar href="javafxrt.jar" />
        <jar href="Scenario-0.5.jar" />
     </resources>
     <applet-desc 
         name="JavaFX Timer Applet"
         main-class="TimerApplet"
         width="300"
         height="300">
     </applet-desc>
   </jnlp>

近い将来、javafxrt.jarScenario-0.5.jar の両方に標準化された位置が含まれる予定です。JavaFX プロジェクトの現在の急速な開発のため、バージョンのずれにより、公開済みの Scenario jar をこの例の JavaFX ランタイムクラスと使用することはできません。

NASA World Wind Java

World Wind Java 開発チームの Patric Murris から提供された NASA World Wind Java アプレットの例は、NASA World Wind Java などの最先端ライブラリを配備する方法、および JavaScript を使用して Web ページで HTML と Java コンテンツを効果的に組み合わせる方法を示します。

Web ページは、カスケード山脈に関する情報 (出展: ウィキペディア) を含み、World Wind Java をアプレットとして埋め込んで、山脈内の山の位置を示します。World Wind を Web ページに組み込むことは非常に簡単です。次は、World Wind をページに埋め込む <applet> タグです。

   <applet id="wwjApplet" width=600 height=380
           code="CompatibilityApplet"
           archive="CompatibilityApplet.jar">
     <param name="jnlp_href" value="WWJApplet.jnlp">
   </applet>

WWJApplet には標準の World Wind Java 配布が付属しています。独自のアプレットクラスを記述し、World Wind をその内部に埋め込むこともできます。その方法を以下に示します。下位互換アプレットについては、こちらを参照してください。

次は、WWJApplet.jnlp ファイルの関連部分です。

   <jnlp href="WWJApplet.jnlp">
     <resources os="Windows">
       <property name="sun.java2d.noddraw" value="true"/>
     </resources>
     <resources>
       <j2se href="http://java.sun.com/products/autodl/j2se" version="1.4+"/>
       <jar href="worldwind.jar" main="true" />
       <extension name="jogl"
          href="http://download.java.net/media/jogl/builds/archive/jsr-231-webstart-current/jogl.jnlp" />
     </resources>
     <applet-desc 
         name="WWJ Applet"
         main-class="gov.nasa.worldwind.examples.applet.WWJApplet"
         <!-- Overwritten by the surrounding web page -->
         width="100" 
         height="100">
     </applet-desc>
   </jnlp>

注意が必要なアイテム:

  • worldwind.jar は、この例ではメイン jar として使用されます。NASA の Web サイトから拡張 JNLP として参照される方法が最適です。これにより、World Wind を埋め込んでいる多くの異なるアプリケーションまたはアプレットはダウンロードした同じ jar ファイルを共有できます。 詳細については、以下を参照してください。
  • World Wind Java は、ハードウェア高速化 3D グラフィックス用に Java Binding to the OpenGL API (JOGL) を使用します。JOGL JNLP 拡張は、1 つのコード行でアプリケーションに組み込まれます。また、Windows プラットフォームでは、OpenGL API と Windows プラットフォームで Java 2D 実装がデフォルトで使用する DirectDraw/Direct3D API との間のドライバレベルの競合のため、システムプロパティー -Dsun.java2d.noddraw=true を指定する必要があります。このシステムプロパティーは、JOGL を使用するすべてのアプリケーションおよびアプレットに対して Windows 上で必要です。

Web ページ上の HTML リンクは、アプレットと対話して適切な山へとナビゲートする JavaScript 関数を呼び出します。以下は、これらのリンクの 1 つの例です。

   <a href="javascript:gotoLocation(MOUNT_RAINIER);">Mount Rainier</a>
   (southeast of Tacoma, Washington) ...

リンクがクリックされると、JavaScript 関数 gotoLocation が呼び出されます。この関数は同じ Web ページで定義されます。

   function gotoLocation(locationString) {
      var params = locationString.split(';');
      if(params.length == 3)	// Lat/lon
         getWWJApplet().gotoLatLon(parseFloat(params[1]),
                                   parseFloat(params[2]));
      ...
   }

山の位置は、Web ページの HTML に JavaScript 文字列としてエンコードされます。緯度、経度、およびその他の表示情報は、これらの文字列から解析され、アプレットに渡されます。gotoLatLon メソッドは、WWJApplet クラスで定義されます。このメソッドへの前述の呼び出しは、JavaScript エンジンから Java にパラメータを渡す、JavaScript-to-Java 呼び出しを示しています。World Wind アプレットは、この情報を受け取り、視点を適切な場所へとアニメートします。ブラウザが完了を待つことがないように、gotoLatLon メソッドはすばやく返されます。アニメーションは別の Java スレッドで実行されます。

この例の詳細については、ページの HTML ソースコードを参照してください。

既に説明したように、World Wind Java をアプリケーションまたはアプレットに組み込む方法として推奨されるのは JNLP 拡張です。これにより、World Wind コードリソースを、この拡張を組み込む Web 中の多くのアプリケーションまたはアプレット間で共有することができます。World Wind JNLP 拡張を参照するには、アプリケーションまたはアプレットの JNLP ファイルの <resources> セクションに次の行を追加します。

   <extension name="worldwind" href="http://worldwind.arc.nasa.gov/java/0.4.1/webstart/worldwind.jnlp"/>
   <extension name="jogl"
     href="http://download.java.net/media/jogl/builds/archive/jsr-231-webstart-current/jogl.jnlp"/>

World Wind 拡張 JNLP にはバージョンがあるため、World Wind のマニュアルを調べるか、フォーラムにアクセスして、JNLP から参照する最新バージョンを確認する必要があります。World Wind Central サイトは、World Wind に関する最新情報を得るのに便利な場所です。

World Wind と拡張として使用することは、WWJAppletmain-class として直接使用できないことを意味します。JNLP ファイル形式のセマンティクスにより、メイン jar (main="true") はメイン JNLP ファイルで定義される必要があります。ただし、これは簡単に対応できる制限です。何も処理を行わない WWJApplet の独自のサブクラスを作成できます (MyWWJApplet と名前を付ける)。

   class MyWWJApplet extends WWJApplet {}

これをクラスパス上の worldwind.jar でコンパイルしてから、このクラスを独自の jar ファイルにバンドルします。それをメイン jar として、MyWWJAppletmain-class として参照し、World Wind を拡張 JNLP として取り込みます。

Jake2: Java の Quake II

Jake2 アプレットの例は、インターネット経由でのゲーム配布の将来を示しています。Jake2 は、Bytonic Software によって開発された Java プラットフォームへの id Software の Quake II のポートです。今まで、Jake2 は、Java Web Start アプリケーションとして非常に効果的に配備されてきました。新しい Java Plug-In により、完全なハードウェア加速化と堅実な信頼性を備えて、ゲームを直接 Web ページに配備できるようになりました。

この例は、高度な 3D ゲームコンテンツのブラウザへの配備だけでなく、多くの Web 開発者にとって重要な、Web ページとアプレットの外観およびブランドを完全にカスタマイズする方法も示しています。

<applet> タグは、前の例と比べて少し複雑です。

   <applet id="jake2Applet" width="800" height="600"
           archive="CompatibilityApplet.jar"
           code="CompatibilityApplet">
     <param name="jnlp_href" value="jake2applet.jnlp">
     <param name="image" value="ajax-loader.gif">
     <param name="boxborder" value="false">
     <param name="centerimage" value="true">
     <param name="boxbgcolor" value="#000000">
     <param name="boxfgcolor" value="#ffffff">
     <!-- Require our own JVM instance for better robustness -->
     <param name="separate_jvm" value="true">
     <!-- Parameters for the backward compatibility applet -->
     <param name="compat_bgcolor" value="#000000">
     <param name="compat_fgcolor" value="#ffffff">
   </applet>

前と同様、Jake2 リソースは JNLP ファイル jake2applet.jnlp から取得されます。下位互換アプレットについては、こちらを参照してください。

この Web ページでは、背景を黒にし、デフォルトの Sun ロゴではなく、アプレットが実行できる状態になる前にカスタムロードインジケータを使用したいと考えます。ページの背景色は、ページの HTML で設定されます。Ajax スタイルのアニメーション GIF (黒地に白) は、image パラメータ経由でロード進捗インジケータとして使用されます。この画像のレンダリング動作は、boxbordercenterimageboxbgcolor、および boxfgcolor パラメータによってカスタマイズされます。これらについては、新しい Java Plug-In のリリースノートに詳しく文書化されています。

Jake2 は、当初はアプリケーションとして設計されたもので、ネットワーキングコードなどではグローバル状態をセットアップします。コードの 2 つのコピーが同じ JVM で起動される場合には適切に動作しません。これは、Java Web Start の配備では問題ありませんが、アプレットは通常、同じ JVM インスタンスを再利用します。Jake2 のアプレットとしての再配備を容易にするために、新しい separate_jvm アプレットパラメータ (新しい Java Plug-In のリリースノートに記載) を使用して、Jake2 アプレットを起動するたびに新しい JVM インスタンスが強制的に作成されるようにします。

jake2applet.jnlp のコンテンツは非常に簡単です。

   <jnlp href="jake2applet.jnlp">
     <resources os="Windows">
       <property name="sun.java2d.noddraw" value="true"/>
     </resources>
     <resources>
       <j2se href="http://java.sun.com/products/autodl/j2se" version="1.4+"/>
       <jar href="jake2.jar" main="true"/>
       <extension name="jogl"
          href="http://download.java.net/media/jogl/builds/archive/jsr-231-webstart-current/jogl.jnlp" />
       <extension name="joal" href="http://download.java.net/media/joal/webstart/joal.jnlp" />
     </resources>
     <applet-desc 
         name="Jake2"
         main-class="jake2.Jake2Applet"
         <!-- Overridden by the web page -->
         width="100" 
         height="100">
     </applet-desc>
   </jnlp>

World Wind アプレットの例と同様、Jake2 は JOGL を使用するため、-Dsun.java2d.noddraw=true システムプロパティーを指定します。

OpenGL で高速化された 3D グラフィックス用の JOGL 拡張および OpenAL による空間オーディオ用の JOAL 拡張は、アプレットの JNLP ファイルでそれぞれ 1 行で取り込まれます。

結論

Java Plug-In での JNLP サポートの導入により、アプレット配備に関する多くの新しい可能性が開かれ、ブラウザの内外での Java コンテンツの配備の統一が大きく前進します。Java Plug-In forumで、この新しい機能についてのフィードバックをお寄せください。