2012-01-25 10 views
5

私はXMLtoXML.javaというクラスがあり、これはjava.lang.NoClassDefFoundErrorが:ORG/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アプリケーションの一部として追加し、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がクラスパス上に存在することも確信しています。 誰も問題に関するアイデアはありますか?

+1

さて、どのようにあなたがあなたのクラスパスにDOM4J-full.jarを含めることを試みたがありますか?それは本当に*存在しないか、少なくとも「jaxen」にアクセスできないように思えます。あなたのクラスパス上の 'jaxen'はどこですか? –

+0

my [classfinder](http://www.adarshr.com/papers/classfinder)を使用して、特定のクラスが含まれるjarを検索します。 – adarshr

+0

@JonSkeet Dom4jはstacktraceを見ると最初はそこにあるようですが、jaxenが 'Document'クラスを参照するときにnomoreがあります。それは変だ! – javanna

答えて

4

dom4j-full.jarは、dom4jjaxenの両方を含むように見えます。あなたから 私はdom4jがクラスパスにあることを理解スタックトレース、およびそれがjaxenを見つけることができますが、jaxendom4jを探すときには、それを見つけることができません。 dom4jからロードされたjaxenは、何らかの理由でdom4j-full.jarの中にあるものではありませんが、別のクラスローダーから読み込まれたアプリケーションサーバのクラスパス内にあります。たぶんあなたはjaxen.jarをあなたの共有ライブラリなどに持っているかもしれません。

+2

ありがとうjavanna。それは問題です。私はweblogicを使用しています。 Jaxenはweblogic System Classpathの一部ですので、jarファイルは表示されません。 私はWARファイルのweblogic.xmlにPREFER WEB INF classesオプションを定義しました。このようにして、dom4j-full.jarがdom4jとjaxenのためにロードされるようにしました。 – sa9689

+0

うれしいことを解決しました!私はあなたがTomcatと仕事をしていると思った。 – javanna

3

スタックトレースは明らかに他のorg.dom4jのクラスが存在し、使用されていると述べています。 ライブラリのバージョンが競合しているようです。

DOM4JとにJaxenバージョンは互いに互換性があるべきです。

は、スタンドアロンモードでうまく動作するものとそのバージョンを比較してください。

+0

。 'NoClassDefFound'は、 – jere

+0

@ Vadzimを追跡するための雌犬になることができます。私はスタンドアロンとウェブアプリケーション(dom4j-full.jar)で同じjarファイルを使用しています。私はそれがクラスローダーの問題かもしれないと思うが、私は確信していない。 – sa9689

+0

jaxenも同じですか?もしそうなら、Jon Skeetのコメントを見てください。両方のジャーが同じ場所にあり、ダブルスがないことを確認してください。 – Vadzim

関連する問題