Note: Optional packages are the new name for what used to be known as
standard extensions. The "extension mechanism"
is that functionality of the JDK™ and JRE™
that supports the use of optional packages.
This document describes the mechanism provided by the Java™ platform for handling
optional packages. An optional package is a group of packages housed in one or
more JAR files that implement an API
that extends the Java platform. Optional package classes extend the platform in
the sense that the virtual machine can find and load them without their
being on the class path, much as if they were classes in the platform's
core API.
Since optional packages extend the platform's core API, their use should be
judiciously applied. Most commonly they are used for well standardized interfaces
such as those defined by the
Java Community ProcessSM,
although it may also be appropriate for site
wide interfaces. Optional packages are rarely appropriate for interfaces
used by a single, or small set of applications.
Furthermore, since the symbols defined by
installed optional packages
will be visible in all Java processes, care should be taken to ensure that all
visible symbols follow the appropriate "reverse domain name" and "class
hierarchy" conventions. For example, com.mycompany.MyClass.
An implementation of an optional package may consist of code written in the
Java programming language and, less commonly, platform-specific native
code. In addition, it may include properties, localization catalogs, images,
serialized data, and other resources specific to the optional package.
Support for optional packages in browsers such as Internet Explorer and Netscape
Navigator is available through the
Java Plug-in.
A optional package is an implementation of an open, standard
API (examples of optional packages from Sun are JavaServlet,
Java3D, JavaManagement).
Most optional packages are rooted in the javax.* namespace,
although there may be exceptions.
The Extension Mechanism
Architecture
The extension mechanism is designed to contain the following elements:
an optional package or application packaged as a JAR file can declare dependencies
on other JAR files, thus allowing an application to consist of multiple
modules, and,
the class loading mechanism is augmented to search installed optional packages
(and other libraries) for classes, and, if that fails, to search along
an application-specified path for classes.
Applications must therefore, in general, be prepared to specify and
supply the optional packages (and, more generally, libraries) that it needs. The
system will prefer installed copies of optional packages (and libraries) if they
exist; otherwise, it will delegate to the class loader of the application
to find and load the referenced optional package (and library) classes.
This architecture, since it allows applications, applets and servlets
to extend their own class path, also permits packaging and deploying these
as multiple JAR files.
Each optional package or application consists of at least one JAR file containing
an optional manifest, code and assorted resources. As described below,
this primary JAR file can also include additional information in its manifest
to describe dependencies on other JAR files. The jar command
line tool included with the JDK provides a convenient means of
packaging optional packages.
(See the reference pages for the jar tool:
[Microsoft Windows]
[Solaris™ Operating System
(Solaris OS), Linux])
An optional package or application may refer to additional JAR files which
will be referenced from the primary JAR, and these can optionally contain
their own dependency information as well.
Packages comprising optional packages should be named per the standard package
naming conventions when implementing optional packages. These conventions are
outlined in The Java Language Specification, but the requirement
that the domain prefix be specified in all upper case letters has been
removed. For example, the package name com.sun.server is an accepted
alternative to COM.sun.server. Unique package naming is recommended
in order to avoid conflicts, because applications and optional packages may share
the same class loader.
Optional Package Deployment
An optional package may either be bundled with an application or installed in
the JRE for use by all applications. Bundled optional packages are provided at
the same code base as the application and will automatically be downloaded
in the case of network applications (applets). For this reason, bundled
optional packages are often called download optional packages.
When the manifest of a bundled optional package's JAR file contains version
information and the JAR is signed, it can be installed into
the extensions directory of the JRE which
downloads it
(see Deploying Java
Extensions).
Installed optional packages
are loaded when first used and will be shared by all applications using
the same JRE.
When packaging optional packages, the JAR file manifest can be used to identify
vendor and version information (see
Package Version Identification).
Classes for installed optional packages are shared by all code in the
same virtual machine. Thus, installed optional packages are similar to the platform's
core classes (in rt.jar), but with an associated class loader
and a pre-configured security policy as described below.
Classes for bundled optional packages are private to the class loader
of the application, applet or servlet. In the case of network applications
such as applets, these optional packages will be automatically downloaded as needed.
Since class loaders are currently associated with a codebase, this permits
multiple applets originating from the same codebase to share implementations
(JARs).
However, signed bundled optional packages with version information as
described above are installed in the JRE,
and their contents are available to all applications running on that JRE and
are therefore not private.
Bundled Optional Packages
The manifest for an application or optional package can specify one or more relative
URLs referring to the JAR files and directories for the optional packages (and
other libraries) that it needs. These relative URLs will be treated relative
to the code base that the containing application or optional package JAR file
was loaded from.
An application (or, more generally, JAR file) specifies the relative
URLs of the optional packages (and libraries) that it needs via the manifest attribute
Class-Path. This attribute lists the URLs to search for implementations
of optional packages (or other libraries) if they cannot be found as optional packages
installed on the host Java virtual machine*. These relative URLs may include
JAR files and directories for any libraries or resources needed by the
application or optional package. Relative URLs not ending with '/' are assumed
to refer to JAR files. For example,
At most one Class-Path header may be specified in a JAR file's manifest..
Currently, the URLs must be relative to the code base of the
JAR file for security reasons. Thus, remote optional packages will originate from
the same code base as the application.
Each relative URL is resolved against the code base that the containing
application or optional package was loaded from. If the resulting URL is invalid
or refers to a resource that cannot be found then it is ignored.
The resulting URLs are used to extend the class path for the application,
applet, or servlet by inserting the URLs in the class path immediately
following the URL of the containing JAR file. Any duplicate URLs are omitted.
For example, given the following class path:
a.jar b.jar
If optional package b.jar contained the following Class-Path
manifest attribute:
Class-Path: x.jar a.jar
Then the resulting application class path would be the following:
a.jar b.jar x.jar
Of course, if x.jar had dependencies of its own then these would
be added according to the same rules and so on for each subsequent URL.
In the actual implementation, JAR file dependencies are processed lazily
so that the JAR files are not actually opened until needed.
Installed Optional Packages
Beginning with Sun's implementation of the Java 2 Platform, the JAR files
of a installed optional package are placed in a standard local code source:
Here <java-home> refers to the directory where the runtime
software is installed (which is the top-level directory of the JRE or the
jre directory in the JDK).
The locations for installed optional packages can be specified through the
system property java.ext.dirs. This property specifies one or
more directories to search for installed optional packages, each separated by
File.pathSeparatorChar. The default setting for java.ext.dirs
is the standard directory for installed optional packages, as indicated above.
For Java 6 and later, the default is enhanced: it is suffixed with the
path to a platform-specific directory that is shared by all JREs (Java 6 or
later) installed on a system:
An installed optional package may also contain one or more shared libraries
(such as .dll files) and executables.
In what follows, <arch> will be shown
but in practice should be the name of an instruction set architecture,
for example sparc, sparcv9, i386, and amd64.
These can be installed in one of two places.
The first to be searched is:
The second extension directory to be searched applies only to Java 6 and later.
As with Java packages, native libraries can be
installed in directories that will be shared by all Java 6 and later JREs:
An optional package that contains native code cannot be downloaded
by network code into the virtual machine at execution time,
whether such code is trusted or not.
An optional package that contains native code and is
bundled with a network application must be installed in the JDK
or JRE.
By default, installed optional packages in this standard directory are trusted.
That is, they are granted the same privileges as if they were core platform
classes (those in rt.jar). This default privilege is specified
in the system policy file
(in <java-home>/jre/lib/security/java.policy),
but can be overridden for a particular optional package
by adding the appropriate policy file entry
(see Permissions in the JDK).
Note also that if a installed optional package JAR is signed by a trusted entity,
then it will be granted the privileges associated with the trusted signer.
Optional Package Sealing
JAR files and packages can be optionally sealed, so
that an optional package or package can enforce consistency within a version.
A package sealed within a JAR specifies that all classes defined in
that package must originate from the same JAR. Otherwise, a SecurityException
is thrown.
A sealed JAR specifies that all packages defined by that JAR are sealed
unless overridden specifically for a package.
A sealed package is specified via the manifest attribute, Sealed,
whose value is true or false (case irrelevant). For example,
Name: javax/servlet/internal/
Sealed: true
specifies that the javax.servlet.internal package is sealed, and
that all classes in that package must be loaded from the same JAR file.
If this attribute is missing, the package sealing attribute is that
of the containing JAR file.
A sealed JAR is specified via the same manifest header, Sealed,
with the value again of either true or false. For example,
Sealed: true
specifies that all packages in this archive are sealed unless explicitly
overridden for a particular package with the Sealed attribute
in a manifest entry.
If this attribute is missing, the JAR file is assumed to not be
sealed, for backwards compatibility. The system then defaults to examining
package headers for sealing information.
Package sealing is also important for security, because it restricts
access to package-protected members to only those classes defined in the
package that originated from the same JAR file.
Package sealing is checked for installed as well as downloaded optional packages,
and will result in a SecurityException if violated. Also, the
null package is not sealable, so classes that are to be sealed must be
placed in their own packages.
Optional Package Security
The code source for a installed optional package (namely <java-home>/lib/ext)
has a pre-configured security policy associated with it. In Sun's implementation,
the exact level of trust granted to JARs in this directory is specified
by the standard security policy configuration file
<java-home>/lib/security/java.policy
The default policy is for a installed optional package to behave the same way
it would if were part of the core platform. This follows from the common
need for a installed optional package to load native code.
The Java Security Model provides some safety when installed optional package
code is called from untrusted code. However optional package code must be carefully
reviewed for potential security breaches wherever it uses privileged blocks.
A remotely loaded optional package that needs to use access-checked system
services (such as file I/O) to function correctly must either be signed
by a trusted entity or loaded from a trusted source.
Consult the Java security documentation
for further details regarding how to write optional package and application code
to use the security features of the Java Platform.
Related APIs
Several classes in the Java platform support the extension
mechanism, including: