type=page
status=published
title=Class Loaders
next=debugging-apps.html
prev=setting-up-dev-env.html
~~~~~~

= Class Loaders

[[GSDVG00003]][[beade]]


[[class-loaders]]
== 2 Class Loaders

Understanding {productName} class loaders can help you
determine where to place supporting JAR and resource files for your
modules and applications.

In a JVM implementation, the class loaders dynamically load a specific
Java class file needed for resolving a dependency. For example, when an
instance of `java.util.Enumeration` needs to be created, one of the
class loaders loads the relevant class into the environment.

The following topics are addressed here:

* link:#beadf[The Class Loader Hierarchy]
* link:#gfqpi[Delegation]
* link:#beadk[Using the Java Optional Package Mechanism]
* link:#beadg[Class Loader Universes]
* link:#gatej[Application-Specific Class Loading]
* link:#beadh[Circumventing Class Loader Isolation]


[NOTE]
====
The Web Profile of the {productName} supports the EJB 3.1 Lite
specification, which allows enterprise beans within web applications,
among other features. The full {productName} supports the entire EJB
3.1 specification. For details, see
http://jcp.org/en/jsr/detail?id=318[JSR 318]
(`http://jcp.org/en/jsr/detail?id=318`).
====


For information about class loader debugging, see
link:debugging-apps.html#gkpdk[Class Loader Debugging].

[[beadf]][[GSDVG00094]][[the-class-loader-hierarchy]]

=== The Class Loader Hierarchy

Class loaders in the {productName} runtime follow a delegation
hierarchy that is illustrated in the following figure and fully
described in link:#fvxzq[Table 2-1].

The following table describes the class loaders in the {productName}.

[[GSDVG531]][[sthref4]][[fvxzq]]


Table 2-1 {productName} Class Loaders

[width="100%",cols="20%,80%",options="header",]
|===
|Class Loader |Description
|Bootstrap |The Bootstrap class loader loads the basic runtime classes
provided by the JVM software.

|Extension |The Extension class loader loads classes from JAR files
present in the system extensions directory, domain-dir``/lib/ext``. It is
parent to the Public API class loader. See link:#beadk[Using the Java
Optional Package Mechanism].

|Public API |The Public API class loader makes available all classes
specifically exported by the {productName} runtime for use by
deployed applications. This includes, but is not limited to, Jakarta EE
APIs and other Oracle APIs. It is parent to the Common class loader.

|Common |The Common class loader loads JAR files in the as-install``/lib``
directory, followed by JAR files in the domain-dir``/lib`` directory.
Using domain-dir``/lib`` is recommended whenever possible, and required
for custom login modules and realms. It is parent to the Connector class
loader. See link:#beadj[Using the Common Class Loader].

|Connector |The Connector class loader is a single class loader instance
that loads individually deployed connector modules, which are shared
across all applications. It is parent to the Applib class loader and the
LifeCycleModule class loader.

|LifeCycleModule |The LifeCycleModule class loader is created once per
lifecycle module. Each lifecycle module's classpath is used to construct
its own class loader. For more information on lifecycle modules, see
link:lifecycle-listeners.html#beamc[Developing Lifecycle Listeners].

|Applib a|
The Applib class loader loads the library classes, specified during
deployment, for a specific enabled module or Jakarta EE application; see
link:#gatej[Application-Specific Class Loading]. One instance of this
class loader is present in each class loader universe; see
link:#beadg[Class Loader Universes]. It is parent to the Archive class loader.

When multiple deployed applications use the same library, they share the
same instance of the library. One library cannot reference classes from
another library.

|Archive |The Archive class loader loads classes from the WAR, EAR, and
JAR files or directories (for directory deployment) of applications or
modules deployed to the {productName}. This class loader also loads
any application-specific classes generated by the {productName}
runtime, such as stub classes or servlets generated by JSP pages.
|===


In previous {productName} versions, the JVM options provided
`classpath-prefix` and `classpath-suffix` attributes that made it
possible to add JAR files or directories either in front of, or after
the application server's system `classpath`. These options are not
present in {productName} 6.0.

The `classpath-prefix` was typically used to substitute another package
for one of the {productName} packages, for example if a newer one was
available. This same result can be achieved on a per-application basis with the
`--libraries` option for the `deploy` subcommand. For more information,
see the link:reference-manual/deploy.html#GSRFM00114[`deploy`(1)] help page.
The Java Optional Package Mechanism does what `classpath-suffix` used to do. For more
information, see link:#beadk[Using the Java Optional Package Mechanism].

[[gfqpi]][[GSDVG00095]][[delegation]]

=== Delegation

Note that the class loader hierarchy is not a Java inheritance
hierarchy, but a delegation hierarchy. In the delegation design, a class
loader delegates class loading to its parent before attempting to load a
class itself. If the parent class loader cannot load a class, the class
loader attempts to load the class itself. In effect, a class loader is
responsible for loading only the classes not available to the parent.
Classes loaded by a class loader higher in the hierarchy cannot refer to
classes available lower in the hierarchy.

