Java Platform, Standard Editionデプロイメント・ガイド
目次      

30 ネットワーク

このトピックでは、プロキシの設定およびJavaアプリケーションのPack200ツールの使用に関する情報を提供します。

このトピックの内容は次のとおりです。

30.1 プロキシ構成

企業カスタマにとって、企業内でセキュアなコンピューティング環境を設定することは重要であり、プロキシ構成は、セキュリティ保護されたコンピューティング環境の必須要素です。プロキシ構成は、セキュリティを保護する防壁として機能し、プロキシ・サーバーによって、インターネットとイントラネット間のすべてのトラフィックがモニターされることを保証します。

プロキシ構成は、通常、イントラネット内部の企業ファイアウォールにより施行されるセキュリティ保護の不可欠な部分です。イントラネットWebページで、アプレットをデプロイするのにJava Plug-inを使用したり、アプリケーションを実行するのにJava Web Startを使用したりすることを望む企業カスタマは、プロキシ・サポートも設定することができます。このサポートは、Java Plug-inやJava Web Startがイントラネット環境で機能するために必要なもので、Javaコントロール・パネルを介して設定できます。

30.1.1 Javaコントロール・パネル

Javaコントロール・パネルでは、「一般」タブの「ネットワーク設定」をクリックしてアクセスする「ネットワーク設定」ダイアログを介して、4つのプロキシ・オプションが提供されています。

  • ブラウザ設定の使用

  • プロキシ・サーバーの使用

  • 「自動プロキシ構成スクリプトを使用」

  • 直接接続

30.1.2 Java Plug-inとJava Web Startでブラウザからプロキシ情報を取得する方法

ブラウザのプラットフォームが異なると、プロキシ情報を格納する方法も異なるため、プロキシ情報を取得するジェネリックなメカニズムはありません。ここでは、WindowsでInternet ExplorerとFirefoxからプロキシ情報を取得する方法について説明します。

  • Internet Explorer: Internet Explorerでは、Windowsレジストリに含まれているのと同じキー・セットからプロキシ情報を取得します。Java Plug-inとJava Web Startでは、この情報をレジストリから直接抽出します。

  • Firefox: Firefoxでは、プロキシ情報をローカル・マシンのユーザー・プロファイル・ディレクトリ内の設定ファイルに格納します。また、プロキシ情報を特定するための公開APIを利用できます。Java Plug-inではこれらの公開APIを使用し、Java Web Startでは設定ファイルを読み取って解析し、プロキシ情報を取得します。

Java Plug-inとJava Web Startでは、プロキシ情報を起動時に取得します。Java Plug-inまたはJava Web Startの起動後にプロキシ設定を変更した場合、Javaコンソールのpオプションを使用して、ブラウザからプロキシ情報を強制的に再ロードします。Java Web Startはアプリケーションごとに再起動するため、以後の起動時には自動的に新しいプロキシ情報が使用されます。

30.1.3 手動プロキシ構成

Internet Explorer、FirefoxおよびChromeでは手動プロキシ構成がサポートされています。ユーザーは各プロトコルについてプロキシ・サーバーとポートを指定することができます。また、ユーザーは、1つのプロキシ・サーバーおよびすべてのプロトコル用のポートを指定することもできます。イントラネット環境内で2つのマシンを接続する場合に、プロキシ・サーバーの負荷を最小限に抑えるため、プロキシ・サーバーを完全に無視するサイトがあります。これを行うには、ネットワーク管理者およびユーザーは、ブラウザのプロキシ設定でプロキシ・サーバーのバイパス・リストを指定できます。

Internet Explorer: Java Plug-inとJava Web Startでは、このプロトコルに関連付けられたプロキシ・サーバーおよびポート設定を認識およびサポートします。IEは、プロキシ・サーバー・バイパス・リスト内の様々な構文をサポートします。次にその構文を示します。

  • IPアドレス/ホスト名のみ

  • IPアドレス/ホスト名(ワイルドカードを使用)

  • IPアドレス/ホスト名(プロトコルを使用)

