2012-01-25 2 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 응용 프로그램으로 실행)으로 실행하면 잘 작동합니다. 이 클래스를 웹 응용 프로그램의 일부로 추가하고 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 항아리 존재하는 그. 누구든지 문제에 대한 아이디어가 있습니까?

+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.jardom4jjaxen을 모두 포함합니다. stacktrace에서 dom4j이 클래스 패스에 있음을 알고 jaxen을 찾을 수 있지만 jaxendom4j을 찾을 수 없습니다. dom4j에서로드 된 jaxen은 dom4j-full.jar 안에 하나의 이유가 있지만 다른 클래스 로더에서로드 된 응용 프로그램 서버 classpath (물론 일식은 아닙니다) 내에있는 것입니다. 어쩌면 당신은 공유 라이브러리에 이런 식으로 jaxen.jar을 가지고있을 것입니다.

+2

감사합니다 javanna. 그게 문제 야. 나는 weblogic을 사용하고 있습니다. Jaxen은 weblogic System Classpath의 일부이므로 내 항아리가 보이지 않습니다. 내 WAR 파일의 weblogic.xml에 PREFER WEB INF classes 옵션을 정의했습니다. 이 방법으로 dom4j-full.jar가 dom4j 및 jaxen에로드되도록했습니다. – sa9689

+0

다행 이네! 나는 네가 Tomcat과 일하고 있다고 생각했다. – javanna

3

stacktrace에는 분명히 다른 org.dom4j 클래스가 있고 사용되고 있다는 내용이 나와 있습니다. 그럼 라이브러리 버전이 충돌하는 것 같습니다.

dom4j 및 jaxen 버전은 서로 호환되어야합니다.

독립 실행 형 모드에서 작동하는 버전과 버전을 비교하십시오.

+0

입니다. 'NoClassDefFound'는 @ Vadzim의 – jere

+0

을 추적하기위한 계집이 될 수 있습니다. 독립 실행 형 웹 응용 프로그램 (dom4j-full.jar)에서 동일한 jar를 사용했습니다. 나는 그것이 클래스 로더 문제일지도 모른다라고 생각한다. 그러나 나는 확실하지 않다. – sa9689

+0

jaxen도 동일합니까? 그렇다면 Jon Skeet의 의견을 참조하십시오. 병 두 개가 같은 장소에 있고 복식이 없는지 확인하십시오. – Vadzim

관련 문제