The Java Servlet specification recommends that a web module's class
loader look in the local class loader before delegating to its parent.
You can make this class loader follow the delegation inversion model in
the Servlet specification by setting `delegate="false"` in the
`class-loader` element of the `glassfish-web.xml` file. It is safe to do
this only for a web module that does not interact with any other
modules. For details, see "link:application-deployment-guide/dd-elements.html#GSDPG00110[class-loader]" in {productName} Application Deployment Guide.

The default value is `delegate="true"`, which causes a web module's
class loader to delegate in the same manner as the other class loaders.
You must use `delegate="true"` for a web application that accesses EJB
components or that acts as a web service client or endpoint. For details
about `glassfish-web.xml`, see the link:application-deployment-guide.html#GSDPG[{productName} Application Deployment Guide].

For a number of packages, including `java.*` and `javax.*`, symbol
resolution is always delegated to the parent class loader regardless of
the `delegate` setting. This prevents applications from overriding core
Java runtime classes or changing the API versions of specifications that
are part of the Jakarta EE platform.

[[beadk]][[GSDVG00096]][[using-the-java-optional-package-mechanism]]

=== Using the Java Optional Package Mechanism

Optional packages are packages of Java classes and associated native
code that application developers can use to extend the functionality of
the core platform.

To use the Java optional package mechanism, copy the JAR files into the
domain-dir``/lib/ext`` directory, or use the `asadmin add-library` command
with the `--type ext` option, then restart the server. For more
information about the `asadmin add-library` command, see the {productName} Reference Manual.

For more information, see
http://docs.oracle.com/javase/8/docs/technotes/guides/extensions/extensions.html[Optional
Packages - An Overview]
(`http://docs.oracle.com/javase/8/docs/technotes/guides/extensions/extensions.html`)
and
http://download.oracle.com/javase/tutorial/ext/basics/load.html[Understanding
Extension Class Loading]
(`http://docs.oracle.com/javase/tutorial/ext/basics/load.html`).

[[gchif]][[GSDVG00097]][[using-the-endorsed-standards-override-mechanism]]

=== Using the Endorsed Standards Override Mechanism

Endorsed standards handle changes to classes and APIs that are bundled
in the JDK but are subject to change by external bodies.

To use the endorsed standards override mechanism, copy the JAR files
into the domain-dir`/lib/endorsed` directory, then restart the server.

For more information and the list of packages that can be overridden,
see
http://docs.oracle.com/javase/8/docs/technotes/guides/standards/[Endorsed
Standards Override Mechanism]
(`http://docs.oracle.com/javase/8/docs/technotes/guides/standards/`).

[[beadg]][[GSDVG00098]][[class-loader-universes]]

=== Class Loader Universes

Access to components within applications and modules installed on the
server occurs within the context of isolated class loader universes,
each of which has its own Applib and Archive class loaders.

* Application Universe - Each Jakarta EE application has its own class
loader universe, which loads the classes in all the modules in the
application.
* Individually Deployed Module Universe - Each individually deployed EJB
JAR or web WAR has its own class loader universe, which loads the
classes in the module.

A resource such as a file that is accessed by a servlet, JSP, or EJB
component must be in one of the following locations:

* A directory pointed to by the Libraries field or `--libraries` option
used during deployment
* A directory pointed to by the `library-directory` element in the
`application.xml` deployment descriptor
* A directory pointed to by the application or module's classpath; for
example, a web module's classpath includes these directories:
+
[source]
----
module-name/WEB-INF/classes
module-name/WEB-INF/lib
----

[[gatej]][[GSDVG00099]][[application-specific-class-loading]]

=== Application-Specific Class Loading

You can specify module- or application-specific library classes in one
of the following ways:

* Use the Administration Console. Open the Applications component, then
go to the page for the type of application or module. Select the Deploy
button. Type the comma-separated paths in the Libraries field. For
details, click the Help button in the Administration Console.
* Use the `asadmin deploy` command with the `--libraries` option and
specify comma-separated paths. For details, see the
link:reference-manual.html#GSRFM[{productName} Reference Manual].
* Use the `asadmin add-library` command with the `--type app` option,
then restart the server. For details, see the link:reference-manual.html#GSRFM[{productName} Reference Manual].


[NOTE]
====
None of these alternatives apply to application clients. For more
information, see link:java-clients.html#gjpjt[Using Libraries with
Application Clients].
====


You can update a library JAR file using dynamic reloading or by
restarting (disabling and re-enabling) a module or application. To add
or remove library JAR files, you can redeploy the module or application.

Application libraries are included in the Applib class loader. Paths to
libraries can be relative or absolute. A relative path is relative to
domain-dir`/lib/applibs`. If the path is absolute, the path must be
accessible to the domain administration server (DAS). The {productName} automatically synchronizes these libraries to all remote cluster
instances when the cluster is restarted. However, libraries specified by
absolute paths are not guaranteed to be synchronized.


