2012-01-25 64 views
5

我有一个叫XMLtoXML.java类,这是它的方法之一...java.lang.NoClassDefFoundError:组织/ dom4j中/文件

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); 

代码块的最后一行使用一棵dom4j Document.i在我的类路径中有dom4j-full.jar。 如果我作为独立运行这个类(在Eclipse中作为Java应用程序运行),那么它工作正常。 当我添加这个类作为web appllication和dom4j-full.jar在我的类路径中的一部分。
我得到以下异常。

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) 

我也确定dom4j jar出现在classpath中。 任何人有任何关于问题的想法?

+1

那么,你是如何尝试在你的类路径中包含dom4j-full.jar的?这听起来像是真的*不是*那里 - 或者至少不能被'jaxen'访问。 classpath上的'jaxen'在哪里? –

+0

使用我的[classfinder](http://www.adarshr.com/papers/classfinder)搜索哪个jar包含给定的类。 – adarshr

+0

@JonSkeet Dom4j在开始的时候似乎是在那里,如果你看一下堆栈跟踪,但是当jaxen查找'Document'类时,它就会被提名。这很奇怪! – javanna

回答

4

看起来像dom4j-full.jar包含dom4jjaxen。 从你stacktrace我明白dom4j是在类路径,它可以找到jaxen,但是当jaxen寻找dom4j它找不到它。 我认为从dom4j加载的jaxen不是因为某种原因,而是dom4j-full.jar中的一个,但另一个在应用程序服务器类路径中(当然不在您的eclipse中),可能是从不同的类加载器加载的。也许你在共享库中有一个jaxen.jar或类似的东西。

+2

谢谢javanna。这是问题。我正在使用weblogic。 Jaxen是weblogic System Classpath的一部分,所以它没有看到我的罐子。 我为我的WAR文件在weblogic.xml中定义了PREFER WEB INF类选项。这样我确保dom4j-full.jar被加载为dom4j和jaxen。 – sa9689

+0

很高兴你解决了!我以为你在和Tomcat合作。 – javanna

3

堆栈跟踪清楚地表明其他org.dom4j类存在并正在使用。 所以看来你有图书馆版本冲突。

dom4j和jaxen版本应该相互兼容。

将它们的版本与在独立模式下运行良好的版本进行比较。

+0

。 'NoClassDefFound'可能是一个婊子来追踪 – jere

+0

@ Vadzim,我在独立和web应用程序(dom4j-full.jar)中使用了相同的jar。我认为这可能是classloader问题,但我不确定。 – sa9689

+0

jaxen也一样吗?如果是,请参阅Jon Skeet的评论。检查两个罐子是否在同一个地方,没有双打。 – Vadzim

相关问题