问题
I have a class called XMLtoXML.java and this is one of it's methods...
import org.dom4j.Document;
import org.dom4j.Element;
import org.dom4j.Node;
import org.dom4j.io.OutputFormat;
import org.dom4j.io.XMLWriter;
public Object[] process(Object data) {
String templateXML = null;
Object result[] = null;
String inputxml = null;
String templateNumber = null;
Iterator iterator = null;
String scenarioConfigUrl = null;
Node inputNode;
Node outputNode;
String subTemplateXML = null;
String outputXml = null;
if (delay != null) {
long time = Long.parseLong(delay);
try {
Thread.sleep(time);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
inputxml = (String) metadata.get(Constants.REQUEST);
if (inputxml == null) {
throw new NullRecordException("input data to XMLtoXML class in
metadata map is null");
}
Document inputXMLDocument = Dom4jUtils.getDocument(inputxml);
last line of code block uses a dom4j Document.i have dom4j-full.jar in my classpath.
if i run this class as standalone(Run as Java application in eclipse) then it works fine.
when i add this class as part of web appllication and dom4j-full.jar in my classpath.
i got following exception.
java.lang.NoClassDefFoundError: org/dom4j/Document
at org.jaxen.dom4j.DocumentNavigator.getDocumentNode(DocumentNavigator.java:346)
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.dom4j.xpath.DefaultXPath.selectSingleNode(DefaultXPath.java:156)
at org.dom4j.tree.AbstractNode.selectSingleNode(AbstractNode.java:188)
at org.amdocs.convert.XMLtoXML.process(XMLtoXML.java:134)
at org.openadaptor.core.node.Node.processSingleRecord(Node.java:148)
at org.openadaptor.core.node.Node.process(Node.java:170)
at org.openadaptor.core.node.ProcessorNode.process(ProcessorNode.java:96)
at org.openadaptor.core.router.AbstractRouter.process(AbstractRouter.java:239)
at org.openadaptor.core.router.AbstractRouter.process(AbstractRouter.java:223)
at org.openadaptor.core.router.AbstractRouter.processResponse(AbstractRouter.java:249)
at org.openadaptor.core.router.AbstractRouter.process(AbstractRouter.java:239)
at org.openadaptor.core.router.AbstractRouter.process(AbstractRouter.java:223)
at org.openadaptor.core.router.AbstractRouter.process(AbstractRouter.java:180)
at org.openadaptor.core.adaptor.Adaptor.process(Adaptor.java:285)
at org.openadaptor.core.node.Node.callChainedMessageProcessor(Node.java:213)
at org.openadaptor.core.node.Node.process(Node.java:199)
at org.openadaptor.core.node.ReadNode.process(ReadNode.java:241)
at org.openadaptor.core.node.ReadNode.run(ReadNode.java:196)
at java.lang.Thread.run(Thread.java:619)
I am also sure that the dom4j jar present on classpath. Anybody have any ideas about issue?
回答1:
Looks like dom4j-full.jar
contains both dom4j
and jaxen
.
From you stacktrace I understand dom4j
is in the classpath, and it can find jaxen
, but when jaxen
looks for dom4j
it can't find it.
I think the jaxen that has been loaded from dom4j
isn't for some reason that one inside the dom4j-full.jar
but another one that you have within your application server classpath (and not in your eclipse of course), perhaps loaded from a different classloader. Maybe you have a jaxen.jar
in your shared libraries or something like this.
回答2:
The stacktrace clearly states that other org.dom4j
classes are present and being used.
So it seems you have library version conflict.
dom4j and jaxen versions should be compatible with each other.
Compare their versions with those that work well in standalone mode.
来源:https://stackoverflow.com/questions/9002082/java-lang-noclassdeffounderror-org-dom4j-document