2012-01-25 11 views
5

Mam klasy o nazwie XMLtoXML.java i jest to jedna z metod jest to ...java.lang.NoClassDefFoundError: org/dom4j/Dokument

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

ostatnia linia bloku kodu używa dom4j Dokument.i ma dom4j-full.jar w mojej ścieżce klas. jeśli uruchomię tę klasę jako autonomiczną (uruchom jako aplikację Java w środowisku Eclipse), to działa poprawnie. , gdy dodaję tę klasę jako część aplikacji sieci web i dom4j-full.jar w mojej ścieżce klas.
Mam następujący wyjątek.

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) 

Jestem też pewien, że słoik dom4j obecny na ścieżce klasy. Ktoś ma jakieś pomysły na temat problemu?

+1

No cóż, w jaki sposób próbowałeś dołączyć dom4j-full.jar do swojej ścieżki klas? Wygląda na to, że naprawdę * nie jest * tam - lub przynajmniej nie jest dostępny dla 'jaxen'. Gdzie jest 'jaxen' w twojej ścieżce klas? –

+0

Użyj mojego [classfinder] (http://www.adarshr.com/papers/classfinder), aby wyszukać, który jar (s) zawiera daną klasę. – adarshr

+0

@JonSkeet Dom4j wydaje się być na początku, jeśli spojrzysz na stos, ale zapamiętaj, gdy jaxen wyszuka klasę "Dokument". To jest dziwne! – javanna

Odpowiedz

4

Wygląda na to, że dom4j-full.jar zawiera zarówno dom4j, jak i jaxen. Od ciebie stacktrace Rozumiem, że dom4j jest w ścieżce klas i może znaleźć jaxen, ale gdy jaxen szuka dom4j, nie może go znaleźć. Myślę, że jaxen, który został załadowany z dom4j, nie jest z jakiegoś powodu, że jeden wewnątrz dom4j-full.jar, ale inny, który masz w swojej ścieżce klasy aplikacji serwera (i oczywiście nie w swoim zaćmieniu), być może załadowany z innego programu ładującego klasy. Może masz jaxen.jar w swoich bibliotekach współdzielonych lub coś w tym stylu.

+2

dzięki javanna. to jest problem. używam weblogic. Jaxen jest częścią weblogic System Classpath, więc nie widzi moich słoików. Mam zdefiniować opcję klasy PREFER WEB INF w weblogic.xml dla mojego pliku WAR. W ten sposób upewniłem się, że dom4j-full.jar są załadowane dla dom4j i jaxen. – sa9689

+0

Cieszę się, że rozwiązany! Myślałem, że pracujesz z Tomcat. – javanna

3

Stacktrace wyraźnie stwierdza, że ​​inne klasy org.dom4j są obecne i są używane. Wygląda na to, że masz konflikt wersji biblioteki.

wersje dom4j i jaxen powinny być ze sobą kompatybilne.

Porównaj ich wersje z tymi, które działają dobrze w trybie autonomicznym.

+0

najprawdopodobniej. 'NoClassDefFound's może być suką do wyśledzenia – jere

+0

@ Vadzim, użyłem tego samego słoika w samodzielnej aplikacji internetowej (dom4j-full.jar). Myślę, że to może być problem z klasą ładującą, ale nie jestem pewien. – sa9689

+0

Czy jaxen jest taki sam? Jeśli tak, zobacz komentarz Jona Skeeta. Sprawdź, czy oba słoiki są w tym samym miejscu i nie ma podwójnych. – Vadzim

Powiązane problemy