public static interface Pack200.Packer
Pack200.newPacker()
を使用して取得できます。
高度な圧縮は、JSR 200 仕様で説明されている多数のテクニックを使用して実現されます。これらの技術には、定数プールのソート、再順序付け、および同位置への配置が含まれます。
pack エンジンは、初期化されると、次に示すプロパティーで規定された初期状態になります。初期状態を操作するには、(properties()
を使用して) エンジンプロパティーを取得してから、修正したプロパティーをマップに格納します。リソースファイルは、一切変更なしで渡されます。unpacker は、定数プール順などの一般的ではないクラスファイル機能に自由に変更できるため、クラスファイルには同一のバイトは含まれません。ただし、『Java™ 仮想マシン仕様』で指定されているように、これらのクラスファイルは意味的に同一です。
デフォルトでは、packer が JAR 要素の順序を変更することはありません。また、各 JAR 要素の修正時間およびデフレーションヒントは、変更を加えられずに渡されます(Unix ファイルのアクセス権を付与する追加属性などの、ほかの ZIP アーカイブ情報は失われる)。
一般に、JAR のパックおよび展開により、JAR のクラスファイル内にあるバイト単位のコンテンツが変更されます。これは、通常、パックおよび展開により、JAR 要素のバイト単位イメージに依存するデジタル署名がすべて無効になることを意味します。JAR の署名とパックの両方を実行するためには、最初に JAR のパックと展開を実行して「正規化」してから、展開された JAR 要素上の署名を計算し、最後に署名済みの JAR を再パックする必要があります。両方のパック手順で正確に同じオプションを使用してください。また、クラスファイルのサイズは微妙に変化するため、セグメント境界を意図せずに変更してしまうことを避けるために、セグメント制限を「-1」に設定することが必要な場合もあります。
(このように行える理由: パックプログラムが実行するクラスファイル構造の再配置はべき等であるため、2 回目のパックでは、最初のパックで生成された順序が変更されない。またアンパックプログラムでは、どのようなアーカイブ要素の伝送順序に対しても特定のバイトイメージを生成することが、JSR 200 仕様で保証されている)
下位互換性を保持するために、パックファイルのバージョンは、入力 JAR ファイルにあるクラスファイルに適合するよう設定されます。つまり、クラスファイルが最新であればパックファイルのバージョンも最新となり、反対に、クラスファイルのバージョンがもっとも古い場合は、パックファイルのバージョンも、もっとも古くなるということです。中間のクラスファイルのバージョンについては、対応するパックファイルのバージョンが使用されます。たとえば、入力 JAR ファイルが 1.5 (またはそれ未満の) クラスファイルでのみ構成される場合は、1.5 と互換性のあるパックファイルが生成されます。これは、クラスファイルのないアーカイブにも該当します。入力 JAR ファイルに 1.6 クラスファイルが含まれる場合、パックファイルのバージョンは 1.6 に設定されます。
注: ほかで指定がない場合、null 引数をコンストラクタ、またはこのクラスのメソッドへ渡すと NullPointerException
がスローされます。
修飾子と型 | フィールドと説明 |
---|---|
static String |
CLASS_ATTRIBUTE_PFX
クラス属性名に連結された場合、JSR 200 仕様で指定されたレイアウト言語を使用して、その属性の形式を示します。
|
static String |
CODE_ATTRIBUTE_PFX
コード属性名と連結して使用された場合、属性の形式を示します。
|
static String |
DEFLATE_HINT
|
static String |
EFFORT
このプロパティーが 1 桁の 10 進数に設定されると、packer は指定された量の労力をアーカイブの圧縮に費やします。
|
static String |
ERROR
文字列「error」は、特定のプロパティーで使用できます。
|
static String |
FALSE
文字列「false」は、特定のプロパティーで使用できます。
|
static String |
FIELD_ATTRIBUTE_PFX
フィールド属性名と連結して使用された場合、属性の形式を示します。
|
static String |
KEEP
文字列「keep」は、特定のプロパティーで使用できます。
|
static String |
KEEP_FILE_ORDER
このプロパティーが
TRUE に設定されると、packer はソースアーカイブ内のすべての要素を元の順序で転送します。 |
static String |
LATEST
文字列「latest」は、特定のプロパティーで使用できます。
|
static String |
METHOD_ATTRIBUTE_PFX
メソッド属性名と連結して使用された場合、属性の形式を示します。
|
static String |
MODIFICATION_TIME
このプロパティーが特殊な文字列
LATEST に設定されると、packer は、元のアーカイブ内の利用可能な全エントリ内で最新の修正時間、または各セグメント内の利用可能な全エントリの最新の修正時間の決定を試みます。 |
static String |
PASS
文字列「pass」は、特定のプロパティーで使用できます。
|
static String |
PASS_FILE_PFX
ファイルを圧縮せずにバイト単位で渡すことを示します。
|
static String |
PROGRESS
unpacker の進捗状況をパーセントで示します。状況は、unpacker により周期的に更新されます。
|
static String |
SEGMENT_LIMIT
このプロパティーは、各アーカイブ要素の推定ターゲットサイズ N (単位はバイト) を付与する数値です。
|
static String |
STRIP
文字列「strip」は、特定のプロパティーで使用できます。
|
static String |
TRUE
文字列「true」は、特定のプロパティーで使用できます。
|
static String |
UNKNOWN_ATTRIBUTE
不明な属性を含むクラスファイルに遭遇したときに実行するアクションを示します。
|
修飾子と型 | メソッドと説明 |
---|---|
void |
addPropertyChangeListener(PropertyChangeListener listener)
PropertyChange イベントのリスナーをプロパティーマップに登録します。
|
void |
pack(JarFile in, OutputStream out)
JarFile を取得して、Pack200 アーカイブに変換します。
|
void |
pack(JarInputStream in, OutputStream out)
JarInputStream を取得して、Pack200 アーカイブに変換します。
|
SortedMap<String,String> |
properties()
このエンジンのプロパティーセットを取得します。
|
void |
removePropertyChangeListener(PropertyChangeListener listener)
addPropertyChangeListener(java.beans.PropertyChangeListener) で追加された、PropertyChange イベントのリスナーを削除します。 |
static final String SEGMENT_LIMIT
たとえば、これは特殊な例ですが、値が -1 の場合、すべての入力ファイルを含む単一の巨大なセグメントが生成されます。一方、値が 0 の場合、クラスごとにセグメントが 1 つずつ生成されます。アーカイブセグメントのサイズが大きければ大きいほど断片化は起こりにくく、圧縮率も高くなります。しかし、こうしたセグメントを処理するためには、大量のメモリーが必要になります。
各セグメントのサイズは、セグメント内で転送される入力ファイルのサイズと、このファイルの名前のサイズ、およびその他の転送プロパティーによって予測されます。
デフォルトは -1 ですが、これは、パッカーが常に単一のセグメント出力ファイルを作成することを意味します。非常に大きな出力ファイルが生成される場合には、セグメント化を使用するか、入力ファイルをより小さな JAR に分割することを強くお勧めします。
通常、この制限なしでパックされた 10M バイトの JAR は約 10% 余計に小さくなりますが、packer にはより多くの Java ヒープ (セグメント制限の約 10 倍) が必要になります。
static final String KEEP_FILE_ORDER
TRUE
に設定されると、packer はソースアーカイブ内のすべての要素を元の順序で転送します。
これが FALSE
に設定されると、packer は要素を再度順序付けし、Java アプリケーションに関する有用な情報を含まない JAR ディレクトリエントリを削除します (通常は、これにより圧縮率が向上する)。
デフォルトは TRUE
です。これにより、入力情報は保存されますが、転送するアーカイブのサイズが必要以上に大きくなる場合があります。
static final String EFFORT
特殊な値 0 を指定すると、packer は元の JAR ファイルを圧縮せずに直接コピーします。JSR 200 標準では、すべてのアンパックツールはこの特殊な処理をアーカイブ全体のパススルーとして理解する必要があります。
デフォルト値は 5 です。この場合、標準的な時間で、適度な圧縮が行われます。
static final String DEFLATE_HINT
TRUE
または FALSE
に設定されると、packer は出力アーカイブ内でそれに応じたデフレーションヒントを設定し、アーカイブ要素の個別のデフレーションヒントを転送しません。
このプロパティーが特殊な文字列 KEEP
に設定されると、packer は入力アーカイブ内の利用可能な要素ごとに独立したデフレーションヒントを決定し、ヒントを別個に転送しようと試みます。
デフォルトは KEEP
です。これにより、入力情報は保存されますが、転送するアーカイブのサイズが必要以上に大きくなる場合があります。
展開する jar の要素を正しく圧縮するためにヒントを適切に処理することは、unpacker 実装に依存します。
ZIP または JAR 要素のデフレーションヒントは、要素が圧縮されたか、そのまま格納されたかを示します。
static final String MODIFICATION_TIME
LATEST
に設定されると、packer は、元のアーカイブ内の利用可能な全エントリ内で最新の修正時間、または各セグメント内の利用可能な全エントリの最新の修正時間の決定を試みます。この単一の値はセグメントの一部として転送され、各セグメント SEGMENT_LIMIT
の全エントリに適用されます。
これにより、インストールされたファイルすべてが単一の日付に設定される代わりに、転送するアーカイブのサイズをわずかに減少させることができます。
このプロパティーを特殊な文字列 KEEP
に設定すると、packer は入力要素ごとに別個の修正時間を転送します。
デフォルトは KEEP
です。これにより、入力情報は保存されますが、転送するアーカイブのサイズが必要以上に大きくなる場合があります。
出力ファイルの各要素の修正時間を正しく設定するために適切な処理を実行することは、unpacker 実装に依存します。
SEGMENT_LIMIT
、定数フィールド値static final String PASS_FILE_PFX
システムファイルセパレータが JAR ファイルセパレータ「/」に置き換えられる点を除き、パス名の変換は行われません。
ファイル名は、JAR ファイル内の文字列と完全に一致していなければなりません。
プロパティー値がディレクトリ名の場合、そのディレクトリ内のすべてのファイルも渡されます。
例
Map p = packer.properties();
p.put(PASS_FILE_PFX+0, "mutants/Rogue.class");
p.put(PASS_FILE_PFX+1, "mutants/Wolverine.class");
p.put(PASS_FILE_PFX+2, "mutants/Storm.class");
# Pass all files in an entire directory hierarchy:
p.put(PASS_FILE_PFX+3, "police/");
.static final String UNKNOWN_ATTRIBUTE
ERROR
、STRIP
、および PASS
です。
文字列 ERROR
は、タイプ IOException
の例外で、パック操作が全体として失敗したことを意味します。文字列 STRIP
は、属性が削除されることを意味します。文字列 PASS
は、クラスファイル全体が (リソースファイルのように) 圧縮なしで渡され、適切な警告が示されることを意味します。これが、このプロパティーのデフォルト値です。
例
Map p = pack200.getProperties();
p.put(UNKNOWN_ATTRIBUTE, ERROR);
p.put(UNKNOWN_ATTRIBUTE, STRIP);
p.put(UNKNOWN_ATTRIBUTE, PASS);
static final String CLASS_ATTRIBUTE_PFX
たとえば、pack.class.attribute.SourceFile=RUH
には、このオプションの効果が組み込まれています。
特殊な文字列 ERROR
、STRIP
、および PASS
も、UNKNOWN_ATTRIBUTE
と同じ意味を持つものとして許可されています。ユーザーは、これを使用することで、特定の属性を (クラス圧縮なしで) ビット単位で拒否したり、取り除いたり、渡したりできます。
次のようなコードを使用して、JCOV 用の属性をサポートできます。
Map p = packer.properties();
p.put(CODE_ATTRIBUTE_PFX+"CoverageTable", "NH[PHHII]");
p.put(CODE_ATTRIBUTE_PFX+"CharacterRangeTable", "NH[PHPOHIIH]");
p.put(CLASS_ATTRIBUTE_PFX+"SourceID", "RUH");
p.put(CLASS_ATTRIBUTE_PFX+"CompilationID", "RUH");
次のようなコードを使用して、デバッグ属性を取り除くことができます。
Map p = packer.properties();
p.put(CODE_ATTRIBUTE_PFX+"LineNumberTable", STRIP);
p.put(CODE_ATTRIBUTE_PFX+"LocalVariableTable", STRIP);
p.put(CLASS_ATTRIBUTE_PFX+"SourceFile", STRIP);
static final String FIELD_ATTRIBUTE_PFX
static final String METHOD_ATTRIBUTE_PFX
static final String CODE_ATTRIBUTE_PFX
static final String PROGRESS
PropertyChangeListener
とともにこのプロパティーを観察するようにしてください。
unpacker は、最低限、パッキング操作の最初に進捗を 0 に、操作の最後に進捗を 100 に設定する必要があります。
static final String KEEP
static final String PASS
static final String STRIP
static final String ERROR
static final String TRUE
static final String FALSE
static final String LATEST
SortedMap<String,String> properties()
プロパティーマップには、定義済みの実装固有のプロパティーやデフォルトのプロパティーを含められます。ユーザーは、既存のプロパティーを変更する前に、情報を確認して意味を十分に理解することが推奨されています。
実装固有のプロパティーには、com. で始まる、実装者に関連付けられたパッケージ名、または類似の接頭辞が付加されます。pack. および unpack. で始まるすべてのプロパティー名は、この API 用に予約されています。
不明なプロパティーは、未指定のエラーとして無視または拒否できます。無効なエントリにより、詳細不明エラーがスローされる場合があります。
返されるマップは、オプションの SortedMap
をすべて実装します。
void pack(JarFile in, OutputStream out) throws IOException
入力を閉じますが、出力は閉じません (Pack200 アーカイブは追加可能)。
in
- JarFileout
- OutputStreamIOException
- エラーが発生した場合。void pack(JarInputStream in, OutputStream out) throws IOException
入力を閉じますが、出力は閉じません (Pack200 アーカイブは追加可能)。
JAR マニフェストファイルおよびそれを含むディレクトリで、修正時間およびデフレーションヒント属性を使用することはできません。
in
- JarInputStreamout
- OutputStreamIOException
- エラーが発生した場合。MODIFICATION_TIME
, DEFLATE_HINT
void addPropertyChangeListener(PropertyChangeListener listener)
listener
- プロパティーの変更時に呼び出されるオブジェクト。properties()
, PROGRESS
void removePropertyChangeListener(PropertyChangeListener listener)
addPropertyChangeListener(java.beans.PropertyChangeListener)
で追加された、PropertyChange イベントのリスナーを削除します。listener
- 削除される PropertyChange リスナー。addPropertyChangeListener(java.beans.PropertyChangeListener)
バグまたは機能を送信
詳細な API リファレンスおよび開発者ドキュメントについては、Java SE のドキュメントを参照してください。そのドキュメントには、概念的な概要、用語の定義、回避方法、有効なコード例などの、開発者を対象にしたより詳細な説明が含まれています。
Copyright © 1993, 2013, Oracle and/or its affiliates. All rights reserved.