2012-01-25 35 views
5

Tôi có một lớp được gọi là XMLtoXML.java và đây là một trong những phương pháp đó là ...java.lang.NoClassDefFoundError: org/dom4j/Document

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

dòng cuối cùng của khối mã sử dụng một dom4j Document.i có dom4j-full.jar trong classpath của tôi. nếu tôi chạy lớp này là độc lập (Chạy như ứng dụng Java trong nhật thực) thì nó hoạt động tốt. khi tôi thêm lớp này như là một phần của ứng dụng web và dom4j-full.jar trong classpath của tôi.
tôi nhận được ngoại lệ sau.

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) 

Tôi cũng chắc chắn rằng bình dom4j có trên đường dẫn lớp. Bất kỳ ai có bất kỳ ý tưởng nào về vấn đề?

+1

Vâng, bạn đã cố gắng bao gồm dom4j-full.jar trong đường dẫn lớp học của mình như thế nào? Có vẻ như nó thực sự * không * ở đó - hoặc ít nhất là không thể truy cập vào 'jaxen'. Trường hợp là 'jaxen' trên classpath của bạn? –

+0

Sử dụng [kính ngắm] của tôi (http://www.adarshr.com/papers/classfinder) để tìm kiếm (các) lọ chứa một lớp nhất định. – adarshr

+0

@JonSkeet Dom4j dường như ở đó ngay từ đầu nếu bạn nhìn vào stacktrace, nhưng nomore khi jaxen tìm kiếm lớp 'Document'. Lạ nhỉ! – javanna

Trả lời

4

Có vẻ như dom4j-full.jar chứa cả hai dom4jjaxen. Từ bạn stacktrace Tôi hiểu dom4j là trong classpath, và nó có thể tìm thấy jaxen, nhưng khi jaxen tìm kiếm dom4j nó không thể tìm thấy nó. Tôi nghĩ rằng jaxen đã được tải từ dom4j không phải vì một lý do nào đó bên trong dom4j-full.jar nhưng một số khác mà bạn có trong classpath máy chủ ứng dụng của bạn (và không có trong nhật thực của khóa học), có lẽ được tải từ một trình nạp lớp khác. Có thể bạn có một số jaxen.jar trong thư viện được chia sẻ của mình hoặc một cái gì đó tương tự.

+2

cảm ơn javanna. đó là vấn đề. tôi đang sử dụng weblogic. Jaxen là một phần của Classlog hệ thống weblogic, vì vậy nó không thấy các lọ của tôi. Tôi đã xác định tùy chọn lớp PREFER WEB INF trong weblogic.xml cho tệp WAR của tôi. Bằng cách này tôi đảm bảo rằng dom4j-full.jar được tải cho dom4j và jaxen. – sa9689

+0

Vui vì bạn đã giải quyết! Tôi nghĩ bạn đang làm việc với Tomcat. – javanna

3

Stacktrace nêu rõ rằng các lớp org.dom4j khác hiện diện và đang được sử dụng. Vì vậy, có vẻ như bạn có xung đột phiên bản thư viện.

phiên bản dom4j và jaxen phải tương thích với nhau.

So sánh các phiên bản của chúng với các phiên bản hoạt động tốt ở chế độ độc lập.

+0

rất có thể. 'NoClassDefFound' có thể là một bitch để theo dõi – jere

+0

@ Vadzim, tôi đã sử dụng cùng một jar trong ứng dụng độc lập và web (dom4j-full.jar). tôi nghĩ rằng nó có thể là vấn đề bộ nạp lớp nhưng tôi không chắc chắn. – sa9689

+0

Jaxen có giống nhau không? Nếu có, hãy xem bình luận của Jon Skeet. Kiểm tra xem cả hai lọ đều ở cùng một chỗ và không có đôi. – Vadzim

Các vấn đề liên quan