2012-01-25 35 views
5

Ben XMLtoXML.java adında bir sınıf var ve bujava.lang.NoClassDefFoundError: org/dom4j/Belge

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

kod bloğunun son satırı bir dom4j kullanır ... 's yöntemlerden biridir Document.i sınıf yolumda dom4j-full.jar var. Eğer bu sınıfı bağımsız olarak çalıştırıyorsam (Eclipse Java uygulaması olarak çalıştır) o zaman iyi çalışıyor. Bu sınıfı web sınıfımın bir parçası olarak eklediğimde ve sınıf yolumda dom4j-full.jar.
Aşağıdaki istisnalarım var.

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) 

Ben de eminim üzerinde sınıf dom4j kavanoz mevcut olduğunu. Sorunu hakkında herhangi bir fikri olan var mı?

+1

Peki, sınıf yolunuza dom4j-full.jar eklemeyi nasıl denediniz? Kulağa gerçekten geliyor * gibi bir şey yok - ya da en azından jaxen’e ulaşılamıyor. Sınıfında jaxen nerede? –

+0

[Sınıflandırıcım] 'ı (http://www.adarshr.com/papers/classfinder) kullanarak hangi kavanozun belirli bir sınıfı içerdiğini araştırın. – adarshr

+0

@JonSkeet Dom4j, stacktrace'e bakarsanız başlangıçta orada görünüyor, ancak jaxen 'Document' sınıfını ararken aday. Bu tuhaf! – javanna

cevap

4

dom4j-full.jar, dom4j ve jaxen öğelerini içerir. Sizden kaynaklanıyor dom4j sınıf yolunda ve jaxen bulabilirsiniz, ancak jaxendom4j görünüyorsa bulamıyor. dom4j'dan yüklenen jaxen, dom4j-full.jar'un içinde bir tane, ancak uygulama sunucunuzun sınıf yolunda bulunan (ve tabii ki başka bir sınıf yükleyicinizde değil) bir başka sınıfın yüklenmesine neden olabilir. Belki paylaşılan kütüphanelerinizde jaxen.jar ya da bunun gibi bir şey var.

+2

teşekkürler javanna. Bu sorun. weblogic kullanıyorum. Jaxen, weblogic System Classpath'in bir parçası, bu yüzden kavanozlarımı görmüyor. WAR dosyam için weblogic.xml dosyasında PREFER WEB INF sınıflarını tanımladım. Bu şekilde dom4j-full.jar'ın dom4j ve jaxen için yüklenmesini sağladım. – sa9689

+0

Çözdüğüne sevindim! Tomcat ile çalıştığını sanıyordum. – javanna

3

StackTrace, diğer org.dom4j sınıflarının var olduğunu ve kullanıldığını açıkça belirtir. Yani kütüphane sürümü çakışması var gibi görünüyor.

dom4j ve jaxen sürümlerinin birbirleriyle uyumlu olması gerekir.

Sürümlerini, tek başına çalışan modda iyi çalışanlarla karşılaştırın.

+0

büyük olasılıkla. 'NoClassDefFound' – jere

+0

@ Vadzim aşağı izlemek için bir orospu olabilir, ben aynı kavanozda bağımsız ve web uygulaması (dom4j-full.jar) kullandım. Ben classloader sorun olabileceğini düşünüyorum ama emin değilim. – sa9689

+0

Jaxen de aynı mıdır? Öyleyse, Jon Skeet'in yorumuna bakın. Her iki kavanozun da aynı yerde olduğundan ve iki katının bulunmadığından emin olun. – Vadzim