实验一:
环境:jboss-4.2.3GA jdk1.6
应用结构: Jdom.ear
--library
--businessInterface.jar
--operationInterface.jar
--META-INF
--application.xml
--jboss-app.xml
--MANIFEST.MF
--Jdom.web.war
包部署位置:
包名称 | 部署位置 |
UserInterface.jar、Jdom.ejb.jar | JBOSS_HOME/server/default/lib |
Jdom.ear | JBOSS_HOME/sever/default/deploy |
说明:
1、UserManagerMgr、TUser在UserInterface.jar包下。
2、CmtCtrlMgr在library下的operationInterface.jar下。
3、StaticClass在Jdom.ear下的Jdom.web.war包下。
运行过程:
通过页面触发TestCastAction的valid方法,在这个方法里,会进行实例化UserManagerMgr、TUser、CmtCtrlMgr,同时将这几个类对应的加载类打印出来。
打印日志如下:
20:22:04,378 INFO [STDOUT] managerMgr return cast::org.jboss.mx.loading.UnifiedClassLoader3@16f144c{ url=null ,addedOrder=2}
20:22:04,378 INFO [STDOUT] action's TUser cast::org.jboss.mx.loading.UnifiedClassLoader3@16f144c{ url=null ,addedOrder=2}
20:22:04,378 INFO [STDOUT] action's user cast::org.jboss.mx.loading.UnifiedClassLoader3@16f144c{ url=null ,addedOrder=2}
20:22:04,402 INFO [STDOUT] action's cmtCtrlMgr cast::WebappClassLoader
delegate: false
repositories:
/WEB-INF/classes/
----------> Parent Classloader:
java.net.FactoryURLClassLoader@1242445
20:22:04,402 INFO [STDOUT] action's CmtCtrlMgr cast::org.jboss.mx.loading.UnifiedClassLoader3@bc917c{ url=file:/usr/jboss/jboss/server/default/tmp/deploy/tmp6204233924756827378Jdom.ear ,addedOrder=50}
14:44:25,943 INFO [STDOUT] action.util.StaticClass cast::WebappClassLoader
delegate: false
repositories:
/WEB-INF/classes/
----------> Parent Classloader:
java.net.FactoryURLClassLoader@1641c0
结论:
1、default/lib下的jar包与deploy下的jar包(包括ear里面的jar)都是由UnifiedClassLoader3加载,但是又不同的实例加载(根据日志,lib下的是UnifiedClassLoader3@16f144c,deploy下的是UnifiedClassLoader3@bc917c),这里可以解释之前的ClasscastException A cannot cast to A的问题了,尽管路径、类的详细内容一致,但是由不同实例加载,这样肯定不能做转换的。
2、war包是由WebappClassLoader加载的,同时,war包能够访问到由UnifiedClassLoader3加载的类。
问题:
1、CmtCtrlMgr的引用cmtCtrlMgr为什么是由 UnifiedClassLoader3加载的呢?
2、
相关测试的结论:
1、同一个ear下的jar包都是用UnifiedClassLoader3的同一个实例来加载的。
2、貌似普通的javabean不能同时存在于lib下和deploy下?如果同时存在,报错:java.lang.LinkageError: loader constraint violation: loader (instance of org/jboss/web/tomcat/service/WebAppClassLoader) previously initiated loading for a different type with name "a/c/Operate"。