2009-05-13 13 views
6

Estoy escribiendo una aplicación web en Eclipse, y estoy usando la Biblioteca de serialización XStream para generar My JSON.En Tomcat java.lang.NoClassDefFoundError al acceder a un servlet?

He encapsulado el código que crea el JSON en una clase a la que llama mi servelet. Entonces la clase encapsulada tiene un método principal para probar y cuando lo ejecuto, todo parece funcionar bien.

Sin embargo, cuando uso la llamada a la clase de mi servidor, recibo un error java.lang.NoClassDefFoundError, diciendo que no he cargado las bibliotecas XStream. Supongo que tengo mi ruta de compilación incorrecta, pero he establecido las bibliotecas XStream para que estén en la ruta de compilación para el proyecto, por lo que sé que debería funcionar.

¿Qué es probable que salga mal aquí?

que sigue es la excepción exacta:

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) 

Y aquí es el código relavant que utiliza la clase 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); 

hago hincapié en que este código funciona bien cuando se ejecuta como una aplicación Java, Estoy seguro de que tiene algo que ver con cargar las bibliotecas, simplemente no sé dónde me he equivocado.

+0

¿El paquete está en la carpeta WEB-INF/lib de su WAR? –

Respuesta

10

me encontré con el tema:

Si hace clic derecho sobre el proyecto y seleccionar propiedades que se pueden establecer las "dependencias del módulo Java EE" para incluir los módulos que está utilizando.

Hey Presto funciona.

+8

Buen trabajo. Lo que sucede detrás de escena es que esta dependencia le dice al compilador que coloque estas bibliotecas en el directorio WEB-INF/lib de su implementación (probablemente un archivo WAR).

Cuando la aplicación se carga en el servidor de la aplicación, esta ruta está incluida por defecto en el classpath de la aplicación web y su aplicación ahora puede "ver" estas bibliotecas de clases. – Vinnie

+5

Tenga en cuenta que esta característica ahora se llama "Ensamblaje de implementación", consulte http://stackoverflow.com/questions/3365369/java-ee-module-dependencies-in-web-project – GuiSim

11

No olvide que hay una diferencia entre cómo construye y cómo implementa. Es decir, puede estar generando contra XStream, pero también debe empaquetarlo en el archivo .war para su implementación.

Explote su archivo resultante .war (jar tvf {filename} para ver el contenido) y verifique si está allí (un archivo .jar en WEB-INF/lib). Sospecho que no es así.

0

Un error fácil de hacer es nombrar incorrectamente el directorio en WEB_INF, lo he llamado libs en lugar de lib, compila bien pero tomcat arroja errores.

7

Dependencias del módulo Java EE parecen ser el camino a seguir. Sin embargo, los nombres de los menús han cambiado en Eclipse Helios: ese menú particular se encuentra ahora en "Implementación de ensamblaje".

Cuestiones relacionadas