次のリリース (Early Access)

新しい Java™ Plug-In テクノロジでの JNLP サポート

完全な環境と実行環境は
Get the JDK download  からダウンロードできます。

Java SE 6 Update 10 > 新しい Java Plug-In > JNLP サポート

目次

はじめに

次世代の 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 経由で起動されるアプレットは、Java プラットフォームバージョン選択、特定のバージョンの Java プラットフォームの自動ダウンロード、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: 現在のところ、code 属性はアプレットの JNLP ファイルの main-class パラメータと完全に等しくなるようにしてください。Java SE6 Update 10 の将来のビルドでは、この制限は削除され、<applet> タグ内の code 属性は無視されるようになる予定です。
  • <param> タグを使用して指定されるアプレットパラメータは、JNLP ファイルで指定されるパラメータとマージされます。<applet> タグと JNLP ファイルの両方で同じパラメータが指定されている場合は、java_arguments パラメータと java_version パラメータを除き、<applet> タグのバージョンが JNLP ファイルのバージョンよりも優先されます。
  • 新しい java_arguments パラメータと java_version パラメータは JNLP アプレットでは不要です。JNLP ファイルでは Java プラットフォームバージョンを要求するためのメカニズム、または JVM にコマンドライン引数を渡すためのメカニズムが代わりに使用されます。JNLP ファイルからのコマンドライン引数および Java プラットフォームバージョン要求は、アプレットに対して 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 拡張を使用する方法、アプリケーションとアプレットの両方で再利用が容易なコードを構築する方法を示します。

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

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

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

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

BackwardCompatibility.jar には、Java Plug-In の古いバージョンのユーザーにこのコンテンツが新しい Java Plug-In を必要とすることを通知し、ダウンロードページへと導く、小さなアプレットが含まれています (そのソースコードはここでダウンロード可能)。現時点では、code パラメータが JNLP ファイルの main-class パラメータと同一でなければならないという制限があるため、CompatibilityApplet の名前を「demo.applet.DemoApplet」に変更してコンパイルする必要がありました。新しい Java Plug-In の今度のビルドでは、これは不要になる予定で、このドキュメントはその時点で更新されます。

アプレットのリソースは 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="TimerApplet" archive="BackwardCompatibility.jar">
     <param name="jnlp_href" value="TimerApplet.jnlp">
   </applet>

下位互換 jar の説明については、上記の例を参照してください。

アプレットの 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="gov.nasa.worldwind.examples.applet.WWJApplet"
           archive="BackwardCompatibility.jar">

     <param name="jnlp_href" value="WWJApplet.jnlp">
   </applet>

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

以下は、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="BackwardCompatibility.jar"
           code="jake2.Jake2Applet">
     <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 から取得されます。下位互換 jar に説明については、こちらを参照してください。

この 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★で、この新しい機能についてのフィードバックをお寄せください。

Java SE Site Map
 
英語版のダウンロードページ
英語版  
 
関連リソース