JBoss部署器和ClassLoaders

来源:互联网 发布:公共服务质量数据规范 编辑:程序博客网 时间:2024/05/01 12:56

 部署器(Deployers)是一种将组件整合进JBoss服务器的一种机制,部署器同时也是大多数的UCL实例的创建者,MainDeployer是主要的创建者。MainDeployer通过init方法在部署的初期创建UCL。UCL是通过调用DeploymentInfo.createClassLoaders()方法来创建的。只有最高层的DeploymentInfo(每一种部署组件都有对应的DeploymentInfo)才进行实际的UCL创建工作。其他的子部署(subdeployments)将设置他们的classpath到父DeploymentInfo创建的UCL中。每个部署都有一个独立的URLClassLoader,并且该部署将自身的部署url作为classpath的一部分添加到这个ClassLoader中,这主要是用作载入本地资源如部署描述符等信息。下图提供了一个图例说明了Deployers,DeploymentInfos,Classloaders的交互过程。

这个图说明了一个包含EJB及WAR子部署的EAR部署过程。EJB的部署通过引用了lib/util.jar工具包。WAR在它的WEB-INF/classes包含了java类,在它的WEB-INF/lib/目录里包含了jbosstest-web-util.jar包。每一个部署都有它们自己的DeploymentInfo实例,并且有一个URLClassLoader指它他们的部署包。和some.ear关联的DeploymentInfo仅有一个UCL被创建。ejbs.jar和web.warDeploymentInfos将添加它们的部署包到some.earUCL的classpath中。并且共享这个UCL作为它们的部署UCL。EJBDeployer同时也会添加在manifestf里引用的jar到EAR的UCL中。

WARDeployer的行为和别的部署器有些不同,它仅仅添加了它的WAR包到它的DeploymentInfoUCL的classpath中。WAR包里的WEB-INF/classes和WEB-INF/lib目录将由Server容器的ClassLoader来载入。servlet容器的class loader将WAR包的DeploymentInfoUCL作为它的父ClassLoader,并进行委派,但是servlet容器的class loader并不是boss class loaderrepository的一部份。因此,在WAR包里的类对于别的组件将是不可见的。如果需要将类在各个组件(如EJBs,MBeans)里进行共享,则需要将类载入到共享的class loaderrepository中,而不管这些类是包含在SAR,EJB部署中,还是通过jar包的manifest文件里的Class-Path条目进行引用的共享类。在SAR的情况下,在服务部署描述里的classpath元素和jar的manifest Class-Path具有相同的效果和目的。