JBoss.org Community Documentation
Deployers are the mechanism by which components are brought into a JBoss server. Deployers are also the creators of the majority of UCL instances, and the primary creator is the MainDeployer. The MainDeployer creates the UCL for a deployment early on during its init method. The UCL is created by calling the DeploymentInfo.createClassLoaders() method. Only the topmost DeploymentInfo
will actually create a UCL. All subdeployments will add their class paths to their parent DeploymentInfo
UCL. Every deployment does have a standalone URLClassLoader that uses the deployment URL as its path. This is used to localize the loading of resources such as deployment descriptors. Figure 3.20, “An illustration of the class loaders involved with an EAR deployment” provides an illustration of the interaction between Deployers, DeploymentInfos and class loaders.
The figure illustrates an EAR deployment with EJB and WAR subdeployments. The EJB deployment references the lib/util.jar
utility jar via its manifest. The WAR includes classes in its WEB-INF/classes
directory as well as the WEB-INF/lib/jbosstest-web-util.jar
. Each deployment has a DeploymentInfo
instance that has a URLClassLoader
pointing to the deployment archive. The DeploymentInfo
associated with some.ear
is the only one to have a UCL created. The ejbs.jar
and web.war
DeploymentInfo
s add their deployment archive to the some.ear
UCL classpath, and share this UCL as their deployment UCL. The EJBDeployer
also adds any manifest jars to the EAR UCL.
The WARDeployer
behaves differently than other deployers in that it only adds its WAR archive to the DeploymentInfo
UCL classpath. The loading of classes from the WAR WEB-INF/classes
and WEB-INF/lib
locations is handled by the servlet container class loader. The servlet container class loaders delegate to the WAR DeploymentInfo
UCL as their parent class loader, but the server container class loader is not part of the JBoss class loader repository. Therefore, classes inside of a WAR are not visible to other components. Classes that need to be shared between web application components and other components such as EJBs, and MBeans need to be loaded into the shared class loader repository either by including the classes into a SAR or EJB deployment, or by referencing a jar containing the shared classes through a manifest Class-Path
entry. In the case of a SAR, the SAR classpath element in the service deployment serves the same purpose as a JAR manifest Class-Path
.