モジュール java.base
パッケージ java.util.jar

インタフェースPack200.Packer

  • 含まれているクラス:
    Pack200


    public static interface Pack200.Packer
    packerエンジンは、さまざまな変換を入力JARファイルに適用して、パック・ストリームをgzipやzipなどのコンプレッサを使用して大幅に圧縮可能にします。 エンジンのインスタンスは、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がスローされます。

    導入されたバージョン:
    1.5
    • フィールドのサマリー

      フィールド 
      修飾子と型 フィールド 説明
      static String CLASS_ATTRIBUTE_PFX
      クラス属性名に連結された場合、JSR 200仕様で指定されたレイアウト言語を使用して、その属性の形式を示します。
      static String CODE_ATTRIBUTE_PFX
      コード属性名と連結して使用された場合、属性の形式を示します。
      static String DEFLATE_HINT
      このプロパティがTRUEまたはFALSEに設定されると、packerは出力アーカイブ内でそれに応じたデフレーション・ヒントを設定し、アーカイブ要素の個別のデフレーション・ヒントを転送しません。
      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
      パッカーは、パーセンテージで示され、定期的にパッカーによって更新されます。
      static String SEGMENT_LIMIT
      このプロパティは、各アーカイブ要素の推定ターゲット・サイズN (単位はバイト)を付与する数値です。
      static String STRIP
      文字列「strip」は、特定のプロパティで使用できます。
      static String TRUE
      文字列「true」は、特定のプロパティで使用できます。
      static String UNKNOWN_ATTRIBUTE
      不明な属性を含むクラス・ファイルに遭遇したときに実行するアクションを示します。
    • フィールドの詳細

      • SEGMENT_LIMIT

        static final String SEGMENT_LIMIT
        このプロパティは、各アーカイブ要素の推定ターゲット・サイズN (単位はバイト)を付与する数値です。 Nバイト以上を必要とする単一の入力ファイルには、独立したアーカイブ・セグメントが割り当てられます。

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

        各セグメントのサイズは、セグメント内で転送される入力ファイルのサイズと、このファイルの名前のサイズ、およびその他の転送プロパティによって予測されます。

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

        通常、この制限なしでパックされた10MバイトのJARは約10%余計に小さくなりますが、packerにはより多くのJavaヒープ(セグメント制限の約10倍)が必要になります。

        関連項目:
        定数フィールド値
      • KEEP_FILE_ORDER

        static final String KEEP_FILE_ORDER
        このプロパティがTRUEに設定されると、packerはソース・アーカイブ内のすべての要素を元の順序で転送します。

        これがFALSEに設定されると、packerは要素を再度順序付けし、Javaアプリケーションに関する有用な情報を含まないJARディレクトリ・エントリも削除します。 (通常は、これにより圧縮率が向上する)。

        デフォルトはTRUEです。これにより、入力情報は保存されますが、転送するアーカイブのサイズが必要以上に大きくなる場合があります。

        関連項目:
        定数フィールド値
      • EFFORT

        static final String EFFORT
        このプロパティが1桁の10進数に設定されると、packerは指定された量の労力をアーカイブの圧縮に費やします。 レベル1の場合、圧縮速度は速くても圧縮率はそれほど高くありません。レベル9の場合、圧縮速度は遅くても圧縮率は高くなります。

        特殊な値0を指定すると、packerは元のJARファイルを圧縮せずに直接コピーします。 JSR 200標準では、すべてのアンパック・ツールはこの特殊な処理をアーカイブ全体のパススルーとして理解する必要があります。

        デフォルト値は5です。この場合、標準的な時間で、適度な圧縮が行われます。

        関連項目:
        定数フィールド値
      • DEFLATE_HINT

        static final String DEFLATE_HINT
        このプロパティがTRUEまたはFALSEに設定されると、packerは出力アーカイブ内でそれに応じたデフレーション・ヒントを設定し、アーカイブ要素の個別のデフレーション・ヒントを転送しません。

        このプロパティが特殊な文字列KEEPに設定されると、packerは入力アーカイブ内の利用可能な要素ごとに独立したデフレーション・ヒントを決定し、ヒントを別個に転送しようと試みます。

        デフォルトはKEEPです。これにより、入力情報は保存されますが、転送するアーカイブのサイズが必要以上に大きくなる場合があります。

        展開するjarの要素を正しく圧縮するためにヒントを適切に処理することは、unpacker実装に依存します。

        ZIPまたはJAR要素のデフレーション・ヒントは、要素が圧縮されたか、そのまま格納されたかを示します。

        関連項目:
        定数フィールド値
      • MODIFICATION_TIME

        static final String MODIFICATION_TIME
        このプロパティが特殊な文字列LATESTに設定されると、packerは、元のアーカイブ内の利用可能な全エントリ内で最新の修正時間、または各セグメント内の利用可能な全エントリの最新の修正時間の決定を試みます。 この単一の値はセグメントの一部として転送され、各セグメントSEGMENT_LIMITの全エントリに適用されます。

        これにより、インストールされたファイルすべてが単一の日付に設定される代わりに、転送するアーカイブのサイズをわずかに減少させることができます。

        このプロパティを特殊な文字列KEEPに設定すると、packerは入力要素ごとに別個の修正時間を転送します。

        デフォルトはKEEPです。これにより、入力情報は保存されますが、転送するアーカイブのサイズが必要以上に大きくなる場合があります。

        出力ファイルの各要素の修正時間を正しく設定するために適切な処理を実行することは、unpacker実装に依存します。

        関連項目:
        SEGMENT_LIMIT定数フィールド値
      • PASS_FILE_PFX

        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/");
         
        関連項目:
        定数フィールド値
      • UNKNOWN_ATTRIBUTE

        static final String UNKNOWN_ATTRIBUTE
        不明な属性を含むクラス・ファイルに遭遇したときに実行するアクションを示します。 利用可能な値は、文字列ERRORSTRIP、およびPASSです。

        文字列ERRORは、タイプIOExceptionの例外で、パック操作が全体として失敗したことを意味します。 文字列STRIPは、属性が削除されることを意味します。 文字列PASSは、クラス・ファイル全体が(リソース・ファイルのように)圧縮なしで渡され、適切な警告が示されることを意味します。 これが、このプロパティのデフォルト値です。

        
             Map p = pack200.getProperties();
             p.put(UNKNOWN_ATTRIBUTE, ERROR);
             p.put(UNKNOWN_ATTRIBUTE, STRIP);
             p.put(UNKNOWN_ATTRIBUTE, PASS);
         
        関連項目:
        定数フィールド値
      • CLASS_ATTRIBUTE_PFX

        static final String CLASS_ATTRIBUTE_PFX
        クラス属性名に連結された場合、JSR 200仕様で指定されたレイアウト言語を使用して、その属性の形式を示します。

        たとえば、pack.class.attribute.SourceFile=RUHには、このオプションの効果が組み込まれています。

        特殊な文字列ERRORSTRIP、および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);
         
        関連項目:
        定数フィールド値
      • FIELD_ATTRIBUTE_PFX

        static final String FIELD_ATTRIBUTE_PFX
        フィールド属性名と連結して使用された場合、属性の形式を示します。 たとえば、pack.field.attribute.Deprecated=には、このオプションの効果が組み込まれています。 特殊な文字列ERRORSTRIP、およびPASSも使用できます。
        関連項目:
        CLASS_ATTRIBUTE_PFX定数フィールド値
      • METHOD_ATTRIBUTE_PFX

        static final String METHOD_ATTRIBUTE_PFX
        メソッド属性名と連結して使用された場合、属性の形式を示します。 たとえば、pack.method.attribute.Exceptions=NH[RCH]には、このオプションの効果が組み込まれています。 特殊な文字列ERRORSTRIP、およびPASSも使用できます。
        関連項目:
        CLASS_ATTRIBUTE_PFX定数フィールド値
      • CODE_ATTRIBUTE_PFX

        static final String CODE_ATTRIBUTE_PFX
        コード属性名と連結して使用された場合、属性の形式を示します。 たとえば、pack.code.attribute.LocalVariableTable=NH[PHOHRUHRSHH]には、このオプションの効果が組み込まれています。 特殊な文字列ERRORSTRIP、およびPASSも使用できます。
        関連項目:
        CLASS_ATTRIBUTE_PFX定数フィールド値
      • PROGRESS

        static final String PROGRESS
        パッカーは、パーセンテージで示され、定期的にパッカーによって更新されます。 値0 - 100は正常、-1は停滞を示します。 進捗は、このプロパティの値をポーリングしてモニターできます。

        パッカーは、最低でもパッキング操作の開始時に0に、最後に100に進捗を設定する必要があります。

        関連項目:
        定数フィールド値
    • メソッドの詳細

      • properties

        SortedMap<String,String> properties​()
        このエンジンのプロパティ・セットを取得します。 このセットは「ライブ・ビュー」であるため、内容を変更するとただちにPackerエンジンがその影響を受けます。また、エンジンから行われた変更(進捗の表示など)は、ただちにマップで確認できます。

        プロパティ・マップには、定義済みの実装固有のプロパティやデフォルトのプロパティを含められます。 ユーザーは、既存のプロパティを変更する前に、情報を確認して意味を十分に理解することが推奨されています。

        実装固有のプロパティには、com.で始まる、実装者に関連付けられたパッケージ名、または類似の接頭辞が付加されます。 pack.およびunpack.で始まるすべてのプロパティ名は、このAPI用に予約されています。

        不明なプロパティは、未指定のエラーとして無視または拒否できます。無効なエントリにより、詳細不明エラーがスローされる場合があります。

        返されるマップは、オプションのSortedMapをすべて実装します。

        戻り値:
        プロパティ・キー文字列とプロパティ値の、ソートされた関連付け
      • pack

        void pack​(JarFile in,
                  OutputStream out)
           throws IOException
        JarFileを取得して、Pack200アーカイブに変換します。

        入力を閉じますが、出力は閉じません (Pack200アーカイブは追加可能)。

        パラメータ:
        in - JarFile
        out - OutputStream
        例外:
        IOException - エラーが発生した場合。
      • pack

        void pack​(JarInputStream in,
                  OutputStream out)
           throws IOException
        JarInputStreamを取得して、Pack200アーカイブに変換します。

        入力を閉じますが、出力は閉じません (Pack200アーカイブは追加可能)。

        JARマニフェスト・ファイルおよびそれを含むディレクトリで、修正時間およびデフレーション・ヒント属性を使用することはできません。

        パラメータ:
        in - JarInputStream
        out - OutputStream
        例外:
        IOException - エラーが発生した場合。
        関連項目:
        MODIFICATION_TIME, DEFLATE_HINT