たとえば、プロキシ・サーバー・バイパス・リストに"203.0.113.0;*.eng;http://*.com"を指定すると、次のいずれかが発生する場合は常に、ブラウザはプロキシをバイパスします。

  • "203.0.113.0"が要求される。

  • URLホスト名が.engで終わる。

  • URLプロトコルがHTTPで、URLホスト名が.comで終わる。

現在のところ、Java Plug-inとJava Web Startでサポートするのは、IEのプロキシ・サーバー・バイパス・リストの最初の2つの構文です。さらに、IEでは、プロキシ・サーバー・バイパス・リストを使用しない、ローカル(イントラネット)アドレス用プロキシ・サーバーのバイパスもサポートされます。Java Plug-inとJava Web Startでは、URLホスト名にドット(.)が含まれない場合、プロキシ・サーバーをバイパスすることにより、このオプションをサポートします。

Firefox: Java Plug-inとJava Web Startでは、このプロトコルに関連付けられたプロキシ・サーバーおよびポート設定を認識およびサポートします。たとえば、Firefoxのプロキシ・サーバー・バイパス・リストに.eng,.sun.comを指定すると、URLホスト名が.engまたは.sun.comで終わる場合は常に、プロキシがバイパスされます。Java Plug-inとJava Web Startでは、Firefoxのプロキシ・サーバー・バイパス・リスト内で、この構文をフル・サポートします。

使用するブラウザでの手動プロキシ構成の詳細は、ブラウザのユーザー・ガイドを参照してください。

30.1.4 自動プロキシ構成

自動プロキシ構成はブラウザ内で、拡張子が.pacまたは.jsのJavaScriptファイルを含む特定のURLを設定することでサポートされます。このファイルには、FindProxyForURLという関数が含まれます。この関数には、ブラウザが接続要求を受信するとき、どのプロキシ・サーバーを使用するかを決定するロジックが含まれます。この関数は、特定のイントラネット環境で、システム管理者により記述されます。ブラウザは、起動時にJavaScriptファイルのURLを認識し、直接接続を使用してローカル・マシンにダウンロードします。その後、新規接続を確立する必要がある場合、ブラウザは常にJavaScriptファイル内のFindProxyForURL JavaScript関数を実行してプロキシ情報を取得し、接続を設定します。

Java Plug-in

  • Internet Explorer: 起動時に、Java Plug-inは、直接接続を使用してJavaScriptファイルをローカル・マシンにダウンロードします。その後、接続の新規確立が必要になるたびに、FindProxyForURL関数が実行され、Internet ExplorerのJavaScriptエンジンを使用してプロキシ情報が取得されます。

  • Firefox: 起動時に、Java Plug-inは、直接接続を使用してJavaScriptファイルをローカル・マシンにダウンロードします。その後、接続の新規確立が必要になるたびに、FindProxyForURL関数が実行され、FirefoxのJavaScriptエンジンを使用してプロキシ情報の取得が行われます。

Java Web Start

  • Windows: 起動時に、Java Web Startは、直接接続を使用してJavaScriptファイルをローカル・マシンにダウンロードします。その後、接続の新規確立が必要になるたびに、FindProxyForURL関数が実行され、Internet ExplorerのJavaScriptエンジンを使用してプロキシ情報が取得されます。

  • Linux、Solaris、OS X: 起動時に、Java Web Startは、直接接続を使用してJavaScriptファイルをローカル・マシンにダウンロードします。その後、接続の新規確立が必要になるたびに、FindProxyForURL関数が解析され、もっとも適切な情報が推測されて、プロキシ情報の取得が行われます。

FindProxyForURLにおける注意

JavaScriptエンジンについて、すべてのプラットフォームのJava Plug-inと、Windows上のJava Web Startに対して、次の事項が当てはまります。

  1. JavaScript関数FindProxyForURLから呼出し可能な、JavaScriptヘルパー関数が多数存在します。Java Plug-inとJava Web Startは、これらの関数の独自実装を提供して、自動プロキシ構成を完全にエミュレートします。これらのヘルパー関数の実装については、次の事柄に注意してください。

    • dnsResolve関数は、ホストがIPアドレスでない場合、常に空の文字列を返す。

    • isResolvable関数は、ホストがIPアドレスでない場合、常にfalseを返す。

    • isInNet関数は、ホストがIPアドレスでない場合、常にfalseを返す。

  2. FindProxyForURL関数を実行する場合、プロキシ情報が常に文字列として返されます。Java Plug-inとJava Web Startでは、次の方法で設定を抽出します。

    • 文字列にDIRECTが含まれる場合、Java Plug-inとJava Web Startは直接接続とみなす。

    • 文字列にPROXYが含まれる場合、最初のプロキシ設定を接続に使用する。

    • 文字列にSOCKSが含まれる場合、SOCKSバージョン4を接続に使用する。

    • それ以外の場合、文字列内のプロキシ情報は不正である。この場合、Java Plug-inとJava Web Startは直接接続とみなす。

