JBoss部署器和ClassLoaders

本文详细介绍了JBoss服务器中的部署器机制,特别是MainDeployer如何创建UCL,并解释了不同类型的部署组件(如EAR、EJB和WAR)如何管理各自的类加载器。此外,还探讨了如何在不同组件间实现类的共享。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

 部署器(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具有相同的效果和目的。

16:51:33,561 ERROR [URLDeploymentScanner] Incomplete Deployment listing: --- Incompletely deployed packages --- org.jboss.deployment.DeploymentInfo@ebb24ee4 { url=file:/opt/jboss-4.2.2.GA/server/default/deploy/acs.ear } deployer: org.jboss.deployment.EARDeployer@225b1b status: Deployment FAILED reason: URL file:/opt/jboss-4.2.2.GA/server/default/tmp/deploy/tmp3003181215135402123acs.ear-contents/acs-war-exp.war/ deployment failed state: FAILED watch: file:/opt/jboss-4.2.2.GA/server/default/deploy/acs.ear altDD: null lastDeployed: 1742892691824 lastModified: 1742892691617 mbeans: --- MBeans waiting for other MBeans --- ObjectName: jboss.j2ee:service=EjbModule,module=acs-ejb.jar State: FAILED Reason: org.jboss.deployment.DeploymentException: Error while fixing table name; - nested throwable: (org.jboss.util.NestedSQLException: Could not create connection; - nested throwable: (org.jboss.resource.JBossResourceException: Failed to register driver for: com.mysql.jdbc.Driver; - nested throwable: (java.lang.ClassNotFoundException: No ClassLoaders found for: com.mysql.jdbc.Driver)); - nested throwable: (org.jboss.resource.JBossResourceException: Could not create connection; - nested throwable: (org.jboss.resource.JBossResourceException: Failed to register driver for: com.mysql.jdbc.Driver; - nested throwable: (java.lang.ClassNotFoundException: No ClassLoaders found for: com.mysql.jdbc.Driver)))) ObjectName: jboss.web.deployment:war=acs-war.war,id=225351972 State: FAILED Reason: org.jboss.deployment.DeploymentException: URL file:/opt/jboss-4.2.2.GA/server/default/tmp/deploy/tmp3003181215135402123acs.ear-contents/acs-war-exp.war/ deployment failed --- MBEANS THAT ARE THE ROOT CAUSE OF THE PROBLEM --- ObjectName: jboss.j2ee:service=EjbModule,module=acs-ejb.jar State: FAILED Reason: org.jboss.deployment.DeploymentException: Error while fixing table name; - nested throwable: (org.jboss.util.NestedSQLException: Could not create connection; - nested t
最新发布
03-26
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值