2009-05-13 2 views
6

Ich schreibe eine Webanwendung in Eclipse und benutze die XStream Serialization Library, um My JSON zu generieren.Unter Tomcat java.lang.NoClassDefFoundError beim Zugriff auf ein Servlet?

Ich habe den Code gekapselt, der den JSON in einer Klasse aufbaut, die von meinem Servelet aufgerufen wird. Dann hat gekapselte Klasse eine Hauptmethode zum Testen, und wenn ich es ausführe, scheint alles in Ordnung zu sein.

Allerdings, wenn ich den Aufruf der Klasse von meinem Servlet verwende, bekomme ich eine java.lang.NoClassDefFoundError Fehler, sagend, dass ich die XStream-Bibliotheken nicht geladen habe. Ich nehme an, dass mein Build-Pfad falsch ist, aber ich habe die XStream-Bibliotheken so eingestellt, dass sie sich im Build-Pfad für das Projekt befinden. Soweit ich weiß, sollte das funktionieren.

Was wird hier wahrscheinlich schiefgehen?

Nach der genaue Ausnahme ist:

java.lang.ClassNotFoundException: com.thoughtworks.xstream.io.HierarchicalStreamDriver 
    at org.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1387) 
    at org.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1233) 
    at java.lang.ClassLoader.loadClassInternal(ClassLoader.java:320) 
    at SecurePaymentAjaxData.doPost(SecurePaymentAjaxData.java:44) 
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:637) 
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:717) 
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:290) 
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206) 
    at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:233) 
    at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:191) 
    at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:128) 
    at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:102) 
    at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109) 
    at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:286) 
    at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:845) 
    at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:583) 
    at org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:447) 
    at java.lang.Thread.run(Thread.java:619) 

Und hier ist der relavant Code, der die xstream Klasse verwendet:

XStream xstream = new XStream(new JettisonMappedXmlDriver()); 
xstream.setMode(XStream.NO_REFERENCES); 
xstream.alias("CallDataUpdate", CallDataUpdate.class); 
xstream.alias("CardStatus", CardStatus.class); 
String jsonData = xstream.toXML(updateData); 

ich betonen, dass dieser Code funktioniert gut, wenn es als Java-Anwendung ausführen, Ich bin mir sicher, dass es etwas mit dem Laden der Bibliotheken zu tun hat, ich weiß einfach nicht, wo ich falsch gelaufen bin.

+0

Ist das Paket im WEB-INF/lib-Ordner Ihres WAR? –

Antwort

10

fand ich die Frage:

Wenn Sie rechts auf das Projekt klicken, und wählen Sie Eigenschaften, um die „Java EE-Modul Abhängigkeiten“ einstellen, um die Module umfassen Sie verwenden.

Hey Presto es funktioniert.

+8

Gute Arbeit. Was hinter den Kulissen passiert, ist, dass diese Abhängigkeit den Compiler anweist, diese Bibliotheken in das Verzeichnis WEB-INF/lib Ihrer Implementierung zu platzieren (wahrscheinlich eine WAR-Datei).

Wenn die Anwendung auf dem Anwendungsserver geladen wird - dieser Pfad ist standardmäßig im Klassenpfad der Webanwendung enthalten und Ihre Anwendung kann diese Klassenbibliotheken nun "sehen". – Vinnie

+5

Beachten Sie, dass diese Funktion nun "Deployment Assembly" genannt wird, siehe http://stackoverflow.com/questions/3365369/java-ee-module-dependencies-in-web-project – GuiSim

11

Vergessen Sie nicht, dass es einen Unterschied gibt zwischen dem, wie Sie bauen und wie Sie bereitstellen. Das heißt, Sie erstellen möglicherweise gegen XStream, aber Sie sollten es auch in der WAR-Datei für die Bereitstellung verpacken.

Explodieren Sie Ihre resultierende WAR-Datei (jar tvf {filename}, um den Inhalt zu sehen) und überprüfen Sie, ob es da ist (eine .jar-Datei unter WEB-INF/lib). Ich vermute es ist nicht.

0

Ein einfacher Fehler zu machen ist, das Verzeichnis unter WEB_INF falsch zu nennen, ich habe es libs anstelle von lib benannt, kompiliert gut, aber tomcat wirft Fehler.

7

Java EE Module Abhängigkeiten scheinen der richtige Weg zu sein. Die Menüsamen wurden jedoch in Eclipse Helios geändert: Dieses bestimmte Menü befindet sich jetzt unter "Deployment Assembly".