public static interface Pack200.Packer
Pack200.newPacker()
.
The high degree of compression is achieved
by using a number of techniques described in the JSR 200 specification.
Some of the techniques are sorting, re-ordering and co-location of the
constant pool.
The pack engine is initialized to an initial state as described
by their properties below.
The initial state can be manipulated by getting the
engine properties (using properties()
) and storing
the modified properties on the map.
The resource files will be passed through with no changes at all.
The class files will not contain identical bytes, since the unpacker
is free to change minor class file features such as constant pool order.
However, the class files will be semantically identical,
as specified in
The Java™ Virtual Machine Specification.
By default, the packer does not change the order of JAR elements. Also, the modification time and deflation hint of each JAR element is passed unchanged. (Any other ZIP-archive information, such as extra attributes giving Unix file permissions, are lost.)
Note that packing and unpacking a JAR will in general alter the bytewise contents of classfiles in the JAR. This means that packing and unpacking will in general invalidate any digital signatures which rely on bytewise images of JAR elements. In order both to sign and to pack a JAR, you must first pack and unpack the JAR to "normalize" it, then compute signatures on the unpacked JAR elements, and finally repack the signed JAR. Both packing steps should use precisely the same options, and the segment limit may also need to be set to "-1", to prevent accidental variation of segment boundaries as class file sizes change slightly.
(Here's why this works: Any reordering the packer does of any classfile structures is idempotent, so the second packing does not change the orderings produced by the first packing. Also, the unpacker is guaranteed by the JSR 200 specification to produce a specific bytewise image for any given transmission ordering of archive elements.)
In order to maintain backward compatibility, the pack file's version is set to accommodate the class files present in the input JAR file. In other words, the pack file version will be the latest, if the class files are the latest and conversely the pack file version will be the oldest if the class file versions are also the oldest. For intermediate class file versions the corresponding pack file version will be used. For example: If the input JAR-files are solely comprised of 1.5 (or lesser) class files, a 1.5 compatible pack file is produced. This will also be the case for archives that have no class files. If the input JAR-files contains a 1.6 class file, then the pack file version will be set to 1.6.
Note: Unless otherwise noted, passing a null argument to a
constructor or method in this class will cause a NullPointerException
to be thrown.
Modifier and Type | Field and Description |
---|---|
static String |
CLASS_ATTRIBUTE_PFX
When concatenated with a class attribute name,
indicates the format of that attribute,
using the layout language specified in the JSR 200 specification.
|
static String |
CODE_ATTRIBUTE_PFX
When concatenated with a code attribute name,
indicates the format of that attribute.
|
static String |
DEFLATE_HINT
|
static String |
EFFORT
If this property is set to a single decimal digit, the packer will
use the indicated amount of effort in compressing the archive.
|
static String |
ERROR
The string "error", a possible value for certain properties.
|
static String |
FALSE
The string "false", a possible value for certain properties.
|
static String |
FIELD_ATTRIBUTE_PFX
When concatenated with a field attribute name,
indicates the format of that attribute.
|
static String |
KEEP
The string "keep", a possible value for certain properties.
|
static String |
KEEP_FILE_ORDER
If this property is set to
TRUE , the packer will transmit
all elements in their original order within the source archive. |
static String |
LATEST
The string "latest", a possible value for certain properties.
|
static String |
METHOD_ATTRIBUTE_PFX
When concatenated with a method attribute name,
indicates the format of that attribute.
|
static String |
MODIFICATION_TIME
If this property is set to the special string
LATEST ,
the packer will attempt to determine the latest modification time,
among all the available entries in the original archive or the latest
modification time of all the available entries in each segment. |
static String |
PASS
The string "pass", a possible value for certain properties.
|
static String |
PASS_FILE_PFX
Indicates that a file should be passed through bytewise, with no
compression.
|
static String |
PROGRESS
The unpacker's progress as a percentage, as periodically
updated by the unpacker.
|
static String |
SEGMENT_LIMIT
This property is a numeral giving the estimated target size N
(in bytes) of each archive segment.
|
static String |
STRIP
The string "strip", a possible value for certain properties.
|
static String |
TRUE
The string "true", a possible value for certain properties.
|
static String |
UNKNOWN_ATTRIBUTE
Indicates the action to take when a class-file containing an unknown
attribute is encountered.
|
Modifier and Type | Method and Description |
---|---|
default void |
addPropertyChangeListener(PropertyChangeListener listener)
Deprecated.
The dependency on
PropertyChangeListener creates
a significant impediment to future modularization of the
Java platform. This method will be removed in a future
release.
Applications that need to monitor progress of the packer
can poll the value of the PROGRESS
property instead. |
void |
pack(JarFile in,
OutputStream out)
Takes a JarFile and converts it into a Pack200 archive.
|
void |
pack(JarInputStream in,
OutputStream out)
Takes a JarInputStream and converts it into a Pack200 archive.
|
SortedMap<String,String> |
properties()
Get the set of this engine's properties.
|
default void |
removePropertyChangeListener(PropertyChangeListener listener)
Deprecated.
The dependency on
PropertyChangeListener creates
a significant impediment to future modularization of the
Java platform. This method will be removed in a future
release. |
static final String SEGMENT_LIMIT
As a special case, a value of -1 will produce a single large segment with all input files, while a value of 0 will produce one segment for each class. Larger archive segments result in less fragmentation and better compression, but processing them requires more memory.
The size of each segment is estimated by counting the size of each input file to be transmitted in the segment, along with the size of its name and other transmitted properties.
The default is -1, which means the packer will always create a single segment output file. In cases where extremely large output files are generated, users are strongly encouraged to use segmenting or break up the input file into smaller JARs.
A 10Mb JAR packed without this limit will typically pack about 10% smaller, but the packer may require a larger Java heap (about ten times the segment limit).
static final String KEEP_FILE_ORDER
TRUE
, the packer will transmit
all elements in their original order within the source archive.
If it is set to FALSE
, the packer may reorder elements,
and also remove JAR directory entries, which carry no useful
information for Java applications.
(Typically this enables better compression.)
The default is TRUE
, which preserves the input information,
but may cause the transmitted archive to be larger than necessary.
static final String EFFORT
The special value 0 instructs the packer to copy through the original JAR file directly, with no compression. The JSR 200 standard requires any unpacker to understand this special case as a pass-through of the entire archive.
The default is 5, investing a modest amount of time to produce reasonable compression.
static final String DEFLATE_HINT
TRUE
or FALSE
, the packer
will set the deflation hint accordingly in the output archive, and
will not transmit the individual deflation hints of archive elements.
If this property is set to the special string KEEP
, the packer
will attempt to determine an independent deflation hint for each
available element of the input archive, and transmit this hint separately.
The default is KEEP
, which preserves the input information,
but may cause the transmitted archive to be larger than necessary.
It is up to the unpacker implementation to take action upon the hint to suitably compress the elements of the resulting unpacked jar.
The deflation hint of a ZIP or JAR element indicates whether the element was deflated or stored directly.
static final String MODIFICATION_TIME
LATEST
,
the packer will attempt to determine the latest modification time,
among all the available entries in the original archive or the latest
modification time of all the available entries in each segment.
This single value will be transmitted as part of the segment and applied
to all the entries in each segment, SEGMENT_LIMIT
.
This can marginally decrease the transmitted size of the archive, at the expense of setting all installed files to a single date.
If this property is set to the special string KEEP
,
the packer transmits a separate modification time for each input
element.
The default is KEEP
, which preserves the input information,
but may cause the transmitted archive to be larger than necessary.
It is up to the unpacker implementation to take action to suitably set the modification time of each element of its output file.
SEGMENT_LIMIT
,
Constant Field Valuesstatic final String PASS_FILE_PFX
There is no pathname transformation, except that the system file separator is replaced by the JAR file separator '/'.
The resulting file names must match exactly as strings with their occurrences in the JAR file.
If a property value is a directory name, all files under that directory will be passed also.
Examples:
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
, and PASS
.
The string ERROR
means that the pack operation
as a whole will fail, with an exception of type IOException
.
The string
STRIP
means that the attribute will be dropped.
The string
PASS
means that the whole class-file will be passed through
(as if it were a resource file) without compression, with a suitable warning.
This is the default value for this property.
Examples:
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
For example, the effect of this option is built in:
pack.class.attribute.SourceFile=RUH
.
The special strings ERROR
, STRIP
, and PASS
are
also allowed, with the same meaning as UNKNOWN_ATTRIBUTE
.
This provides a way for users to request that specific attributes be
refused, stripped, or passed bitwise (with no class compression).
Code like this might be used to support attributes for 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");
Code like this might be used to strip debugging attributes:
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
pack.field.attribute.Deprecated=
.
The special strings ERROR
, STRIP
, and
PASS
are also allowed.CLASS_ATTRIBUTE_PFX
,
Constant Field Valuesstatic final String METHOD_ATTRIBUTE_PFX
pack.method.attribute.Exceptions=NH[RCH]
.
The special strings ERROR
, STRIP
, and PASS
are also allowed.CLASS_ATTRIBUTE_PFX
,
Constant Field Valuesstatic final String CODE_ATTRIBUTE_PFX
pack.code.attribute.LocalVariableTable=NH[PHOHRUHRSHH]
.
The special strings ERROR
, STRIP
, and PASS
are also allowed.CLASS_ATTRIBUTE_PFX
,
Constant Field Valuesstatic final String PROGRESS
At a minimum, the unpacker must set progress to 0 at the beginning of a packing operation, and to 100 at the end.
static final String KEEP
DEFLATE_HINT
,
MODIFICATION_TIME
,
Constant Field Valuesstatic final String PASS
static final String STRIP
static final String ERROR
static final String TRUE
KEEP_FILE_ORDER
,
DEFLATE_HINT
,
Constant Field Valuesstatic final String FALSE
KEEP_FILE_ORDER
,
DEFLATE_HINT
,
Constant Field Valuesstatic final String LATEST
MODIFICATION_TIME
,
Constant Field ValuesSortedMap<String,String> properties()
The property map may contain pre-defined implementation specific and default properties. Users are encouraged to read the information and fully understand the implications, before modifying pre-existing properties.
Implementation specific properties are prefixed with a package name associated with the implementor, beginning with com. or a similar prefix. All property names beginning with pack. and unpack. are reserved for use by this API.
Unknown properties may be ignored or rejected with an unspecified error, and invalid entries may cause an unspecified error to be thrown.
The returned map implements all optional SortedMap
operations
void pack(JarFile in, OutputStream out) throws IOException
Closes its input but not its output. (Pack200 archives are appendable.)
in
- a JarFileout
- an OutputStreamIOException
- if an error is encountered.void pack(JarInputStream in, OutputStream out) throws IOException
Closes its input but not its output. (Pack200 archives are appendable.)
The modification time and deflation hint attributes are not available, for the JAR manifest file and its containing directory.
in
- a JarInputStreamout
- an OutputStreamIOException
- if an error is encountered.MODIFICATION_TIME
,
DEFLATE_HINT
@Deprecated default void addPropertyChangeListener(PropertyChangeListener listener)
PropertyChangeListener
creates
a significant impediment to future modularization of the
Java platform. This method will be removed in a future
release.
Applications that need to monitor progress of the packer
can poll the value of the PROGRESS
property instead.The default implementation of this method does nothing and has no side-effects.
WARNING: This method is omitted from the interface
declaration in all subset Profiles of Java SE that do not include
the java.beans
package.
listener
- An object to be invoked when a property is changed.properties()
,
PROGRESS
@Deprecated default void removePropertyChangeListener(PropertyChangeListener listener)
PropertyChangeListener
creates
a significant impediment to future modularization of the
Java platform. This method will be removed in a future
release.addPropertyChangeListener(java.beans.PropertyChangeListener)
.
The default implementation of this method does nothing and has no side-effects.
WARNING: This method is omitted from the interface
declaration in all subset Profiles of Java SE that do not include
the java.beans
package.
listener
- The PropertyChange listener to be removed.addPropertyChangeListener(java.beans.PropertyChangeListener)
Submit a bug or feature
For further API reference and developer documentation, see Java SE Documentation. That documentation contains more detailed, developer-targeted descriptions, with conceptual overviews, definitions of terms, workarounds, and working code examples.
Copyright © 1993, 2024, Oracle and/or its affiliates. All rights reserved. Use is subject to license terms. Also see the documentation redistribution policy.