public static interface Pack200.Packer
java.util.jar.Pack200.Packer |
打包器引擎对输入的JAR文件应用各种转换,使得压缩包(如gzip或zip)可高度压缩包流。 引擎的一个实例可以使用newPacker()
获得。 高度压缩是通过使用JSR 200规范中描述的多种技术来实现的。 一些技术是对常量池进行排序,重新排序和共同定位。
包装引擎被初始化为初始状态,如其属性所述。 初始状态可以通过获取引擎属性(使用properties()
)并将修改后的属性存储在地图properties()
操纵。 资源文件将完全没有改变地传递。 类文件不会包含相同的字节,因为解包器可以自由更改次要的类文件功能,如常量池顺序。 但是,类文件在语义上将与The Java™ Virtual Machine Specification中指定的相同 。
默认情况下,打包程序不会更改JAR元素的顺序。 此外,每个JAR元素的修改时间和缩小提示都会保持不变。 (任何其他ZIP档案信息,例如提供Unix文件权限的额外属性,都会丢失。)
请注意,打包和解包JAR通常会改变JAR中类文件的字节内容。 这意味着打包和解包通常会使任何依赖于JAR元素的按字节图像的数字签名无效。 为了签署和打包JAR,您必须首先打包并解压缩JAR以“标准化”JAR,然后计算解压缩的JAR元素上的签名,最后重新签名签名的JAR。 两个包装步骤应该使用完全相同的选项,并且段限制也可能需要设置为“-1”,以防止段文件大小轻微变化时,段边界发生意外变化。
(这就是为什么这样做的原因:任何对打包器重新排序的任何类文件结构都是幂等的,所以第二个打包不会改变第一个打包产生的排序。另外,JSR 200规范保证解包器产生特定的按字节图像对于归档元素的任何给定传输顺序)。
为了保持向后兼容性,将包文件的版本设置为适应输入JAR文件中存在的类文件。 换句话说,如果类文件是最新的,则包文件版本将是最新的,相反,如果类文件版本也是最早的,则包文件版本将是最早的。 对于中级文件版本,将使用相应的包文件版本。 例如:如果输入的JAR文件仅包含1.5(或更少)的类文件,则会生成1.5兼容的文件包文件。 没有类文件的档案也是这种情况。 如果输入的JAR文件包含1.6类文件,那么包文件版本将被设置为1.6。
注意:除非另有说明,否则将 null参数传递给 此类中的构造函数或方法将导致引发 NullPointerException
。
Constants |
|
---|---|
String |
CLASS_ATTRIBUTE_PFX 与类属性名称连接时,使用JSR 200规范中指定的布局语言指示该属性的格式。 |
String |
CODE_ATTRIBUTE_PFX 与代码属性名称连接时,表示该属性的格式。 |
String |
DEFLATE_HINT 如果此属性设置为 |
String |
EFFORT 如果此属性设置为单个十进制数字,则打包器将使用指定的精力压缩存档。 |
String |
ERROR 字符串“error”,某些属性的可能值。 |
String |
FALSE 字符串“false”,某些属性的可能值。 |
String |
FIELD_ATTRIBUTE_PFX 与字段属性名称连接时,表示该属性的格式。 |
String |
KEEP 字符串“keep”,某些属性的可能值。 |
String |
KEEP_FILE_ORDER |
String |
LATEST 字符串“latest”,某些属性的可能值。 |
String |
METHOD_ATTRIBUTE_PFX 与方法属性名称连接时,指示该属性的格式。 |
String |
MODIFICATION_TIME 如果此属性设置为特殊字符串 |
String |
PASS 字符串“传递”,某些属性的可能值。 |
String |
PASS_FILE_PFX 指示文件应该按字节传递,不进行压缩。 |
String |
PROGRESS 解包器的进度百分比,由解包器定期更新。 |
String |
SEGMENT_LIMIT 该属性是一个数字,给出每个归档段的估计目标大小N(以字节为单位)。 |
String |
STRIP 字符串“strip”,某些属性的可能值。 |
String |
TRUE 字符串“true”,某些属性的可能值。 |
String |
UNKNOWN_ATTRIBUTE 指示遇到包含未知属性的类文件时要执行的操作。 |
Public methods |
|
---|---|
abstract void |
addPropertyChangeListener(PropertyChangeListener listener) 在属性图上注册PropertyChange事件的侦听器。 |
abstract void |
pack(JarInputStream in, OutputStream out) 接收JarInputStream并将其转换为Pack200存档。 |
abstract void |
pack(JarFile in, OutputStream out) 接收JarFile并将其转换为Pack200存档。 |
abstract SortedMap<String, String> |
properties() 获取该引擎的属性集。 |
abstract void |
removePropertyChangeListener(PropertyChangeListener listener) 移除 |
String CLASS_ATTRIBUTE_PFX
与类属性名称连接时,使用JSR 200规范中指定的布局语言指示该属性的格式。
例如,此选项的效果内置于: 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);
常量值:“pack.class.attribute。”
String CODE_ATTRIBUTE_PFX
与代码属性名称连接时,表示该属性的格式。 例如,此选项的效果内置于: pack.code.attribute.LocalVariableTable=NH[PHOHRUHRSHH]
。 特殊字符串ERROR
, STRIP
,并PASS
也是允许的。
也可以看看:
常量值:“pack.code.attribute。”
String DEFLATE_HINT
如果此属性设置为 TRUE
或 FALSE
,那么 FALSE
将相应地在输出存档中设置 FALSE
提示,并且不会传送存档元素的个别缩小提示。
如果此属性设置为特殊字符串 KEEP
,则 KEEP
器将尝试为输入存档的每个可用元素确定独立的 KEEP
提示,并分别传送此提示。
缺省值是 KEEP
,它保留输入信息,但可能导致发送的归档大于所需值。
取决于解包装的实施,根据提示采取行动以适当压缩最终解包的罐子的元素。
ZIP或JAR元素的通货紧缩提示指示元素是否放气或直接存储。
常量值:“pack.deflate.hint”
String EFFORT
如果此属性设置为单个十进制数字,则打包器将使用指定的精力压缩存档。 级别1可能产生更大的尺寸和更快的压缩速度,而级别9会花费更长的时间,但可能产生更好的压缩。
特殊值0指示打包器直接复制原始JAR文件,不进行压缩。 JSR 200标准要求任何解包器理解这个特殊情况作为整个存档的传递。
默认值是5,投入适量的时间来产生合理的压缩。
常量值:“pack.effort”
String FIELD_ATTRIBUTE_PFX
与字段属性名称连接时,表示该属性的格式。 例如,此选项的效果内置于: pack.field.attribute.Deprecated=
。 特殊字符串ERROR
, STRIP
,并PASS
也是允许的。
也可以看看:
常量值:“pack.field.attribute。”
String KEEP_FILE_ORDER
如果此属性设置为 TRUE
,则 TRUE
将在源存档中以原始顺序传输所有元素。
如果设置为FALSE
,那么FALSE
可能会对元素重新排序,并删除JAR目录项,这些项不包含Java应用程序的有用信息。 (通常这可以实现更好的压缩。)
缺省值是 TRUE
,它保留输入信息,但可能导致发送的归档大于所需值。
常量值:“pack.keep.file.order”
String METHOD_ATTRIBUTE_PFX
与方法属性名称连接时,指示该属性的格式。 例如,此选项的效果内置于: pack.method.attribute.Exceptions=NH[RCH]
。 特殊字符串ERROR
, STRIP
,并PASS
也是允许的。
也可以看看:
常量值:“pack.method.attribute。”
String MODIFICATION_TIME
如果此属性设置为特殊字符串LATEST
, LATEST
器将尝试确定原始归档中所有可用条目中的最新修改时间或每个段中所有可用条目的最新修改时间。 该单个值将作为分段的一部分进行传输,并应用于每个分段SEGMENT_LIMIT
所有条目。
这可以稍微减少存档的传输大小,但将所有安装的文件设置为单一日期。
如果此属性设置为特殊字符串 KEEP
,则 KEEP
器会为每个输入元素发送单独的修改时间。
缺省值为 KEEP
,它保留输入信息,但可能导致传输的归档大于所需值。
取决于解包器的实现,可以采取措施适当地设置其输出文件的每个元素的修改时间。
也可以看看:
常量值:“pack.modification.time”
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/");
.
常量值:“pack.pass.file”。
String PROGRESS
解包器的进度百分比,由解包器定期更新。 0 - 100的值正常,-1表示失速。 使用PropertyChangeListener
观察此属性。
打包机必须至少在包装操作开始时将进度设置为0,最后设置为100。
常量值:“pack.progress”
String SEGMENT_LIMIT
该属性是一个数字,给出每个归档段的估计目标大小N(以字节为单位)。 如果单个输入文件需要多于N个字节,则会给它自己的归档段。
作为一种特殊情况,值为-1会产生一个包含所有输入文件的大型段,而值0会为每个类产生一个段。 较大的归档段导致较少的碎片和较好的压缩,但处理它们需要更多的内存。
每个片段的大小通过计算片段中要传输的每个输入文件的大小以及其名称和其他传输属性的大小来估计。
默认值为-1,这意味着打包器将始终创建单个段输出文件。 在生成极大输出文件的情况下,强烈建议用户使用分段或将输入文件分解为较小的JAR。
没有这个限制的10Mb JAR包装通常会减小约10%,但是打包者可能需要更大的Java堆(约为段限制的十倍)。
常量值:“pack.segment.limit”
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);
常量值:“pack.unknown.attribute”
void addPropertyChangeListener (PropertyChangeListener listener)
在属性图上注册PropertyChange事件的侦听器。 这通常由应用程序用来更新进度栏。
Parameters | |
---|---|
listener |
PropertyChangeListener : An object to be invoked when a property is changed. |
也可以看看:
void pack (JarInputStream in, OutputStream out)
接收JarInputStream并将其转换为Pack200存档。
关闭输入,但不输出。 (Pack200档案是可追加的。)
对于JAR清单文件及其包含的目录,修改时间和通货紧缩提示属性不可用。
Parameters | |
---|---|
in |
JarInputStream : a JarInputStream |
out |
OutputStream : an OutputStream |
Throws | |
---|---|
IOException |
if an error is encountered. |
也可以看看:
void pack (JarFile in, OutputStream out)
接收JarFile并将其转换为Pack200存档。
关闭输入,但不输出。 (Pack200档案是可追加的。)
Parameters | |
---|---|
in |
JarFile : a JarFile |
out |
OutputStream : an OutputStream |
Throws | |
---|---|
IOException |
if an error is encountered. |
SortedMap<String, String> properties ()
获取该引擎的属性集。 该集合是一个“实时视图”,因此更改其内容将立即影响Packer引擎,并且引擎中的更改(例如进度指示)会立即在地图中可见。
属性图可能包含预定义的实现特定属性和默认属性。 鼓励用户在修改预先存在的属性之前阅读信息并充分理解其含义。
特定于实现的属性以与实现者关联的包名作为前缀,以com.或类似的前缀开头。 所有以pack.和unpack.开头的属性名称都保留供此API使用。
未知属性可能会被忽略或拒绝,并且出现未指定的错误,并且无效条目可能会导致未指定的错误被抛出。
返回的地图实现所有可选的 SortedMap
操作
Returns | |
---|---|
SortedMap<String, String> |
A sorted association of property key strings to property values. |
void removePropertyChangeListener (PropertyChangeListener listener)
移除PropertyChange事件的监听器,由 addPropertyChangeListener(PropertyChangeListener)
添加。
Parameters | |
---|---|
listener |
PropertyChangeListener : The PropertyChange listener to be removed. |