Doble ear Classloader problem
igor84 Dec 24, 2009 11:12 AMI am using jboss 5.0.1 and deploying epps.ear application to it. From time to time I get this exception:
java.lang.ClassCastException: org.jdom.Document cannot be cast to org.jdom.Element
at org.jaxen.jdom.DocumentNavigator.getDocumentNode(DocumentNavigator.java:397)
at org.jaxen.expr.DefaultAbsoluteLocationPath.evaluate(DefaultAbsoluteLocationPath.java:102)
at org.jaxen.expr.DefaultXPathExpr.asList(DefaultXPathExpr.java:102)
at org.jaxen.BaseXPath.selectNodesForContext(BaseXPath.java:674)
at org.jaxen.BaseXPath.selectNodes(BaseXPath.java:213)
at org.jaxen.BaseXPath.selectSingleNode(BaseXPath.java:234)
at org.jdom.xpath.JaxenXPath.selectSingleNode(JaxenXPath.java:153)...
Method where this exception occurs is (I added try catch System.out part):
public Object getDocumentNode(Object contextNode)
{
try {
if ( contextNode instanceof Document )
{
return contextNode;
}
Element elem = (Element) contextNode;
return elem.getDocument();
} catch (ClassCastException ce) {
System.out.println("Given object class: "+contextNode.getClass().getName()+" classloader:"+contextNode.getClass().getClassLoader()+" parent classloader"+contextNode.getClass().getClassLoader().getParent());
System.out.println("My Document class: "+Document.class.getName()+" classloader:"+Document.class.getClassLoader()+" parent classloader"+Document.class.getClassLoader().getParent());
throw ce;
}
}
And System.out.println that I added gives me this:
Given object class: org.jdom.Document classloader:BaseClassLoader@18f3ba1{vfsfile:/C:/serveri/jboss-5.0.1.GA/server/default/deploy/epps.ear/} parent classloadernull
My Document class: org.jdom.Document classloader:BaseClassLoader@12f95de{vfsfile:/C:/serveri/jboss-5.0.1.GA/server/default/deploy/epps.ear/} parent classloadernull
If I am reading this correctly there are two BaseClassLoader instances and both loaded jdom classes so instanceof operator thinks that given org.jdom.Document is not the same class as its org.jdom.Document.
Does anyone have an idea how could this have happened and how can I stop it from happening? Tell me if you need any further informations. Thank you.