JBoss部署器和ClassLoaders

 部署器(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.war DeploymentInfos将添加它们的部署包到some.ear UCL的classpath中。并且共享这个UCL作为它们的部署UCL。EJBDeployer同时也会添加在manifestf里引用的jar到 EAR的UCL中。

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值