30.2 Pack200で圧縮されたJARファイルのデプロイ

Javaシステム・プロパティjnlp.packEnabledがJNLPファイルまたはappletタグでtrueに設定されている場合、Java Plug-inまたはJava Web StartはPack200ツールで圧縮されたJARファイルをダウンロードします。圧縮バージョンが使用できない場合、Java Plug-inまたはJava Web Startは非圧縮バージョンを探します。


注意:

Pack200で圧縮されたJARファイルには、拡張子pack.gzが付いている必要があります。たとえば、JARファイルの名前がsampleApp.jarである場合、Pack200で圧縮されたこのファイルのバージョンにはsampleApp.jar.pack.gzという名前を付ける必要があります。

30.3 ネットワーク配備用の圧縮形式

サーバーやネットワークのアベイラビリティおよび帯域幅を向上させるために、Javaのアプリケーションやアプレットの配備の際にgzipとPack200という2つの圧縮形式を利用できます。両方の技術により、圧縮されたJARファイルがネットワーク経由で伝送され、受信側のアプリケーションで圧縮解除されて復元されます。

Rich Internet Application用に圧縮されたJARファイルを作成して配備する場合は、Javaチュートリアルのダウンロード時間の短縮に関するトピックを参照してください。

次のセクションでは、圧縮されたJARファイルをWebサーバーで処理する方法の技術的な詳細を説明します。

30.3.1 背景

Hypertext Transfer Protocol -- HTTP 1.1 (RFC 2616)では、HTTP圧縮について説明しています。HTTP圧縮により、アプリケーションではJARファイルを圧縮されたJARファイルのまま配備することができます。サポートされている圧縮技術はgzip、compressおよびdeflateです。

JDKバージョン5.0では、HTTP圧縮はRFC 2616に準拠してJava Web StartとJava Plug-inに実装されています。サポートされている技術はgzipおよびpack200-gzipです。

要求側のアプリケーションでは、HTTP要求をサーバーに送信して、そのファイルの圧縮バージョンを処理できることを通知できます。次の例は、JARファイルがPack200で圧縮されている動的ツリー・デモ・アプレットがロードされるときに作成されるHTTP要求を示しています。

次の例では、サーバーからのHTTP応答を示しています。

動的ツリー・デモ・アプレットの詳細は、Javaチュートリアルのアプレットの配備に関するトピックを参照してください。

Accept-Encodingフィールドはクライアントが受け入れられるものを示し、クライアントによって設定されます。Content-Encodingフィールドは送信されているものを示し、サーバーによって設定されます。Content-Typeフィールドは、変換またはデコードが行われるときにクライアントが期待すべきものを示します。

この例では、Accept-Encodingフィールドがpack200-gzipおよびgzipに設定され、アプリケーション(この場合は、Windows 7で動作し、JRE 7に付属のJava Plug-inを使用するMozilla Firefox)がpack200-gzipおよびgzip形式を処理できることをサーバーに通知します。

サーバーは、ファイル拡張子が.pack.gzまたは.gzである要求されたJARファイルを検索し、見つかったファイルで応答します。サーバーは送信しているファイルのタイプに応じて、応答ヘッダーのContent-Encodingフィールドをpack200-gzipgzipまたはNULLに設定し、オプションとしてContent-Typeapplication/x-java-archiveに設定します。したがって、要求側のアプリケーションでは、Content-Encodingフィールドを検査することで、対応する変換を実行し、元のJARファイルに復元します。

