NoClassDefFoundError & LinkageError on deployment
bsnavin Aug 25, 2005 7:42 AMI deployed a .sar with a service MBean that loads an XML and parses it with the "Commons Digester" component. The corresponding commons-digester.jar & dependent jars are also included in the .sar
My sar has defined a separate loader repository as multiple instances of the service can be deployed on the same JBoss server. When I deploy this into the "default" configuration of JBoss 3.2.x with "java2ParentDelegation=false", it works just fine.
But when I use "java2ParentDelegation=true", I get the following errors:
First time deployment after server startup :
Caused by: java.lang.NoClassDefFoundError: org/apache/commons/digester/ObjectCreationFactory at org.apache.commons.digester.Digester.addFactoryCreate(Digester.java:2044) at org.apache.commons.digester.Digester.addFactoryCreate(Digester.java:1936) at org.apache.commons.digester.xmlrules.DigesterRuleParser.addRuleInstances(DigesterRuleParser.java:240) at org.apache.commons.digester.Digester.addRuleSet(Digester.java:1663) at org.apache.commons.digester.xmlrules.FromXmlRuleSet.addRuleInstances(FromXmlRuleSet.java:145) at org.apache.commons.digester.Digester.addRuleSet(Digester.java:1663) at org.apache.commons.digester.xmlrules.DigesterLoader.createDigester(DigesterLoader.java:91)
I undeploy the .sar and redeploy it (without a server restart), different error is thrown:
Caused by: java.lang.LinkageError: loader constraints violated when linking org/apache/commons/digester/ObjectCreationFactory class at org.apache.commons.digester.xmlrules.DigesterRuleParser.addRuleInstances(DigesterRuleParser.java:240) at org.apache.commons.digester.Digester.addRuleSet(Digester.java:1663) at org.apache.commons.digester.xmlrules.FromXmlRuleSet.addRuleInstances(FromXmlRuleSet.java:145) at org.apache.commons.digester.Digester.addRuleSet(Digester.java:1663) at org.apache.commons.digester.xmlrules.DigesterLoader.createDigester(DigesterLoader.java:91)
I am not able to figure out why this is happening. But I did notice that "commons-digester.jar" is also bundled with "jbossweb-tomcat50.sar".
Files :
Service.java
package digesterloadertest; import java.io.File; import java.io.FileInputStream; import java.io.InputStream; import org.apache.commons.digester.Digester; import org.apache.commons.digester.xmlrules.DigesterLoader; public class Service { public void setName(String name) { System.out.println("Setting name : " + name); } public void add(String name, String type) { System.out.println("Adding name : [" + name + "], type : [" + type + "]"); } public static void main(String[] args) throws Exception { Digester digester = DigesterLoader.createDigester(new File("config/digester_rules.xml").toURL()); digester.setUseContextClassLoader(true); InputStream inStream = new FileInputStream("config/xml_for_digester.xml"); digester.parse(inStream); } }
JBossService.java
package digesterloadertest; import java.io.InputStream; import java.net.URL; import org.apache.commons.digester.Digester; import org.apache.commons.digester.xmlrules.DigesterLoader; import org.jboss.system.ServiceMBeanSupport; public class JBossService extends ServiceMBeanSupport implements JBossServiceMBean { public void startService() throws Exception { URL u = Thread.currentThread().getContextClassLoader().getResource("config/digester_rules.xml"); Digester digester = DigesterLoader.createDigester(u); digester.setUseContextClassLoader(true); InputStream inStream = Thread.currentThread().getContextClassLoader().getResourceAsStream("config/xml_for_digester.xml"); digester.parse(inStream); } }
JBossServiceMBean
package digesterloadertest; import org.jboss.system.ServiceMBean; public interface JBossServiceMBean extends ServiceMBean { }
config/digester_rules.xml
<?xml version="1.0"?> <digester-rules> <object-create-rule pattern="service" classname="digesterloadertest.Service"/> <set-properties-rule pattern="service"> <alias attr-name="name" prop-name="name" /> </set-properties-rule> <call-method-rule pattern="service/sub-service" methodname="add" paramcount="2"/> <call-param-rule pattern="service/sub-service" paramnumber="0" attrname="name"/> <call-param-rule pattern="service/sub-service" paramnumber="1" attrname="type"/> </digester-rules>
config/xml_for_digester.xml
<?xml version="1.0"?> <service name="MyService"> <sub-service name="SubService1" type="Any"/> <sub-service name="SubService2" type="Some"/> <sub-service name="SubService3" type="All"/> </service>
Any help on this would be of great help.
Thanks