2009-05-13 10 views
6

J'écris une application Web dans Eclipse et j'utilise la bibliothèque de sérialisation XStream pour générer mon JSON.Sous Tomcat java.lang.NoClassDefFoundError lors de l'accès à une servlet?

J'ai encapsulé le code qui construit le JSON dans une classe qui est appelée par mon servelet. Puis la classe encapsulée a une méthode principale pour tester et quand je la lance, tout semble fonctionner correctement.

Cependant, lorsque j'utilise l'appel de la classe de mon servelet, j'obtiens une erreur java.lang.NoClassDefFoundError, indiquant que je n'ai pas chargé les bibliothèques XStream. Je suppose que mon chemin de construction est erroné, mais j'ai défini les bibliothèques XStream comme étant dans le chemin de construction du projet, donc pour autant que je sache, cela devrait fonctionner.

Qu'est-ce qui risque de ne pas fonctionner ici?

Suite est l'exception exacte:

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) 

Et voici le code relavant qui utilise la classe xstream:

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

Je souligne que ce code fonctionne bien lorsqu'il est exécuté comme une application java, Je suis sûr que c'est quelque chose à voir avec le chargement des bibliothèques, je ne sais pas où je me suis trompé.

+0

Le package se trouve-t-il dans le dossier WEB-INF/lib de votre fichier WAR? –

Répondre

10

Je trouve la question:

Si vous faites un clic droit sur le projet et sélectionner les propriétés que vous pouvez définir les « dépendances Java EE Module » pour inclure les modules que vous utilisez.

Hey Presto ça marche.

+8

Bon travail. Ce qui se passe dans les coulisses est que cette dépendance indique au compilateur de placer ces bibliothèques dans le répertoire WEB-INF/lib de votre déploiement (probablement un fichier WAR).

Lorsque l'application est chargée sur le serveur d'applications - ce chemin est inclus par défaut dans le chemin de classe de l'application Web et votre application peut désormais "voir" ces bibliothèques de classes. – Vinnie

+5

Notez que cette fonctionnalité est maintenant appelée "Deployment Assembly" voir http://stackoverflow.com/questions/3365369/java-ee-module-dependencies-in-web-project – GuiSim

11

Ne pas oublier qu'il ya une différence entre la façon dont vous construire et comment vous déployer. C'est-à-dire que vous construisez peut-être contre XStream, mais vous devez également le mettre en package dans le fichier .war pour le déploiement.

Éclatez votre fichier .war résultant (jar tvf {filename} pour voir le contenu) et vérifiez s'il est là (un fichier .jar sous WEB-INF/lib). Je soupçonne que non.

0

Une erreur facile à faire est de pseudo le répertoire sous WEB_INF, je l'ai nommé libs au lieu de lib, compile bien mais tomcat renvoie des erreurs.

7

Java EE Module Dépendances semblent être la voie à suivre. Cependant, les noms de menus ont changé dans Eclipse Helios: ce menu particulier est maintenant sous "Deployment Assembly".

Questions connexes