図30-1では、クライアントはAccept-Encodingフィールドがpack200-gzip,gzipに設定されたfoo.jarファイルを要求します。サーバーはfoo.jar.pack.gzファイルを検索します。ファイルが見つかると、サーバーはそのファイルをクライアントに送信し、Content-Encodingフィールドをpack200-gzipに設定します。

図30-2では、foo.jar.pack.gzファイルが見つからない場合、サーバーはfoo.jar.gzファイルで応答し、見つかった場合はContent-Encodingフィールドをgzipに設定します。

図30-3では、foo.jar.pack.gzファイルとfoo.jar.gzファイルが見つからない場合、サーバーはfoo.jarファイルで応答し、Content-Encodingフィールドを設定しないか、NULLに設定します。

図30-4では、レガシー・アプリケーション(HTTPまたはPack200圧縮のないアプリケーション)がfoo.jarファイルを要求し、その結果としてそのアプリケーションはシームレスに動作し続けます。したがって、foo.jarfoo.jar.gzおよびfoo.jar.jar.gzの3つのファイルをすべてホストすることをお薦めします。

30.3.2 GZIP圧縮

gzipは無償で提供される圧縮プログラムであり、java.util.zip.GZIPInputStreamおよびjava.util.zip.GZIPOutputStreamとしてJREおよびSDK内で利用できます。

コマンド行バージョンは、ほとんどのSolaris、LinuxまたはMac OS Xオペレーティング・システム、Windows UNIXツールキット(CygwinおよびMKS Toolkit)で利用でき、http://www.gzip.org/からも入手できます。

gzipを使用する場合は、圧縮されたJARファイルを圧縮するよりも、圧縮されていないJARファイルを圧縮したほうがより効果的です。その反面、ターゲット・システムでJARファイルが圧縮されないまま格納されることがあります。

たとえば、次の表はgzipを使用してNotepad.jarファイルを圧縮した結果を示しています。

JARファイルのタイプ gzipで圧縮する前のサイズ gzipで圧縮した後のサイズ
収縮された個々のエントリを含むJARファイル Notepad.jar: 46.25 KB Notepad.jar.gz: 43.00 KB
格納された(収縮されていない)エントリを含むJARファイル Notepad.jar: 987.47 KB Notepad.jar.gz: 32.47 KB

この例でわかるように、圧縮されていないJARファイルを圧縮することでダウンロード・サイズを14%も削減できたのに対し、圧縮されたJARファイルを圧縮しても3%しか削減できません。

30.3.3 Pack200圧縮

Pack200では、JAR内のクラス・ファイルの密度とサイズに応じて、サイズの大きいファイルを非常に効率よく圧縮できます。JARファイルに含まれているのがクラス・ファイルのみで、その大きさが数メガバイト程度しかなければ、9分の1に圧縮されることが期待できます。

前述の例と同じJARファイルを使用します。

  • Notepad.jar: 46.25 kb

  • Notepad.jar.pack.gz: 22.58 kb

この場合、同じJARファイルのサイズを50%削減できます。

Pack200はJavaクラス・ファイルに対して、もっとも効率のよい方法です。次のような複数の技術を使用して、効果的にJARファイルのサイズを小さくします。

  • クラス・ファイル内の定数プール・データをマージしてソートし、アーカイブ内の同じ場所に配置します。

  • 冗長なクラス属性を削除します。

  • 内部データ構造を格納します。

  • 増分(デルタ)および可変長エンコーディングを使用します。

  • セカンダリ圧縮に最適なコーディングのタイプを選択します。

JARファイルの圧縮および圧縮解除には、SDKまたはJREディレクトリのbinディレクトリに入っているコマンド行インタフェースのpack200およびunpack200を使用します。

Pack200インタフェースをプログラムで呼び出すこともできます。java.util.jar.Pack200を参照してください。

