Module  java.base
软件包  java.util.jar

Interface Pack200.Packer

  • Enclosing class:
    Pack200


    public static interface Pack200.Packer
    打包机引擎对输入的JAR文件进行各种转换,使包流由压缩器(如gzip或zip)高度压缩。 发动机的一个实例可以使用Pack200.newPacker()获得。 通过使用JSR200规范中描述的许多技术来实现高度的压缩。 一些技术是对常量池进行排序,重新排序和共同定位。

    包引擎被初始化为初始状态,如下面的属性所述。 可以通过获取引擎属性(使用properties() )并将修改的属性存储在地图上来处理初始状态。 资源文件将被传递,完全没有变化。 类文件不会包含相同的字节,因为解包程序可以自由地更改次要的类文件功能,如常量池顺序。 但是,类文件将在语义上相同,如The Java™ Virtual Machine Specification中所述

    默认情况下,打包程序不会更改JAR元素的顺序。 此外,每个JAR元素的修改时间和通缩提示不变。 (任何其他ZIP档案信息,如授予Unix文件权限的额外属性都将丢失。)

    请注意,打包和解包JAR通常会改变JAR中类文件的副本内容。 这意味着打包和拆包通常会使依赖于JAR元素的副图像的任何数字签名无效。 为了签名和打包JAR,您必须首先打包和解压缩JAR以“归一化”它,然后在未打包的JAR元素上计算签名,最后重新打包已签名的JAR。 两个包装步骤都应该使用完全相同的选项,并且片段限制也可能需要设置为“-1”,以防止分段边界的意外变化,因为类文件大小稍有变化。

    (这就是为什么这样工作:任何重新排序任何类文件结构的打包程序都是幂等的,所以第二个打包不会改变第一个打包生成的顺序。而且,解包器由JSR 200规范保证,以产生一个特定的旁边图像对于归档元素的任何给定的传输顺序)

    为了保持向后兼容性,包文件的版本被设置为适应输入JAR文件中存在的类文件。 换句话说,包文件版本将是最新的,如果类文件是最新的,相反,如果类文件版本也是最旧的,则包文件版本将是最旧的。 对于中间类文件版本,将使用相应的包文件版本。 例如:如果输入的JAR文件仅由1.5(或更小)的类文件构成,则会生成1.5兼容的包文件。 对于没有类文件的档案也是如此。 如果输入的JAR文件包含1.6类文件,则包文件版本将设置为1.6。

    注意:除非另有说明,否则null参数传递给null中的构造函数或方法将导致抛出NullPointerException

    从以下版本开始:
    1.5
    • 字段详细信息

      • SEGMENT_LIMIT

        static final String SEGMENT_LIMIT
        该属性是给出每个归档段的估计目标大小N(以字节为单位)的数字。 如果单个输入文件需要多于N个字节,则它将被赋予其自己的归档段。

        作为特殊情况,值-1将产生一个带有所有输入文件的单个大段,而值0将为每个类生成一个段。 更大的存档段导致较少的碎片和更好的压缩,但是处理它们需要更多的内存。

        每个段的大小通过计算要在段中传输的每个输入文件的大小以及其名称和其他传输属性的大小来估计。

        默认值为-1,这意味着打包程序将始终创建单个段输出文件。 在生成非常大的输出文件的情况下,强烈建议用户使用分割或将输入文件分解成更小的JAR。

        一个没有这个限制的10Mb JAR通常会减小约10%,但是打包程序可能需要一个较大的Java堆(大约是分段限制的十倍)。

        另请参见:
        Constant Field Values
      • KEEP_FILE_ORDER

        static final String KEEP_FILE_ORDER
        如果此属性设置为TRUE ,则打包程序将以源原始文件中的原始顺序传输所有元素。

        如果设置为FALSE ,则打包程序可能会重新排序元素,并删除JAR目录条目,这些条目不会为Java应用程序提供有用的信息。 (通常这样可以实现更好的压缩。)

        默认值为TRUE ,它保留输入信息,但可能导致传送的归档大于必要。

        另请参见:
        Constant Field Values
      • EFFORT

        static final String EFFORT
        如果此属性设置为单个十进制数字,打包程序将使用指定的压缩压缩数据量。 1级可能产生更大的尺寸和更快的压缩速度,而9级将需要更长的时间,但可能产生更好的压缩。

        特殊值0指示打包机直接复制原始JAR文件,而不进行压缩。 JSR 200标准要求任何解包器将这种特殊情况理解为整个存档的传递。

        默认为5,投入适量的时间来产生合理的压缩。

        另请参见:
        Constant Field Values
      • DEFLATE_HINT

        static final String DEFLATE_HINT
        如果此属性设置为TRUEFALSE ,则打包程序将在输出存档中相应设置通配提示,并且不会传送归档元素的各个通缩提示。

        如果此属性设置为特殊字符串KEEP ,则打包程序将尝试为输入存档的每个可用元素确定独立的通关提示,并分别发送此提示。

        默认值为KEEP ,它保留输入信息,但可能导致发送的归档大于必要。

        解压器实现取决于采取行动,提示适当地压缩所生成的未打包的jar的元素。

        ZIP或JAR元素的通缩提示表示元素是否被放气或直接存储。

        另请参见:
        Constant Field Values
      • MODIFICATION_TIME

        static final String MODIFICATION_TIME
        如果此属性设置为特殊字符串LATEST打包程序将尝试确定最初修改时间,原始存档中的所有可用条目或每个段中所有可用条目的最新修改时间。 该单个值将作为段的一部分传输,并应用于每个段的所有条目, SEGMENT_LIMIT

        这可以大大减少存档的传输大小,而不必将所有安装的文件设置为单个日期。

        如果将此属性设置为特殊字符串KEEP ,则打包器会为每个输入元素发送单独的修改时间。

        默认值为KEEP ,它保留输入信息,但可能导致传输的归档大于必要。

        取消程序实现取决于采取措施,适当地设置其输出文件的每个元素的修改时间。

        另请参见:
        SEGMENT_LIMITConstant Field Values
      • 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/");  
        另请参见:
        Constant Field Values
      • 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);  
        另请参见:
        Constant Field Values
      • 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);  
        另请参见:
        Constant Field Values
      • FIELD_ATTRIBUTE_PFX

        static final String FIELD_ATTRIBUTE_PFX
        当与字段属性名称连接时,表示该属性的格式。 例如,此选项的效果内置于: pack.field.attribute.Deprecated= 特殊字符串ERRORSTRIP ,并PASS也是允许的。
        另请参见:
        CLASS_ATTRIBUTE_PFXConstant Field Values
      • METHOD_ATTRIBUTE_PFX

        static final String METHOD_ATTRIBUTE_PFX
        当与方法属性名称连接时,表示该属性的格式。 例如,此选项的效果内置于: pack.method.attribute.Exceptions=NH[RCH] 特殊字符串ERRORSTRIP ,并PASS也是允许的。
        另请参见:
        CLASS_ATTRIBUTE_PFXConstant Field Values
      • CODE_ATTRIBUTE_PFX

        static final String CODE_ATTRIBUTE_PFX
        当与代码属性名称连接时,表示该属性的格式。 例如,此选项的效果内置于: pack.code.attribute.LocalVariableTable=NH[PHOHRUHRSHH] 特殊字符串ERRORSTRIP ,并PASS也是允许的。
        另请参见:
        CLASS_ATTRIBUTE_PFXConstant Field Values
      • PROGRESS

        static final String PROGRESS
        封隔器的进度为百分比,由封隔器定期更新。 0到100的值是正常值,-1表示失速。 可以通过轮询此属性的值来监视进度。

        至少打包机必须在打包操作开始时将进度设置为0,最后将其设置为100。

        另请参见:
        Constant Field Values
    • 方法详细信息

      • properties

        SortedMap<String,String> properties​()
        获取此引擎的属性集。 该集合是一个“实时视图”,因此更改其内容立即影响打包机引擎,并且引擎中的更改(如进度指示)将立即在映射中显示。

        属性映射可能包含预定义的实现特定和默认属性。 在修改预先存在的属性之前,鼓励用户阅读信息并充分了解其含义。

        实现特定的属性前缀为与实现者相关联的包名称,以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_TIMEDEFLATE_HINT