public static interface Pack200.Packer
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。
注意:除非另有说明,否则将8846033887354参数传递给此类中的构造函数或方法将导致抛出NullPointerException
。
Modifier and Type | Field and Description |
---|---|
static String |
CLASS_ATTRIBUTE_PFX
当与类属性名称连接时,使用JSR 200规范中指定的布局语言来指示该属性的格式。
|
static String |
CODE_ATTRIBUTE_PFX
当与代码属性名称连接时,表示该属性的格式。
|
static String |
DEFLATE_HINT
|
static String |
EFFORT
如果此属性设置为单个十进制数字,打包程序将使用指定的压缩压缩数据量。
|
static String |
ERROR
字符串“error”是某些属性的可能值。
|
static String |
FALSE
字符串“false”是某些属性的可能值。
|
static String |
FIELD_ATTRIBUTE_PFX
当与字段属性名称连接时,表示该属性的格式。
|
static String |
KEEP
字符串“keep”是某些属性的可能值。
|
static String |
KEEP_FILE_ORDER
如果此属性设置为
TRUE ,则打包程序将以源原始文件中的原始顺序传输所有元素。
|
static String |
LATEST
字符串“最新”,某些属性的可能值。
|
static String |
METHOD_ATTRIBUTE_PFX
当与方法属性名称连接时,表示该属性的格式。
|
static String |
MODIFICATION_TIME
如果此属性设置为特殊字符串
LATEST ,打包程序将尝试确定原始存档中的所有可用条目或每个段中所有可用条目的最新修改时间之间的最新修改时间。
|
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
指示遇到包含未知属性的类文件时要执行的操作。
|
Modifier and Type | Method and Description |
---|---|
default void |
addPropertyChangeListener(PropertyChangeListener listener)
已弃用
对
PropertyChangeListener 的依赖性对未来Java平台的PropertyChangeListener 造成了重大障碍。
此方法将在以后的版本中删除。
需要监控打包机进度的应用程序可以轮询PROGRESS 属性的值。
|
void |
pack(JarFile in, OutputStream out)
使用JarFile并将其转换为Pack200存档。
|
void |
pack(JarInputStream in, OutputStream out)
使用JarInputStream并将其转换为Pack200归档文件。
|
SortedMap<String,String> |
properties()
获取此引擎的属性集。
|
default void |
removePropertyChangeListener(PropertyChangeListener listener)
已弃用
对
PropertyChangeListener 的依赖性对未来Java平台的PropertyChangeListener 造成了重大障碍。
此方法将在以后的版本中删除。
|
static final String SEGMENT_LIMIT
作为特殊情况,值-1将产生一个带有所有输入文件的单个大段,而值0将为每个类生成一个段。 更大的存档段导致较少的碎片和更好的压缩,但是处理它们需要更多的内存。
每个段的大小通过计算要在段中传输的每个输入文件的大小以及其名称和其他传输属性的大小来估计。
默认值为-1,这意味着打包程序将始终创建单个段输出文件。 在生成非常大的输出文件的情况下,强烈建议用户使用分割或将输入文件分解成更小的JAR。
一个没有这个限制的10Mb JAR通常会减小约10%,但是打包程序可能需要一个更大的Java堆(大约是分段限制的十倍)。
static final String KEEP_FILE_ORDER
TRUE
,则打包程序将以源原始文件中的原始顺序传输所有元素。
如果设置为FALSE
,则打包程序可能会重新排序元素,并删除JAR目录条目,这些条目不会为Java应用程序提供有用的信息。 (通常这样可以实现更好的压缩。)
默认值为TRUE
,它保留输入信息,但可能导致传输的归档大于必要。
static final String EFFORT
特殊值0指示打包机直接复制原始JAR文件,而不进行压缩。 JSR 200标准要求任何解包器将这种特殊情况理解为整个存档的传递。
默认为5,投入适量的时间来产生合理的压缩。
static final String DEFLATE_HINT
TRUE
或FALSE
,则打包程序将在输出存档中相应设置通风提示,并且不会传送归档元素的各个通缩提示。
如果此属性设置为特殊字符串KEEP
,则打包程序将尝试为输入存档的每个可用元素确定独立的通关提示,并分别发送此提示。
默认值为KEEP
,它保留输入信息,但可能导致发送的存档大于必要。
解压器实现取决于采取行动,提示适当地压缩所生成的未打包的jar的元素。
ZIP或JAR元素的通缩提示表示元素是否被放气或直接存储。
static final String MODIFICATION_TIME
LATEST
,打包程序将尝试确定最初修改时间,原始存档中的所有可用条目或每个段中所有可用条目的最新修改时间。
该单个值将作为段的一部分传输,并应用于每个段的所有条目SEGMENT_LIMIT
。
这可以大大减少存档的传输大小,而不必将所有安装的文件设置为单个日期。
如果此属性设置为特殊字符串KEEP
,则封隔器会为每个输入元素传输单独的修改时间。
默认值为KEEP
,它保留输入信息,但可能导致传输的归档大于必要。
取消程序实现取决于采取措施,适当地设置其输出文件的每个元素的修改时间。
SEGMENT_LIMIT
,
Constant Field Values
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
至少,打包机必须在打包操作开始时将进度设置为0,最后将其设置为100。
static final String KEEP
static final String PASS
static final String STRIP
static final String ERROR
static final String TRUE
KEEP_FILE_ORDER
,
DEFLATE_HINT
,
Constant Field Values
static final String FALSE
KEEP_FILE_ORDER
,
DEFLATE_HINT
,
Constant Field Values
static final String LATEST
SortedMap<String,String> properties()
属性映射可能包含预定义的实现特定和默认属性。 在修改预先存在的属性之前,鼓励用户阅读信息并充分了解其含义。
实现特定的属性前缀为与实现者相关联的包名称,以com.开头或类似的前缀。 所有以pack.和unpack.开头的财产名称均保留供该API使用。
未知的属性可能会被忽略或被拒绝与未指定的错误,无效条目可能会导致未指定的错误被抛出。
返回的地图实现了所有可选的SortedMap
操作
void pack(JarFile in, OutputStream out) throws IOException
关闭输入,但不输出。 (Pack200档案可追加)
in
- 一个JarFile
out
- 一个OutputStream
IOException
- 如果遇到错误。
void pack(JarInputStream in, OutputStream out) throws IOException
关闭输入,但不输出。 (Pack200档案可追加)
对于JAR清单文件及其包含目录,修改时间和通缩提示属性不可用。
in
- 一个JarInputStream
out
- 一个OutputStream
IOException
- 如果遇到错误。
MODIFICATION_TIME
,
DEFLATE_HINT
@Deprecated default void addPropertyChangeListener(PropertyChangeListener listener)
PropertyChangeListener
的依赖性对未来Java平台的PropertyChangeListener
造成了重大障碍。
此方法将在以后的版本中删除。
需要监控打包机进度的应用程序可以轮询PROGRESS
属性的值。
该方法的默认实现不起作用,没有副作用。
警告:在Java SE的所有子集配置文件中,不包括java.beans
包的接口声明中将省略此方法。
listener
- 属性更改时要调用的对象。
properties()
,
PROGRESS
@Deprecated default void removePropertyChangeListener(PropertyChangeListener listener)
PropertyChangeListener
的依赖性对未来Java平台的PropertyChangeListener
造成了重大障碍。
此方法将在以后的版本中删除。
addPropertyChangeListener(java.beans.PropertyChangeListener)
添加。
该方法的默认实现不起作用,没有副作用。
警告:在Java SE的所有子集配置文件中,不包括java.beans
包的接口声明中将省略此方法。
listener
- 要删除的PropertyChange侦听器。
addPropertyChangeListener(java.beans.PropertyChangeListener)