30.3.3.1 ファイルをパック(圧縮)する手順

  1. JARファイルのサイズ、JARファイルの内容、および対象とするユーザーの帯域幅を検討します。

    これらの要因すべてを考慮して圧縮技術を選択します。unpack200ツールはできるだけ効率的に動作するように設計されているため、元のファイルへの復元にはほとんど時間がかかりません。JARファイルのサイズが大きく(2MB以上)、そのほとんどがクラス・ファイルである場合は、Pack200が推奨されます。そのほとんどがリソース・ファイル(JPEG、GIF、データなど)である大きいJARファイルの場合は、gzipが推奨されます。

  2. Pack200圧縮のセグメント制限を指定します。

    Pack200では、圧縮されたファイル全体をメモリーにロードします。しかし、ターゲット・システムのメモリーとリソースに制限がある場合、Pack200.Packer.SEGMENT_LIMITを小さな値に設定することで、圧縮および圧縮解除中に必要となるメモリー量が減少します。

    たとえば、これは特殊な例ですが、値が-1の場合、すべての入力ファイルを含む単一の巨大なセグメントが生成されます。一方、値が0の場合、クラスごとにセグメントが1つずつ生成されます。アーカイブ・セグメントのサイズが大きければ大きいほど断片化は起こりにくく、圧縮率も高くなります。ただし、こうしたセグメントを処理するためには、大量のメモリーが必要になります。

    デフォルトは-1ですが、これはpack200が常に単一のセグメント出力ファイルを作成することを意味します。非常に大きな出力ファイルが生成される場合には、セグメント化を使用するか、入力ファイルをより小さなJARに分割することを強くお薦めします。

    たとえば、この制限が課されていない10MBのJARパック・ファイルは通常、元の10%程度のサイズにパックされます。しかし、pack200でより大きなJavaヒープ(セグメント制限の約10倍)を必要とする場合もあります。

  3. JARファイルに署名します。

    Pack200では、結果となるJARファイルの内容を再配置します。jarsignerツールは、クラス・ファイルの内容をハッシュ化し、マニフェスト内の暗号化されたダイジェストにハッシュを格納します。unpack200がファイルを圧縮解除すると、クラスの内容が再配置されるため、署名が無効になります。そのため、pack200およびunpack200を使用して先にJARファイルを正規化してから、署名する必要があります。

    このように機能する理由: pack200がクラス・ファイル構造に対して行う再配置はべき等であるため、2回目に圧縮されたときは、最初の圧縮で生成された順序が変更されません。またunpack200では、どのようなアーカイブ要素の伝送順序に対しても特定のバイト・イメージを生成することが、JSR 200仕様で保証されています。

    たとえば、HelloWorld.jarを使用するとします。

    1. JARファイルを正規化するためにファイルを再圧縮(つまり再パック)します。再パックでは、JARファイルの圧縮解除と圧縮が1回のステップで行われます。

      % pack200 --repack HelloWorld.jar
      
    2. JARファイルに署名します。

      % jarsigner -keystore myKeystore HelloWorld.jar user_name
      

      注意:

      再パックしたファイルには、元のJARファイルの構築に使用したものと同じ鍵で署名する必要があります。あるいは、再パック、再署名、および検証を行う前に、META-INFディレクトリにあるすべての署名ファイルを削除します。署名ファイルの名前はMANIFEST.MF*.DSA、および*.SFです。

      署名したJARファイルを検証して署名されていることを確認します。

      % jarsigner -verify HelloWorld.jar
      jar verified.
      

      JARファイルが引き続き機能していることを確認します。

      % Java -jar HelloWorld.jar
      HelloWorld
      
    3. JARファイルをpack200で圧縮します。

      % pack200 HelloWorld.jar.pack.gz HelloWorld.jar
      

      注意:

      JARファイルの圧縮には、手順aで示したように、JARファイルを正規化するためにファイルを再パックするのに使用したのと同じオプションを使用する必要があります。また、セグメント境界の偶発的変化を回避するために、JDK 6以前のリリースの使用時にはすべてのパック手順でセグメント制限を-1 (無制限)に設定する必要があります。このような状況下ではクラス・ファイルのサイズがわずかに変化することで署名が壊れる可能性があります。JDK 7以降のデフォルトのセグメント制限は-1です。

    4. そのファイルをunpack200で圧縮解除します。

      % unpack200 HelloWorld.jar.pack.gz HelloT1.jar
      
    5. JARファイルを検証します。

      % jarsigner -verify HelloT1.jar
      jar verified.
      

      JARファイルをテストします。

      % Java -jar HelloT1.jar
      HelloWorld
      

    検証後は、圧縮されたパック・ファイルHelloWorld.jar.pack.gzを配備できます。

  4. リダクション技術を利用します。

    Pack200は、デフォルトではHigh Fidelity (Hi-Fi)モードで動作します。したがって、JARファイルの個別エントリごとの属性とクラスにある元の属性はすべて保持されます。このため、一般的にパックされたファイルのサイズは増加しがちです。次の技法を使用して、ダウンロードのサイズをさらに削減します。

    • 更新時間: JARファイル内の各エントリの更新時間が重要でない場合は、Pack200.Packer.MODIFICATION_TIME="LATEST"オプションを指定できます。こうすることで、パック・ファイルで転送される更新時間はセグメントごとに1つになります。最新時間は、そのセグメント内すべてのエントリでもっとも新しく更新された時間になります。

    • 圧縮指示: 更新時間を"LATEST"に設定するのと同様に、アーカイブ内の各エントリの圧縮状態が必要ない場合は、Pack200.Packer.DEFLATION_HINT="false"と設定します。こうすると個別の圧縮指示は転送されないため、わずかですがダウンロードするサイズが小さくなります。ただし、JARファイルは変換されるときに、「格納された」エントリを含むため、ターゲット・システムでのディスク消費領域が増加することがあります。

      たとえば、

      pack200 --modification-time=latest --deflate-hint="true"
      tools-md.jar.pack.gz tools.jar
      

      注意:

      前述の最適化は、何千ものエントリを含むJARファイルでは効果が顕著になります。

    • 属性: JARファイルの配備時には必要のないクラス属性があります。これらの属性はクラス・ファイルから除くことが可能で、ダウンロードするサイズを大幅に減らすことができます。しかし、必須の実行時属性は保持するように注意してください。

      デバッグ属性: 行番号やソース・ファイルといったデバッグ情報は必要ないため(これらは通常はアプリケーションのスタック・トレース内にある)、これらの属性はPack200.Packer.STRIP_DEBUG=true.を指定して破棄できます。これにより、パックされたファイルのサイズは、一般的に約10%減ります。

      次に例を示します。

      pack200 --strip-debug tools-stripped.jar.pack.gz tools.jar
      

      その他の属性: 経験豊富なユーザーは、他のストリップ関連プロパティを使用して、他の属性を削除できます。ただしその場合は、一層の注意が必要です。生成されるJARファイルを想定されるすべてのJava実行システムでテストし、その実行システムが削除した属性に依存していないことを確認してください。

  5. 未知の属性を処理します。

    Pack200は、Java仮想マシン仕様により定義される標準的な属性に対応しますが、コンパイラはカスタム属性の影響を受けません。カスタム属性が存在すると、デフォルトでは、Pack200はクラスを通過して警告メッセージを発行します。これらの、「通過」するクラス・ファイルにより、パックしたファイルのサイズが大きくなる場合があります。JARファイルのクラス内に、未知の属性が多く使われている場合、圧縮された出力のサイズが非常に大きくなる場合があります。その場合は、次の方法を検討してください。

    • 属性が実行時に不要であると判断される場合、属性を取り除きます。これを実現するには、Pack200.Packer.UNKNOWN_ATTRIBUTE=STRIPプロパティを設定します。

      pack200 --unknown-attribute=strip
      foo.pack.gz foo.jar
      
    • 属性が実行時に必要で、圧縮されたファイルのサイズ膨張の原因になる場合、警告メッセージから属性を特定し、適切な配置を行います。この方法については、Pack200 JSR 200 の仕様および Java API リファレンスのPack200.Packerインタフェースのセクションで説明されています。

    • コンパイラが、Pack200のレイアウト仕様内で実装されない属性を定義することも可能ですが、pack200が正常に機能しなくなる場合があります。その場合は、クラス・ファイル名をリソースのようにすることで、クラス・ファイル全体を「通過させる」ことができます。次のように指定できます。

      pack200 --pass-file="com/acme/foo/bar/baz.class" foo.pack.gz foo.jar
      

      ディレクトリとその内容全体を通過させるには、次のように指定します。

      pack200 --pass-file="com/acme/foo/bar/" foo.pack.gz foo.jar
      

    注意:

    大きなJARファイルに署名するときは、セキュリティ・エラーでこの手順が失敗することがあります。このエラーの多くは、バグ5078608が原因です。次のいずれかの回避方法を使用してください。
    • 再パックおよびパック中に--segment-limit=-1を指定します。

    • これらの再パックおよび署名の手順に従います。

      1. pack200 --repack b.jar a.jar

      2. b.jarに署名します。

      3. pack200 --repack c.jar b.jar

      4. c.jarに署名します。

      5. pack200 out.jar.pack.gz c.jar

      6. out.jar.pack.gzをデプロイします。


  6. インストール・プログラムでPack200を利用します。

    インストール・プログラムでPack200テクノロジを利用することが必要な場合があり、そのために、場合によっては、製品のJARファイルをPack200を使用して圧縮し、インストール中に圧縮解除する必要があります。インストールにJREまたはSDKが含められている場合、配布されたbinディレクトリにあるunpack200 (Solaris、LinuxまたはOS X)またはunpack200.exe (Windows)ツールを自由に使用できます。この実装は純粋なC++アプリケーションなので、実行するためにJavaランタイムは必要はありません。

    Windows: インストーラは、GZIPよりも優れたアルゴリズムを使用してエントリを圧縮することがあります。そのような場合は、次のようにpack200ツールを使用すれば、インストーラ自体の圧縮によってよりよい圧縮効果を得られます。

    pack200 --no-gzip foo.jar.pack foo.jar
    

    これにより、gzipとして圧縮された出力ファイルになることを防ぐことができます。

    unpack200はWindowsコンソールのアプリケーションです。つまり、インストール中はMS-DOSウィンドウを表示します。これを防ぐには、次に示すように、このウィンドウを非表示にするWinMainとともに起動ツールを使用します。

    サンプル・コード:

    #include "windows.h"
    #include <stdio.h>
    
    int APIENTRY WinMain(HINSTANCE hInstance,
                         HINSTANCE hPrevInstance,
                         LPSTR     lpCmdLine,
                         int       nCmdShow) {
      STARTUPINFO si;
      memset(&si, 0, sizeof(si));
      si.cb = sizeof(si);
    
      PROCESS_INFORMATION pi;
      memset(&pi, 0, sizeof(pi));
    
      //Test
      //lpCmdLine = "c:/build/windows-i586/bin/unpack200 -l c:/Temp/log c:/Temp/rt.pack c:/Temp/rt.jar";
      int ret = CreateProcess(NULL,                 /* Exec. name */
                              lpCmdLine,            /* cmd line */
                              NULL,                 /* proc. sec. attr. */
                              NULL,                 /* thread sec. attr */
                              TRUE,                 /* inherit file handle */
                              CREATE_NO_WINDOW | DETACHED_PROCESS, /* detach the process/suppress console */
                              NULL,                 /* env block */
                              NULL,                 /* inherit cwd */
                              &si,                      /* startup info */
                              &pi);                     /* process info */
      if ( ret == 0) ExitProcess(255);
    
      // Wait until child process exits.
      WaitForSingleObject( pi.hProcess, INFINITE );
    
      DWORD exit_val;
    
      // Be conservative and return
      if (GetExitCodeProcess(pi.hProcess, &exit_val) == 0) ExitProcess(255);
    
      ExitProcess(exit_val); // Return the error code of the child process
    
      return -1;
    }
    

30.3.6 Java Standard Edition 8での更新

Java SE 8では、JSR 292Java以外の言語でのJava仮想マシンのサポートのために、Javaクラス・ファイルの形式が更新されました。その結果として、Java SE 8のクラス・ファイルが効果的に圧縮されるように、Pack200エンジンが適宜更新されています。特に、Pack200エンジンはJSR 292によって導入された定数プール・エントリおよび新しいバイトコードを認識するようになりました。

Pack200は、JSR-308 (タイプ注釈)およびJSR 335 (Java TMプログラミング言語のラムダ式)をサポートするように更新されました

目次      

Copyright © 1993, 2020, Oracle and/or its affiliates. All rights reserved.