java getResource()
try { System.out.println("TestFindResource.class.getClass().getResource(\"config/x.prop\");"); URL url = TestFindResource.class.getClass().getResource("config/x.prop"); p.load(url.openStream()); } catch (Exception e) { // TODO Auto-generated catch block e.printStackTrace(); }
TestFindResource.class.getClass().getResource(“config/x.prop”);
java.lang.NullPointerException
at TestFindResource.main(TestFindResource.java:11)
try { System.out.println("TestFindResource.class.getClass().getResource(/config/x.prop)"); URL url = TestFindResource.class.getClass().getResource("/config/x.prop"); p.load(url.openStream()); } catch (Exception e) { // TODO Auto-generated catch block e.printStackTrace(); }
TestFindResource.class.getClass().getResource(/config/x.prop)
try { System.out.println("TestFindResource.class.getClass().getResourceAsStream(config/x.prop)"); p.load( TestFindResource.class.getClass().getResourceAsStream("config/x.prop")); } catch (Exception e) { // TODO Auto-generated catch block e.printStackTrace(); }
TestFindResource.class.getClass().getResourceAsStream(config/x.prop)
java.lang.NullPointerException
at java.util.Properties$LineReader.readLine(Properties.java:418)
at java.util.Properties.load0(Properties.java:337)
at java.util.Properties.load(Properties.java:325)
at TestFindResource.main(TestFindResource.java:26)
try { System.out.println("TestFindResource.class.getClass().getResourceAsStream(/config/x.prop)"); p.load( TestFindResource.class.getClass().getResourceAsStream("/config/x.prop")); } catch (Exception e) { // TODO Auto-generated catch block e.printStackTrace(); }
TestFindResource.class.getClass().getResourceAsStream(/config/x.prop)
try { System.out.println("TestFindResource.class.getClassLoader().getResource(config/x.prop)"); URL url = TestFindResource.class.getClassLoader().getResource("config/x.prop"); p.load(url.openStream()); } catch (Exception e) { // TODO Auto-generated catch block e.printStackTrace(); }
TestFindResource.class.getClassLoader().getResource(config/x.prop)
try { System.out.println("TestFindResource.class.getClassLoader().getResource(/config/x.prop)"); URL url = TestFindResource.class.getClassLoader().getResource("/config/x.prop"); p.load(url.openStream()); } catch (Exception e) { // TODO Auto-generated catch block e.printStackTrace(); }
TestFindResource.class.getClassLoader().getResource(/config/x.prop)
java.lang.NullPointerException
at TestFindResource.main(TestFindResource.java:49)
java.lang.NullPointerException
at java.util.Properties$LineReader.readLine(Properties.java:418)
at java.util.Properties.load0(Properties.java:337)
at java.util.Properties.load(Properties.java:325)
at TestFindResource.main(TestFindResource.java:63)
try { System.out.println("TestFindResource.class.getClassLoader().getResourceAsStream(config/x.prop)"); p.load(TestFindResource.class.getClassLoader().getResourceAsStream("config/x.prop")); } catch (Exception e) { // TODO Auto-generated catch block e.printStackTrace(); }
TestFindResource.class.getClassLoader().getResourceAsStream(config/x.prop)
try { System.out.println("TestFindResource.class.getClassLoader().getResourceAsStream(/config/x.prop)"); p.load( TestFindResource.class.getClassLoader().getResourceAsStream("/config/x.prop")); } catch (Exception e) { // TODO Auto-generated catch block e.printStackTrace(); }
TestFindResource.class.getClassLoader().getResourceAsStream(/config/x.prop)
try { Enumeration resources = TestFindResource.class.getClassLoader().getResources("config/x.prop"); while(resources.hasMoreElements()){ System.out.println(resources.nextElement()); } } catch (Exception e) { // TODO Auto-generated catch block e.printStackTrace(); }
file:/JBossClassloading/CommonLibrary/target/test-classes/config/x.prop
try { Enumeration resources = TestFindResource.class.getClassLoader().getResources("/config/x.prop"); while(resources.hasMoreElements()){ System.out.println(resources.nextElement()); } } catch (Exception e) { // TODO Auto-generated catch block e.printStackTrace(); } } }
Nothing prints.
jboss-classloading.xml usecases
Two EJBs.
ConsumerEJB:
@Stateless @LocalBinding(jndiBinding="service/ProducerServiceBean") public class ProducerServiceBean implements ProducerServiceLocal,ProducerServiceRemote{ private Logger logger = Logger.getLogger("ProducerServiceBean"); public String sayHello() { logger.info("Called ProducerServiceBean Hello"); return "Hello"; } }
ProducerEJB:
@Stateless public class ConsumerServiceBean implements ConsumerServiceLocal, ConsumerServiceRemote { private Log logger = LogFactory.getLog("ConsumerServiceBean"); public boolean callTheOtheEJB() { ProducerService myStateless = lookup(ProducerService.class, "service/ProducerServiceBean", true); logger.info("Called myStateless sayHello = "+ myStateless.sayHello()); return true; } }
UseCases:
1. jboss-classloading.xml set in ProducerEJB and ConsumerEJB. Domain : IsolatedDomain, ParentDomain: DefaultDomain.
2010-09-14 16:17:13,620 INFO [ProducerServiceBean] (WorkerThread#0[127.0.0.1:63882]) Called ProducerServiceBean Hello
2010-09-14 16:17:13,620 INFO [ConsumerServiceBean] (WorkerThread#0[127.0.0.1:63882]) Called myStateless sayHello = Hello
2. jboss-classloading.xml set in ProducerEJB, NOT in ConsumerEJB. Domain : IsolatedDomain, ParentDomain: DefaultDomain.
<classloading xmlns="urn:jboss:classloading:1.0" domain="IsolatedDomain" export-all="NON_EMPTY" import-all="true"> </classloading>
ProducerEJB cannot access ConsumerEJB.
Exception in thread “main” javax.ejb.EJBException: Unexpected Error
java.lang.NoClassDefFoundError: com/producer/service/ProducerService
at com.consumer.service.bean.ConsumerServiceBean.callTheOtheEJB(ConsumerServiceBean.java:22)Caused by: java.lang.ClassNotFoundException: com.producer.service.ProducerService from BaseClassLoader@1aef201d{VFSClassLoaderPolicy@49255dbb{name=vfszip:/jboss-5.1.0.GA/server/default/deploy/ConsumerEJB-0.0.1-SNAPSHOT.jar/ domain=ClassLoaderDomain@10439d3b{name=DefaultDomain parentPolicy=BEFORE parent=org.jboss.bootstrap.NoAnnotationURLClassLoader@4b9a0203} roots=[MemoryContextHandler@875349377[path= context=vfsmemory://h5tb6l-2bxb67-ge39xz9q-1-ge3dbdx1-a1 real=vfsmemory://h5tb6l-2bxb67-ge39xz9q-1-ge3dbdx1-a1], DelegatingHandler@1733997289[path=ConsumerEJB-0.0.1-SNAPSHOT.jar context=file:/jboss-5.1.0.GA/server/default/deploy/ real=file:/jboss-5.1.0.GA/server/default/deploy/ConsumerEJB-0.0.1-SNAPSHOT.jar]] delegates=null exported=[com.consumer.service.bean, com.consumer.service, META-INF.maven.Examples.ConsumerEJB, META-INF] NON_EMPTY}}
at org.jboss.classloader.spi.base.BaseClassLoader.loadClass(BaseClassLoader.java:448)
at java.lang.ClassLoader.loadClass(ClassLoader.java:250)
3. ProducerEJB: Domain : DefaultDomain, ParentDomain: DefaultDomain.
ConsumerEJB: Domain : IsolatedDomain, ParentDomain: DefaultDomain.
Requirements are resolved in hierarchy. Hence works. ConsumerEJB finds ProducerEJB.
2010-09-14 16:51:00,404 INFO [ProducerServiceBean] (WorkerThread#0[127.0.0.1:64147]) Called ProducerServiceBean Hello
2010-09-14 16:51:00,405 INFO [ConsumerServiceBean] (WorkerThread#0[127.0.0.1:64147]) Called myStateless sayHello = Hello
2010-09-14 16:51:00,405 INFO [ProducerServiceBean] (WorkerThread#0[127.0.0.1:64147]) Called ProducerServiceBean Hello
2010-09-14 16:51:00,405 INFO [ConsumerServiceBean] (WorkerThread#0[127.0.0.1:64147]) Trying to access ProducerServiceBean Directly : Hello
4. Added wrong pkg in ProducerEJB: jboss-cl.xml (Should have been com.producer.service). Hides OSGI style.
<classloading xmlns="urn:jboss:classloading:1.0" domain="DefaultDomain" export-all="NON_EMPTY" import-all="true"> <capabilities> <package name="com.consumer.service" /> </capabilities> </classloading>
Exception in thread “main” javax.ejb.EJBException: Unexpected Error
java.lang.NoClassDefFoundError: com/producer/service/ProducerService
at com.consumer.service.bean.ConsumerServiceBean.callTheOtheEJB(ConsumerServiceBean.java:23)
Caused by: java.lang.ClassNotFoundException: com.producer.service.ProducerService from BaseClassLoader@216b907c{VFSClassLoaderPolicy@1cdace08{name=vfszip:/jboss-5.1.0.GA/server/default/deploy/ConsumerEJB-0.0.1-SNAPSHOT.jar/ domain=ClassLoaderDomain@76640885{name=IsolatedDomain parentPolicy=BEFORE parent=ClassLoaderDomain@10439d3b{DefaultDomain}} roots=[MemoryContextHandler@1628208644[path= context=vfsmemory://h5tb6l-2bxb67-ge39xz9q-1-ge3faend-a9 real=vfsmemory://h5tb6l-2bxb67-ge39xz9q-1-ge3faend-a9], DelegatingHandler@1733997289[path=ConsumerEJB-0.0.1-SNAPSHOT.jar context=file:/jboss-5.1.0.GA/server/default/deploy/ real=file:/jboss-5.1.0.GA/server/default/deploy/ConsumerEJB-0.0.1-SNAPSHOT.jar]] delegates=null exported=[com.consumer.service.bean, com.consumer.service, META-INF.maven.Examples.ConsumerEJB, META-INF] NON_EMPTY}}
at org.jboss.classloader.spi.base.BaseClassLoader.loadClass(BaseClassLoader.java:448
5. ProducerEJB: jboss-cl.xml
<classloading xmlns="urn:jboss:classloading:1.0" domain="DefaultDomain" export-all="NON_EMPTY" import-all="true"> <capabilities> <package name="com.producer.service" /> </capabilities> </classloading>
2010-09-14 17:05:09,371 INFO [ProducerServiceBean] (WorkerThread#0[127.0.0.1:64257]) Called ProducerServiceBean Hello
2010-09-14 17:05:09,371 INFO [ConsumerServiceBean] (WorkerThread#0[127.0.0.1:64257]) Called myStateless sayHello = HelloException in thread “main” javax.ejb.EJBException: Unexpected Error
java.lang.NoClassDefFoundError: com/producer/service/bean/ProducerServiceBean
at com.consumer.service.bean.ConsumerServiceBean.callTheOtheEJB(ConsumerServiceBean.java:25)Caused by: java.lang.ClassNotFoundException: com.producer.service.bean.ProducerServiceBean from BaseClassLoader@37cbcec3{VFSClassLoaderPolicy@257380d3{name=vfszip:/jboss-5.1.0.GA/server/default/deploy/ConsumerEJB-0.0.1-SNAPSHOT.jar/ domain=ClassLoaderDomain@62ed088a{name=IsolatedDomain parentPolicy=BEFORE parent=ClassLoaderDomain@10439d3b{DefaultDomain}} roots=[MemoryContextHandler@1108258778[path= context=vfsmemory://h5tb6l-2bxb67-ge39xz9q-1-ge3fjo8v-aa real=vfsmemory://h5tb6l-2bxb67-ge39xz9q-1-ge3fjo8v-aa], DelegatingHandler@1733997289[path=ConsumerEJB-0.0.1-SNAPSHOT.jar context=file:/jboss-5.1.0.GA/server/default/deploy/ real=file:/jboss-5.1.0.GA/server/default/deploy/ConsumerEJB-0.0.1-SNAPSHOT.jar]] delegates=null exported=[com.consumer.service.bean, com.consumer.service, META-INF.maven.Examples.ConsumerEJB, META-INF] NON_EMPTY}}
6. Different domains for ProducerEJB and ConsumerEJB. The classes are not visible to each other.
ProducerEJB:
<classloading xmlns="urn:jboss:classloading:1.0" domain="ConsumerDomain" export-all="NON_EMPTY" import-all="true"> <capabilities> <package name="com.producer.service" /> </capabilities> </classloading>
ConsumerEJB:
<classloading xmlns="urn:jboss:classloading:1.0" domain="ProducerDomain" export-all="NON_EMPTY" import-all="true"> </classloading>
Exception in thread “main” javax.ejb.EJBException: Unexpected Error
java.lang.NoClassDefFoundError: com/producer/service/ProducerService
at com.consumer.service.bean.ConsumerServiceBean.callTheOtheEJB(ConsumerServiceBean.java:23)
7. Invalid “requirements” tag in ConsumerEJB.
<classloading xmlns="urn:jboss:classloading:1.0" domain="ProducerDomain" export-all="NON_EMPTY" import-all="true"> <requirements> <module name="CommonLibrary.jar"/> </requirements> </classloading>
DEPLOYMENTS MISSING DEPENDENCIES:
Deployment “vfszip:/jboss-5.1.0.GA/server/default/deploy/ConsumerEJB-0.0.1-SNAPSHOT.jar/” is missing the following dependencies:
Dependency “” (should be in state “ClassLoader”, but is actually in state “** UNRESOLVED ModuleRequirement{CommonLibrary.jar [0.0.0,?)} **”)DEPLOYMENTS IN ERROR:
Deployment “” is in error due to the following reason(s): ** UNRESOLVED ModuleRequirement{CommonLibrary.jar [0.0.0,?)} **at org.jboss.deployers.plugins.deployers.DeployersImpl.checkComplete(DeployersImpl.java:993)
8. Added correct “requirements” tag in ConsumerEJB.
<classloading xmlns="urn:jboss:classloading:1.0" domain="ProducerDomain" export-all="NON_EMPTY" import-all="true"> <requirements> <module name="CommonLibrary-0.0.1-SNAPSHOT.jar"/> </requirements> </classloading>
Exception in thread “main” javax.ejb.EJBException: Unexpected Error
java.lang.NoClassDefFoundError: com/producer/service/ProducerService
at com.consumer.service.bean.ConsumerServiceBean.callTheOtheEJB(ConsumerServiceBean.java:25)Caused by: java.lang.ClassNotFoundException: com.producer.service.ProducerService from BaseClassLoader@1ee35bb2{VFSClassLoaderPolicy@609912f5{name=vfszip:/jboss-5.1.0.GA/server/default/deploy/ConsumerEJB-0.0.1-SNAPSHOT.jar/ domain=ClassLoaderDomain@76a45568{name=ProducerDomain parentPolicy=BEFORE parent=ClassLoaderDomain@470794d4{DefaultDomain}} roots=[MemoryContextHandler@1638646878[path= context=vfsmemory://h5tb6l-w1cn9l-ge4g82ce-1-ge4g8rkg-28 real=vfsmemory://h5tb6l-w1cn9l-ge4g82ce-1-ge4g8rkg-28], DelegatingHandler@1710140062[path=ConsumerEJB-0.0.1-SNAPSHOT.jar context=file:/jboss-5.1.0.GA/server/default/deploy/ real=file:/jboss-5.1.0.GA/server/default/deploy/ConsumerEJB-0.0.1-SNAPSHOT.jar]] delegates=[FilteredDelegateLoader@53e9296a{delegate=VFSClassLoaderPolicy@4ba56ca0{vfszip:/jboss-5.1.0.GA/server/default/deploy/CommonLibrary-0.0.1-SNAPSHOT.jar/}}] exported=[com.consumer.service.bean, com.consumer.service, META-INF.maven.Examples.ConsumerEJB, META-INF] NON_EMPTY}}
9. Added ProducerEJB-0.0.1-SNAPSHOT to module requirements tag. ProducerEJB is deployed after ConsumerEJB, hence deployment fails.
<classloading xmlns="urn:jboss:classloading:1.0" domain="ProducerDomain" export-all="NON_EMPTY" import-all="true"> <requirements> <module name="CommonLibrary-0.0.1-SNAPSHOT.jar"/> <module name="ProducerEJB-0.0.1-SNAPSHOT.jar"/> </requirements> </classloading>
DEPLOYMENTS MISSING DEPENDENCIES:
Deployment “vfszip:/jboss-5.1.0.GA/server/default/deploy/ConsumerEJB-0.0.1-SNAPSHOT.jar/” is missing the following dependencies:
Dependency “” (should be in state “ClassLoader”, but is actually in state “** UNRESOLVED ModuleRequirement{ProducerEJB-0.0.1-SNAPSHOT.jar [0.0.0,?)} **”)DEPLOYMENTS IN ERROR:
Deployment “” is in error due to the following reason(s): ** UNRESOLVED ModuleRequirement{ProducerEJB-0.0.1-SNAPSHOT.jar [0.0.0,?)} **
10. Add another jar to deploy folder. Not incl in requirements didnt effect it. The class was still visible to ConsumerEJB. Please note that CommonLibrary2-0.0.1-SNAPSHOT isnt part of the requirements and import-all is false. Both the libraries dont have jboss-classloading.xml.
<classloading xmlns="urn:jboss:classloading:1.0" domain="IsolatedDomain" export-all="NON_EMPTY" import-all="false"> <requirements> <module name="CommonLibrary-0.0.1-SNAPSHOT.jar"/> </requirements> <capabilities> <package name="com.consumer.service" /> </capabilities> </classloading>
Exception in thread “main” javax.ejb.EJBException: Unexpected Error
java.lang.NoClassDefFoundError: com/producer/service/ProducerService
at com.consumer.service.bean.ConsumerServiceBean.callTheOtheEJB(ConsumerServiceBean.java:27)
Caused by: java.lang.ClassNotFoundException: com.producer.service.ProducerService from BaseClassLoader@7febaf45{VFSClassLoaderPolicy@4a401c9f{name=vfszip:/jboss-5.1.0.GA/server/default/deploy/ConsumerEJB-0.0.1-SNAPSHOT.jar/ domain=ClassLoaderDomain@4873269b{name=IsolatedDomain parentPolicy=BEFORE parent=ClassLoaderDomain@10439d3b{DefaultDomain}} roots=[MemoryContextHandler@924266702[path= context=vfsmemory://h5tb6l-bdtj3x-ge4jqt6i-1-ge4l4acd-a4 real=vfsmemory://h5tb6l-bdtj3x-ge4jqt6i-1-ge4l4acd-a4], DelegatingHandler@1206181996[path=ConsumerEJB-0.0.1-SNAPSHOT.jar context=file:/jboss-5.1.0.GA/server/default/deploy/ real=file:/jboss-5.1.0.GA/server/default/deploy/ConsumerEJB-0.0.1-SNAPSHOT.jar]] delegates=[FilteredDelegateLoader@538540a3{delegate=VFSClassLoaderPolicy@768179c2{vfszip:/jboss-5.1.0.GA/server/default/deploy/CommonLibrary-0.0.1-SNAPSHOT.jar/}}] exported=[com.consumer.service]NON_EMPTY}}2010-09-15 12:28:55,246 INFO [ConsumerServiceBean] (WorkerThread#0[127.0.0.1:55994]) new CommonUtils().todaysDate() = Wed Sep 15 12:28:55 PDT 2010
2010-09-15 12:28:55,247 INFO [ConsumerServiceBean] (WorkerThread#0[127.0.0.1:55994]) new CommonUtils2().todaysDate() = From222 :Wed Sep 15 12:28:55 PDT 2010
11. Adding jboss-classloading.xml to CommonLibrary-0.0.1-SNAPSHOT and CommonLibrary2-0.0.1-SNAPSHOT , ConsumerEJB didnt add any requirements and import-all was FALSE.
Exception in thread “main” javax.ejb.EJBException: Unexpected Error
java.lang.NoClassDefFoundError: com/common/library/CommonUtils
at com.consumer.service.bean.ConsumerServiceBean.callTheOtheEJB(ConsumerServiceBean.java:25)
12. Adding jboss-classloading.xml to CommonLibrary-0.0.1-SNAPSHOT and CommonLibrary2-0.0.1-SNAPSHOT , ConsumerEJB didnt add any requirements and import-all was TRUE. ConsumerEJB can access CommonLibraries.
2010-09-15 12:40:11,037 INFO [ConsumerServiceBean] (WorkerThread#0[127.0.0.1:56095]) new CommonUtils().todaysDate() = Wed Sep 15 12:40:11 PDT 2010
2010-09-15 12:40:11,039 INFO [ConsumerServiceBean] (WorkerThread#0[127.0.0.1:56095]) new CommonUtils2().todaysDate() = From222 :Wed Sep 15 12:40:11 PDT 2010
13. Adding jboss-classloading.xml to CommonLibrary-0.0.1-SNAPSHOT and CommonLibrary2-0.0.1-SNAPSHOT , ConsumerEJB adds CommonLibrary-0.0.1-SNAPSHOT as requirements and import-all was FALSE. ConsumerEJB can access CommonLibrary, but cannot access CommonLibary2.
<classloading xmlns="urn:jboss:classloading:1.0" domain="IsolatedDomain" export-all="NON_EMPTY" import-all="false"> <requirements> <module name="CommonLibrary-0.0.1-SNAPSHOT.jar"/> </requirements> <capabilities> <package name="com.consumer.service" /> </capabilities> </classloading>
2010-09-15 12:43:06,435 INFO [ConsumerServiceBean] (WorkerThread#0[127.0.0.1:56118]) new CommonUtils().todaysDate() = Wed Sep 15 12:43:06 PDT 2010
Exception in thread “main” javax.ejb.EJBException: Unexpected Error
java.lang.NoClassDefFoundError: com/common2/library/CommonUtils
at com.consumer.service.bean.ConsumerServiceBean.callTheOtheEJB(ConsumerServiceBean.java:26)
Caused by: java.lang.ClassNotFoundException: com.common2.library.CommonUtils from BaseClassLoader@4a8c7267{VFSClassLoaderPolicy@4aaaee6d{name=vfszip:/jboss-5.1.0.GA/server/default/deploy/ConsumerEJB-0.0.1-SNAPSHOT.jar/ domain=ClassLoaderDomain@3381423d{name=IsolatedDomain parentPolicy=BEFORE parent=ClassLoaderDomain@10439d3b{DefaultDomain}} roots=[MemoryContextHandler@470506599[path= context=vfsmemory://h5tb6l-bdtj3x-ge4jqt6i-1-ge4lmb30-ae real=vfsmemory://h5tb6l-bdtj3x-ge4jqt6i-1-ge4lmb30-ae], DelegatingHandler@1206181996[path=ConsumerEJB-0.0.1-SNAPSHOT.jar context=file:/jboss-5.1.0.GA/server/default/deploy/ real=file:/jboss-5.1.0.GA/server/default/deploy/ConsumerEJB-0.0.1-SNAPSHOT.jar]] delegates=[FilteredDelegateLoader@2ddf7c93{delegate=VFSClassLoaderPolicy@f272e4a{vfszip:/jboss-5.1.0.GA/server/default/deploy/CommonLibrary-0.0.1-SNAPSHOT.jar/}}] exported=[com.consumer.service]NON_EMPTY}}
14. Adding jboss-classloading.xml to CommonLibrary-0.0.1-SNAPSHOT and CommonLibrary2-0.0.1-SNAPSHOT , ConsumerEJB adds CommonLibrary-0.0.1-SNAPSHOT,CommonLibrary2-0.0.1-SNAPSHOT as requirements and import-all was FALSE. ConsumerEJB doesnt deploy.
2010-09-15 14:27:57,455 ERROR [org.jboss.kernel.plugins.dependency.AbstractKernelController] (main) Error resolving dependencies for ClassLoader: name=vfszip:/jboss-5.1.0.GA/server/default/deploy/ConsumerEJB-0.0.1-SNAPSHOT.jar/ state=Describe mode=Manual requiredState=ClassLoader
java.lang.IllegalStateException: VFSDeploymentClassLoaderPolicyModule CommonLibrary2-0.0.1-SNAPSHOT.jar:0.0.0 cannot be added because it is exports package META-INF which conflicts with VFSDeploymentClassLoaderPolicyModule CommonLibrary-0.0.1-SNAPSHOT.jar:0.0.0
at org.jboss.classloading.spi.dependency.ClassLoadingSpace.join(ClassLoadingSpace.java:223)
at org.jboss.classloading.spi.dependency.ClassLoadingSpace.joinAndResolve(ClassLoadingSpace.java:120)
15. Adding jboss-classloading.xml to CommonLibrary-0.0.1-SNAPSHOT and CommonLibrary2-0.0.1-SNAPSHOT. Excluding META-INF directory resolves the earlier error @ 14. ConsumerEJB adds CommonLibrary-0.0.1-SNAPSHOT,CommonLibrary2-0.0.1-SNAPSHOT as requirements and import-all was FALSE.
<classloading xmlns="urn:jboss:classloading:1.0" domain="IsolatedDomain" export-all="NON_EMPTY" import-all="false" excluded="META-INF"> </classloading>
2010-09-15 15:04:09,335 INFO [ConsumerServiceBean] (WorkerThread#0[127.0.0.1:57282]) new CommonUtils().todaysDate() = Wed Sep 15 15:04:09 PDT 2010
2010-09-15 15:04:09,336 INFO [ConsumerServiceBean] (WorkerThread#0[127.0.0.1:57282]) new CommonUtils2().todaysDate() = From222 :Wed Sep 15 15:04:09 PDT 2010
Exception in thread “main” javax.ejb.EJBException: Unexpected Error
java.lang.NoClassDefFoundError: com/common3/library/CommonUtils
at com.consumer.service.bean.ConsumerServiceBean.callTheOtheEJB(ConsumerServiceBean.java:27)
Caused by: java.lang.ClassNotFoundException: com.common3.library.CommonUtils from BaseClassLoader@2c84d9d{VFSClassLoaderPolicy@2c5f7fd8{name=vfszip:/jboss-5.1.0.GA/server/default/deploy/ConsumerEJB-0.0.1-SNAPSHOT.jar/ domain=ClassLoaderDomain@3f78d35f{name=IsolatedDomain parentPolicy=BEFORE parent=ClassLoaderDomain@3aeebf17{DefaultDomain}} roots=[MemoryContextHandler@834819242[path= context=vfsmemory://h5tb6l-tlfjex-ge4qm7bh-1-ge4qmvy9-29 real=vfsmemory://h5tb6l-tlfjex-ge4qm7bh-1-ge4qmvy9-29], DelegatingHandler@1057935256[path=ConsumerEJB-0.0.1-SNAPSHOT.jar context=file:/jboss-5.1.0.GA/server/default/deploy/ real=file:/jboss-5.1.0.GA/server/default/deploy/ConsumerEJB-0.0.1-SNAPSHOT.jar]] delegates=[FilteredDelegateLoader@4d447e6b{delegate=VFSClassLoaderPolicy@4a65d816{vfszip:/jboss-5.1.0.GA/server/default/deploy/CommonLibrary-0.0.1-SNAPSHOT.jar/}}, FilteredDelegateLoader@4bc7ca6e{delegate=VFSClassLoaderPolicy@3b887b2{vfszip:/jboss-5.1.0.GA/server/default/deploy/CommonLibrary2-0.0.1-SNAPSHOT.jar/}}] exported=[com.consumer.service]NON_EMPTY}}
16. Added new library called ZZLibrary. Added jboss-classloading.xml to it. Excluded META-INF. This is how jboss-cl for ConsumerEJB looks. Works.
<classloading xmlns="urn:jboss:classloading:1.0" domain="IsolatedDomain" export-all="NON_EMPTY" import-all="false"> <requirements> <module name="CommonLibrary-0.0.1-SNAPSHOT.jar"/> <module name="CommonLibrary2-0.0.1-SNAPSHOT.jar"/> <module name="ZZLibrary-0.0.1-SNAPSHOT.jar"/> </requirements> <capabilities> <package name="com.consumer.service" /> </capabilities> </classloading>
2010-09-15 15:11:57,366 INFO [ConsumerServiceBean] (WorkerThread#0[127.0.0.1:57354]) new CommonUtils().todaysDate() = Wed Sep 15 15:11:57 PDT 2010
2010-09-15 15:11:57,368 INFO [ConsumerServiceBean] (WorkerThread#0[127.0.0.1:57354]) new CommonUtils2().todaysDate() = From222 :Wed Sep 15 15:11:57 PDT 2010
2010-09-15 15:11:57,369 INFO [ConsumerServiceBean] (WorkerThread#0[127.0.0.1:57354]) new CommonUtils3().todaysDate() = FromZZLibrary :Wed Sep 15 15:11:57 PDT 2010Exception in thread “main” javax.ejb.EJBException: Unexpected Error
java.lang.NoClassDefFoundError: com/producer/service/ProducerService
at com.consumer.service.bean.ConsumerServiceBean.callTheOtheEJB(ConsumerServiceBean.java:28)
17. Added ProducerEJB to ConsumerEJB’s requirements. Added ProducerEJB-0.0.1-SNAPSHOT.jar to ProducerEJB capabilities. But that meant, all the packages were imported.
ConsumerEJB:
<classloading xmlns="urn:jboss:classloading:1.0" domain="IsolatedDomain" export-all="NON_EMPTY" import-all="false" excluded="META-INF"> <requirements> <module name="CommonLibrary-0.0.1-SNAPSHOT.jar"/> <module name="CommonLibrary2-0.0.1-SNAPSHOT.jar"/> <module name="ZZLibrary-0.0.1-SNAPSHOT.jar"/> <module name="ProducerEJB-0.0.1-SNAPSHOT.jar"/> </requirements> <capabilities> <package name="com.consumer.service" /> </capabilities> </classloading>
ProducerEJB:
<classloading xmlns="urn:jboss:classloading:1.0" domain="IsolatedDomain" export-all="NON_EMPTY" import-all="true" excluded="META-INF"> <capabilities> <package name="com.producer.service" /> <module name="ProducerEJB-0.0.1-SNAPSHOT.jar"/> </capabilities> </classloading>
2010-09-15 15:31:26,385 INFO [ProducerServiceBean] (WorkerThread#0[127.0.0.1:57509]) Called ProducerServiceBean Hello
2010-09-15 15:31:26,385 INFO [ConsumerServiceBean] (WorkerThread#0[127.0.0.1:57509]) Called myStateless sayHello = Hello
2010-09-15 15:31:26,386 INFO [ProducerServiceBean] (WorkerThread#0[127.0.0.1:57509]) Called ProducerServiceBean Hello
2010-09-15 15:31:26,386 INFO [ConsumerServiceBean] (WorkerThread#0[127.0.0.1:57509]) Trying to access ProducerServiceBean Directly (new ProducerServiceBean()).sayHello(): Hello
18. Same settings as above, expect added com.producer.service.bean to excluded attribute. Looks like the EJBDeployer didnt find the Bean class.
<classloading xmlns="urn:jboss:classloading:1.0" domain="IsolatedDomain" export-all="NON_EMPTY" import-all="true" excluded="META-INF,com.producer.service.bean"> <capabilities> <package name="com.producer.service" /> <module name="ProducerEJB-0.0.1-SNAPSHOT.jar"/> </capabilities> </classloading>
Caused by: java.lang.ClassNotFoundException: com.producer.service.bean.ProducerServiceBean from BaseClassLoader@37ea14c3{VFSClassLoaderPolicy@68f92ae2{name=vfszip:/jboss-5.1.0.GA/server/default/deploy/ProducerEJB-0.0.1-SNAPSHOT.jar/ domain=ClassLoaderDomain@65a45a7f{name=IsolatedDomain parentPolicy=BEFORE parent=ClassLoaderDomain@6da05bdb{DefaultDomain}} roots=[MemoryContextHandler@1047433541[path= context=vfsmemory://h5tb6l-8a1qj2-ge4rx1ww-1-ge4rxpdu-2a real=vfsmemory://h5tb6l-8a1qj2-ge4rx1ww-1-ge4rxpdu-2a], DelegatingHandler@1292069128[path=ProducerEJB-0.0.1-SNAPSHOT.jar context=file:/jboss-5.1.0.GA/server/default/deploy/ real=file:/jboss-5.1.0.GA/server/default/deploy/ProducerEJB-0.0.1-SNAPSHOT.jar]] delegates=null exported=[com.producer.service] NON_EMPTY}}
at org.jboss.classloader.spi.base.BaseClassLoader.loadClass(BaseClassLoader.java:448)
EAR Setting
1. Added ProducerEJB and ConsumerEJB as ejb-jars. And *Libraries as lib/*.
All the jboss-classloading.xml’s have domain=DefaultDomain.
But, JBoss JMX shows a different picture for EJB’s. The Lib jars are present under DefaultDomain. The EJB’s are in a different domain.
2. Removed jboss-classloading.xml’s from all EJB’s and the jars. There seems to be NO seperate domain created. Everything is in DefaultDomain.
See, No isolated domain
3. Added jb-cl.xml to CommonLibrary. domain=DefaultDomain. No Deployment issues. But isolation didnt happen. My EJB was able to access com.common.library. (Even after removing the capabilities).
<classloading xmlns="urn:jboss:classloading:1.0" domain="DefaultDomain" export-all="NON_EMPTY" import-all="false" excluded="META-INF,com.common.library"> <capabilities> <module name="CommonLibrary-0.0.1-SNAPSHOT.jar" /> </capabilities> </classloading>
2010-09-16 12:12:34,333 INFO [ConsumerServiceBean] (WorkerThread#0[127.0.0.1:50076]) new CommonUtils().todaysDate() = Thu Sep 16 12:12:34 PDT 2010
2010-09-16 12:12:34,334 INFO [ConsumerServiceBean] (WorkerThread#0[127.0.0.1:50076]) Please keep it a secret:Thu Sep 16 12:12:34 PDT 2010
2010-09-16 12:12:34,335 INFO [ConsumerServiceBean] (WorkerThread#0[127.0.0.1:50076]) new CommonUtils2().todaysDate() = From222 :Thu Sep 16 12:12:34 PDT 2010
2010-09-16 12:12:34,337 INFO [ConsumerServiceBean] (WorkerThread#0[127.0.0.1:50076]) new CommonUtils3().todaysDate() = FromZZLibrary :Thu Sep 16 12:12:34 PDT 2010
4. No jb-cl.xml to ProducerEJB. ZAnotherEAR refers to ProducerEJB and does it succesfully.
5. Apparently, if an EJB is part of an EAR. One shouldnt give the “domain”, but just the “parent-domain” tag. Then the behaviour is replicated.
Upon TRACEing the jboss logs upon , I stumbled upon this:
Will use synthetic domain for classloader of subdeployment
I checked org.jboss.deployers.plugins.classloading.AbstractClassLoaderDescribeDeployer.
if (deployment.isTopLevelClassLoader() == false) { if (deployment.getParentDomain() == null) { deployment.setDomain(unitName); log.debugf("Will use synthetic domain for classloader of subdeployment: %1s", unitName); }else{ log.debugf("Will create top level classloader for subdeployment: %1s", unitName); } }
It clearly shows, if the parent-domain is missing, the domain is set to the EAR name.
Hence, The jboss-classloading.xml
<classloading xmlns="urn:jboss:classloading:1.0" parent-domain="DefaultDomain" export-all="NON_EMPTY" import-all="true" excluded="META-INF"> <capabilities> <package name="<interface-package>" /> </capabilities> </classloading>