Archive

Archive for September, 2010

java getResource()

September 22, 2010 Leave a comment
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

September 22, 2010 Leave a comment

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 = Hello

Exception 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 2010

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: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>