I have been struggling with a classloader issue for several days now and would appreciate if someone could help me with this.
JBoss AS 4.0.5 GA
I'm trying to deploy a J2EE application, the packaging of which looks as follows:
jboss_server_instance | |-lib | | | |- spring2.0.4.jar | |- ... | |- ... | |- deploy | |- EAR | |- abc.jar |- xyz.jar |- ejb1.jar |- ejb2.jar |- ... |- ... |- WAR | |- WEB-INF | |- classes (has nothing) |- lib (initially had abc.jar and xyz.jar as well, now has nothing) |- application-context1.xml |- application-context2.xml |- ... |- ...
There are several classes in abc.jar and xyz.jar that are referenced from inside some EJB jars as well as from inside the WAR. From inside the WAR, I mean servlet definitions in web.xml and bean definitions in Spring configuration files, since 'classes' inside my WEB-INF is empty.
Scenario 1: I placed both abc.jar and xyz.jar at the root of the EAR as well as inside WEB-INF/lib of the WAR. The startup servlets are able to find all the required classes and Spring gets configured fine as well. The problem in this scenario is that there are some classes that need to have singleton instances, and classes inside EJB jars are not able to get the singleton instances created by the WAR.
Scenario 2: I placed abc.jar and xyz.jar ONLY at the root of the EAR and got rid of all jars from WEB-INF/lib of the WAR. Now during the initialization of Spring context I get NoClassDefFoundError for all classes inside abc.jar or xyz.jar. So the classloader is not able to pick classes from the root of the EAR.
I have tried setting the following inside jbossweb-tomcat55.sar/META-INF/jboss-service.xml:
<attribute name="Java2ClassLoadingCompliance">true</attribute> <attribute name="UseJBossWebLoader">true</attribute>
but that did not help either.
I also tried putting the following inside jboss-app.xml of the EAR:
<loader-repository> com.my.package=unique.ear <loader-repository-config> java2ParentDelegation=true </loader-repository-config> </loader-repository>
and the following in jboss-web.xml:
<class-loading java2ClassLoadingCompliance="true"> <loader-repository> com.my.package.war:loader=unique.war <loader-repository-config> java2ParentDelegation=true </loader-repository-config> </loader-repository> </class-loading>
But none of these solves the problem. Am I missing something in my configuration here?