このトピックでは、プロキシの設定およびJavaアプリケーションのPack200ツールの使用に関する情報を提供します。
このトピックの内容は次のとおりです。
企業カスタマにとって、企業内でセキュアなコンピューティング環境を設定することは重要であり、プロキシ構成は、セキュリティ保護されたコンピューティング環境の必須要素です。プロキシ構成は、セキュリティを保護する防壁として機能し、プロキシ・サーバーによって、インターネットとイントラネット間のすべてのトラフィックがモニターされることを保証します。
プロキシ構成は、通常、イントラネット内部の企業ファイアウォールにより施行されるセキュリティ保護の不可欠な部分です。イントラネットWebページで、アプレットをデプロイするのにJava Plug-inを使用したり、アプリケーションを実行するのにJava Web Startを使用したりすることを望む企業カスタマは、プロキシ・サポートも設定することができます。このサポートは、Java Plug-inやJava Web Startがイントラネット環境で機能するために必要なもので、Javaコントロール・パネルを介して設定できます。
Javaコントロール・パネルでは、「一般」タブの「ネットワーク設定」をクリックしてアクセスする「ネットワーク設定」ダイアログを介して、4つのプロキシ・オプションが提供されています。
ブラウザ設定の使用
プロキシ・サーバーの使用
「自動プロキシ構成スクリプトを使用」
直接接続
「ブラウザ設定の使用」を選択した場合、プロキシ情報は完全にブラウザを介して取得されます。プロキシ情報を変更するには、ご使用のブラウザのドキュメントを参照してください。
Internet Explorer:
Internet Explorer のプロキシ サーバー設定を変更する (Windows Vista、Windows 7、Windows 8)
Internet Explorer用にプロキシ設定を構成します (Windows Server 2008 R2)
Firefox: 「オプション」ウィンドウ - 「詳細」パネルでプロキシ設定を変更します。
Chrome: Chromeでは、Windowsと同じ接続およびプロキシ設定を使用します。Internet Explorerを使用する場合と同じ手順に従います。
Javaコントロール・パネルで「プロキシ・サーバーの使用」を選択した場合、次の2つの選択肢があります。
プロキシ・サーバーのアドレスおよびポートを設定し、ローカル・アドレスに対してはプロキシ・サーバーをバイパスするオプションを指定する。
HTTP、Secure、FTPおよびSocksの各接続に対して、個別にプロキシ・サーバーを設定する。プロキシ・サーバーを使用しないようにするアドレスの一覧を指定できる。
自動プロキシ構成スクリプトの使用を選択した場合、FindProxyForURL(URL url)
という名前のJavaScriptメソッドの位置を示すURLを入力する必要があります。このJavaScriptによって返されるプロキシ・サーバーがURLに使用されます。このスクリプトに対するサポートは、30.1.4項「自動プロキシ構成」で説明する内容と同じです。
ブラウザのプラットフォームが異なると、プロキシ情報を格納する方法も異なるため、プロキシ情報を取得するジェネリックなメカニズムはありません。ここでは、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はアプリケーションごとに再起動するため、以後の起動時には自動的に新しいプロキシ情報が使用されます。
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のプロキシ・サーバー・バイパス・リスト内で、この構文をフル・サポートします。
使用するブラウザでの手動プロキシ構成の詳細は、ブラウザのユーザー・ガイドを参照してください。
自動プロキシ構成はブラウザ内で、拡張子が.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に対して、次の事項が当てはまります。
JavaScript関数FindProxyForURL
から呼出し可能な、JavaScriptヘルパー関数が多数存在します。Java Plug-inとJava Web Startは、これらの関数の独自実装を提供して、自動プロキシ構成を完全にエミュレートします。これらのヘルパー関数の実装については、次の事柄に注意してください。
dnsResolve
関数は、ホストがIPアドレスでない場合、常に空の文字列を返す。
isResolvable
関数は、ホストがIPアドレスでない場合、常にfalseを返す。
isInNet
関数は、ホストがIPアドレスでない場合、常にfalseを返す。
FindProxyForURL
関数を実行する場合、プロキシ情報が常に文字列として返されます。Java Plug-inとJava Web Startでは、次の方法で設定を抽出します。
文字列にDIRECT
が含まれる場合、Java Plug-inとJava Web Startは直接接続とみなす。
文字列にPROXY
が含まれる場合、最初のプロキシ設定を接続に使用する。
文字列にSOCKS
が含まれる場合、SOCKSバージョン4を接続に使用する。
それ以外の場合、文字列内のプロキシ情報は不正である。この場合、Java Plug-inとJava Web Startは直接接続とみなす。
開発者は、指定されたホストのプロキシ構成を決定する必要があることがあります。プロキシ構成を調べることで、適切なプロキシ・サーバーを通じてホストに接続するためのコードをより適切に記述することができます。java.net.ProxySelector
クラスは構成サポートを提供します。次は簡単なコードの例です。
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 という名前を付ける必要があります。 |
resourcesタグ内でjnlp.packEnabled
をtrue
に指定するには、propertyタグを使用します。例:
<jnlp ...> ... <resources> <property name="jnlp.packEnabled" value="true"/> <java version="1.7+" href="http://http://java.sun.com/products/autodl/j2se"/> <jar href="sampleApp.jar" main="true" download="eager"/> </resources> ... </jnlp>
この例では、Java Web StartおよびJava Plug-inは最初にsampleApp.jar.pack.gz
を探します。このファイルが見つからない場合は、元のsampleApp.jar
を探します。
java_arguments
を使用して-Djnlp.packEnabled
VM引数を渡します。例:
<HTML> ... <APPLET CODE="HelloWorld.class" WIDTH=150 HEIGHT=25> <PARAM NAME = "cache_archive" VALUE = "HelloWorld.jar"/> <PARAM NAME="java_arguments" VALUE="-Djnlp.packEnabled=true"/> </APPLET> ... </HTML>
Java Plug-inはHelloWorld.jar.pack.gz
を探し、このファイルが使用できない場合は、HelloWorld.jar
を探します。
サーバーやネットワークのアベイラビリティおよび帯域幅を向上させるために、Javaのアプリケーションやアプレットの配備の際にgzipとPack200という2つの圧縮形式を利用できます。両方の技術により、圧縮されたJARファイルがネットワーク経由で伝送され、受信側のアプリケーションで圧縮解除されて復元されます。
Rich Internet Application用に圧縮されたJARファイルを作成して配備する場合は、Javaチュートリアルのダウンロード時間の短縮に関するトピックを参照してください。
次のセクションでは、圧縮されたJARファイルをWebサーバーで処理する方法の技術的な詳細を説明します。
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要求を示しています。
例30-2 サンプルのHTTP要求
GET http://www.example.com/DynamicTreeDemo.jar.pack.gz HTTP/1.1 accept-encoding: pack200-gzip,gzip User-Agent: Mozilla/4.0 (Windows 7 6.1) Java/1.8.0 Host: example.com Accept: text/html, image/gif, image/jpeg, *; q=.2, */*; q=.2 Connection: keep-alive
次の例では、サーバーからのHTTP応答を示しています。
例30-3 サンプルのHTTP応答
HTTP/1.1 200 OK Date: Wed, 21 Mar 2012 20:13:22 GMT Server: Apache/2.2.11 (Solaris, Linux, or OS X) mod_ssl/2.2.11 OpenSSL/0.9.8k SVN/1.6.2 DAV/2 Last-Modified: Thu, 08 Mar 2012 03:48:34 GMT ETag: "489ee5-112d-4bab326774e43" Accept-Ranges: bytes Content-Length: 4397 Keep-Alive: timeout=5, max=99 Connection: Keep-Alive Content-Type: application/x-gzip Content-Encoding: gzip
動的ツリー・デモ・アプレットの詳細は、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-gzip
、gzip
またはNULL
に設定し、オプションとしてContent-Type
をapplication/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.jar
、foo.jar.gz
およびfoo.jar.jar.gz
の3つのファイルをすべてホストすることをお薦めします。
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%しか削減できません。
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
を参照してください。
JARファイルのサイズ、JARファイルの内容、および対象とするユーザーの帯域幅を検討します。
これらの要因すべてを考慮して圧縮技術を選択します。unpack200
ツールはできるだけ効率的に動作するように設計されているため、元のファイルへの復元にはほとんど時間がかかりません。JARファイルのサイズが大きく(2MB以上)、そのほとんどがクラス・ファイルである場合は、Pack200が推奨されます。そのほとんどがリソース・ファイル(JPEG、GIF、データなど)である大きいJARファイルの場合は、gzipが推奨されます。
Pack200圧縮のセグメント制限を指定します。
Pack200では、圧縮されたファイル全体をメモリーにロードします。しかし、ターゲット・システムのメモリーとリソースに制限がある場合、Pack200.Packer.SEGMENT_LIMIT
を小さな値に設定することで、圧縮および圧縮解除中に必要となるメモリー量が減少します。
たとえば、これは特殊な例ですが、値が-1
の場合、すべての入力ファイルを含む単一の巨大なセグメントが生成されます。一方、値が0
の場合、クラスごとにセグメントが1つずつ生成されます。アーカイブ・セグメントのサイズが大きければ大きいほど断片化は起こりにくく、圧縮率も高くなります。ただし、こうしたセグメントを処理するためには、大量のメモリーが必要になります。
デフォルトは-1
ですが、これはpack200
が常に単一のセグメント出力ファイルを作成することを意味します。非常に大きな出力ファイルが生成される場合には、セグメント化を使用するか、入力ファイルをより小さなJARに分割することを強くお薦めします。
たとえば、この制限が課されていない10MBのJARパック・ファイルは通常、元の10%程度のサイズにパックされます。しかし、pack200
でより大きなJavaヒープ(セグメント制限の約10倍)を必要とする場合もあります。
JARファイルに署名します。
Pack200では、結果となるJARファイルの内容を再配置します。jarsigner
ツールは、クラス・ファイルの内容をハッシュ化し、マニフェスト内の暗号化されたダイジェストにハッシュを格納します。unpack200
がファイルを圧縮解除すると、クラスの内容が再配置されるため、署名が無効になります。そのため、pack200
およびunpack200
を使用して先にJARファイルを正規化してから、署名する必要があります。
このように機能する理由: pack200
がクラス・ファイル構造に対して行う再配置はべき等であるため、2回目に圧縮されたときは、最初の圧縮で生成された順序が変更されません。またunpack200
では、どのようなアーカイブ要素の伝送順序に対しても特定のバイト・イメージを生成することが、JSR 200仕様で保証されています。
たとえば、HelloWorld.jar
を使用するとします。
JARファイルを正規化するためにファイルを再圧縮(つまり再パック)します。再パックでは、JARファイルの圧縮解除と圧縮が1回のステップで行われます。
% pack200 --repack HelloWorld.jar
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
JARファイルをpack200
で圧縮します。
% pack200 HelloWorld.jar.pack.gz HelloWorld.jar
注意: JARファイルの圧縮には、手順aで示したように、JARファイルを正規化するためにファイルを再パックするのに使用したのと同じオプションを使用する必要があります。また、セグメント境界の偶発的変化を回避するために、JDK 6以前のリリースの使用時にはすべてのパック手順でセグメント制限を-1 (無制限)に設定する必要があります。このような状況下ではクラス・ファイルのサイズがわずかに変化することで署名が壊れる可能性があります。JDK 7以降のデフォルトのセグメント制限は-1 です。 |
そのファイルをunpack200
で圧縮解除します。
% unpack200 HelloWorld.jar.pack.gz HelloT1.jar
JARファイルを検証します。
% jarsigner -verify HelloT1.jar jar verified.
JARファイルをテストします。
% Java -jar HelloT1.jar HelloWorld
検証後は、圧縮されたパック・ファイルHelloWorld.jar.pack.gz
を配備できます。
リダクション技術を利用します。
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実行システムでテストし、その実行システムが削除した属性に依存していないことを確認してください。
未知の属性を処理します。
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が原因です。次のいずれかの回避方法を使用してください。
|
インストール・プログラムで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; }
圧縮されているものも圧縮解除されているものも含め、すべてのJARファイルは、アプリケーションのテスト合格基準に沿って問題がないことをテストする必要があります。コマンド行インタフェースpack200
を使用すると、gzipとデフォルト設定を使用して出力ファイルが圧縮されます。単なるパック・ファイルを作成して、圧縮にはユーザーが指定したオプションでgzip
を使用したり、別の圧縮プログラムを使用したりすることが可能です。
Java SE 8では、JSR 292、Java以外の言語でのJava仮想マシンのサポートのために、Javaクラス・ファイルの形式が更新されました。その結果として、Java SE 8のクラス・ファイルが効果的に圧縮されるように、Pack200エンジンが適宜更新されています。特に、Pack200エンジンはJSR 292によって導入された定数プール・エントリおよび新しいバイトコードを認識するようになりました。
Pack200は、JSR-308 (タイプ注釈)およびJSR 335 (Java TMプログラミング言語のラムダ式)をサポートするように更新されました