The JarFile class is used to read the contents of a jar file
from any file that can be opened with java.io.RandomAccessFile.
It extends the class java.util.zip.ZipFile with support
for reading an optional Manifest entry, and support for
processing multi-release jar files. The Manifest can be used
to specify meta-information about the jar file and its entries.
A multi-release jar file is a jar file that
contains a manifest with a main attribute named "Multi-Release",
a set of "base" entries, some of which are public classes with public
or protected methods that comprise the public interface of the jar file,
and a set of "versioned" entries contained in subdirectories of the
"META-INF/versions" directory. The versioned entries are partitioned by the
major version of the Java platform. A versioned entry, with a version
n, 8 < n, in the "META-INF/versions/{n}" directory overrides
the base entry as well as any entry with a version number i where
8 < i < n.
By default, a JarFile for a multi-release jar file is configured
to process the multi-release jar file as if it were a plain (unversioned) jar
file, and as such an entry name is associated with at most one base entry.
The JarFile may be configured to process a multi-release jar file by
creating the JarFile with the
JarFile.JarFile(File, boolean, int, Runtime.Version) constructor. The
Runtime.Version object sets a maximum version used when searching for
versioned entries. When so configured, an entry name
can correspond with at most one base entry and zero or more versioned
entries. A search is required to associate the entry name with the latest
versioned entry whose version is less than or equal to the maximum version
(see getEntry(String)).
Class loaders that utilize JarFile to load classes from the
contents of JarFile entries should construct the JarFile
by invoking the JarFile.JarFile(File, boolean, int, Runtime.Version)
constructor with the value Runtime.version() assigned to the last
argument. This assures that classes compatible with the major
version of the running JVM are loaded from multi-release jar files.
If the verify flag is on when opening a signed jar file, the content of
the file is verified against its signature embedded inside the file. Please
note that the verification process does not include validating the signer's
certificate. A caller should inspect the return value of
JarEntry.getCodeSigners() to further determine if the signature
can be trusted.
Unless otherwise noted, passing a null argument to a constructor
or method in this class will cause a NullPointerException to be
thrown.
extends
Manifest, java.util.zip.ZipFile, java.util.jar.JarEntry
@implNote
JarFile (e.g. to override
the configuration of a compiled application or library), two System
properties are available.
jdk.util.jar.version can be assigned a value that is the
String representation of a non-negative integer
<= Runtime.version().feature(). The value is used to set the effective
runtime version to something other than the default value obtained by
evaluating Runtime.version().feature(). The effective runtime version
is the version that the JarFile.JarFile(File, boolean, int, Runtime.Version)
constructor uses when the value of the last argument is
JarFile.runtimeVersion().
jdk.util.jar.enableMultiRelease can be assigned one of the three
String values true, false, or force. The
value true, the default value, enables multi-release jar file
processing. The value false disables multi-release jar processing,
ignoring the "Multi-Release" manifest attribute, and the versioned
directories in a multi-release jar file if they exist. Furthermore,
the method JarFile.isMultiRelease() returns false. The value
force causes the JarFile to be initialized to runtime
versioning after construction. It effectively does the same as this code:
(new JarFile(File, boolean, int, JarFile.runtimeVersion()).