[TIP]
====
You can use application-specific class loading to specify a different
XML parser than the default {productName} XML parser.

You can also use application-specific class loading to access different
versions of a library from different applications.
====


If multiple applications or modules refer to the same libraries, classes
in those libraries are automatically shared. This can reduce the memory
footprint and allow sharing of static information. However, applications
or modules using application-specific libraries are not portable. Other
ways to make libraries available are described in
link:#beadh[Circumventing Class Loader Isolation].

One library cannot reference classes from another library.

For general information about deployment, including dynamic reloading,
see the link:application-deployment-guide.html#GSDPG[{productName} Application
Deployment Guide].


[NOTE]
====
If you see an access control error message when you try to use a
library, you may need to grant permission to the library in the
`server.policy` file. For more information, see
link:securing-apps.html#beabz[Changing Permissions for an Application].
====


[[beadh]][[GSDVG00100]][[circumventing-class-loader-isolation]]

=== Circumventing Class Loader Isolation

Since each application or individually deployed module class loader
universe is isolated, an application or module cannot load classes from
another application or module. This prevents two similarly named classes
in different applications or modules from interfering with each other.

To circumvent this limitation for libraries, utility classes, or
individually deployed modules accessed by more than one application, you
can include the relevant path to the required classes in one of these
ways:

* link:#beadj[Using the Common Class Loader]
* link:#gcrnt[Sharing Libraries Across a Cluster]
* link:#beadl[Packaging the Client JAR for One Application in Another
Application]

[[beadj]][[GSDVG00342]][[using-the-common-class-loader]]

==== Using the Common Class Loader

To use the Common class loader, copy the JAR files into the
domain-dir``/lib`` or as-install``/lib`` directory, or use the
`asadmin add-library` command with the `--type common` option, then
restart the server. For more information about the `asadmin add-library`
command, see the {productName} Reference Manual.

Using the Common class loader makes an application or module accessible
to all applications or modules deployed on servers that share the same
configuration. However, this accessibility does not extend to
application clients. For more information, see
link:java-clients.html#gjpjt[Using Libraries with Application Clients].

For example, using the Common class loader is the recommended way of
adding JDBC drivers to the {productName}. For a list of the JDBC
drivers currently supported by the {productName}, see the
link:release-notes.html#GSRLN[{productName} Release Notes]. For
configurations of supported and other drivers, see
"link:administration-guide/jdbc.html#GSADG00579[Configuration Specifics for JDBC Drivers]" in
{productName} Administration Guide.

To activate custom login modules and realms, place the JAR files in the
domain-dir``/lib`` directory, then restart the server.

[[gcrnt]][[GSDVG00343]][[sharing-libraries-across-a-cluster]]

==== Sharing Libraries Across a Cluster

To share libraries across a specific cluster, copy the JAR files to the
domain-dir``/config/``cluster-config-name``/lib`` directory.

[[beadl]][[GSDVG00344]][[packaging-the-client-jar-for-one-application-in-another-application]]

==== Packaging the Client JAR for One Application in Another Application

By packaging the client JAR for one application in a second application,
you allow an EJB or web component in the second application to call an
EJB component in the first (dependent) application, without making
either of them accessible to any other application or module.

As an alternative for a production environment, you can have the Common
class loader load the client JAR of the dependent application as
described in link:#beadj[Using the Common Class Loader]. Restart the
server to make the dependent application accessible to all applications
or modules deployed on servers that share the same configuration.

[[fvyab]][[GSDVG00048]][[to-package-the-client-jar-for-one-application-in-another-application]]

==== To Package the Client JAR for One Application in Another Application

1. Deploy the dependent application.
2. Add the dependent application's client JAR file to the calling
application.
* For a calling EJB component, add the client JAR file at the same level
as the EJB component. Then add a `Class-Path` entry to the `MANIFEST.MF`
file of the calling EJB component. The `Class-Path` entry has this
syntax:
+
[source]
----
Class-Path: filepath1.jar filepath2.jar ...
----
Each filepath is relative to the directory or JAR file containing the
`MANIFEST.MF` file. For details, see the Jakarta EE specification.
* For a calling web component, add the client JAR file under the
`WEB-INF/lib` directory.
3. If you need to package the client JAR with both the EJB and web
components, set `delegate="true"` in the `class-loader` element of the
`glassfish-web.xml` file.
+
This changes the Web class loader so that it follows the standard class
loader delegation model and delegates to its parent before attempting to
load a class itself.
+
For most applications, packaging the client JAR file with the calling
EJB component is sufficient. You do not need to package the client JAR
file with both the EJB and web components unless the web component is
directly calling the EJB component in the dependent application.
4. Deploy the calling application.
+
The calling EJB or web component must specify in its
`glassfish-ejb-jar.xml` or `glassfish-web.xml` file the JNDI name of the
EJB component in the dependent application. Using an `ejb-link` mapping
does not work when the EJB component being called resides in another
application.
+
You do not need to restart the server.


