He estado buscando una solución para este problema durante varias horas hoy y muchas horas ayer, así que decidí abordarlo aquí, aunque parece un problema estúpido.Incluyendo archivos JAR en el proyecto Eclipse (App Engine)
Situación: Tengo una configuración de proyecto de Google AppEngine en Eclipse Java EE. Está disponible durante varias semanas, todo funciona bien, puedo implementar en App Engine y probar en Eclipse sin problemas.
Ahora necesito agregar paquetes JAR para f.e. Soporte JSON y API de visualización de Google. Intenté JSON hace una semana y como falló, acabo de descargar los archivos fuente y los agregué a mi propia fuente. Pero ahora con las Visualizaciones, son demasiados archivos fuente, así que necesito que los JAR funcionen.
Lo que hice:
- descargado los archivos JAR.
- los puso en una carpeta PROJECT/lib.
- los seleccionó, hizo clic con el botón derecho y presionó Construir ruta> Agregar a la ruta de compilación.
Lo que pasó: Todo salió bien, pude importar las clases y crear subclases de ellas sin tener errores. Así que está claro que Eclipse reconoció la existencia de las clases y Eclipse las importó con éxito.
Luego trató de construirlo (modo de depuración) y tiene error de seguimiento (la que me dieron con JSON también):
Nov 27, 2011 11:57:48 AM com.google.apphosting.utils.jetty.JettyLogger warn
WARNING: failed chartDataServlet: java.lang.NoClassDefFoundError: com/google/visualization/datasource/DataSourceServlet
Nov 27, 2011 11:57:48 AM com.google.apphosting.utils.jetty.JettyLogger warn
WARNING: failed c[email protected]727db937{/,/Volumes/Data/eclipse_workspace/kulStats/war}: java.lang.NoClassDefFoundError: com/google/visualization/datasource/DataSourceServlet
Nov 27, 2011 11:57:48 AM com.google.apphosting.utils.jetty.JettyLogger warn
WARNING: failed [email protected]: java.lang.NoClassDefFoundError: com/google/visualization/datasource/DataSourceServlet
Nov 27, 2011 11:57:48 AM com.google.apphosting.utils.jetty.JettyLogger warn
WARNING: Error starting handlers
java.lang.NoClassDefFoundError: com/google/visualization/datasource/DataSourceServlet
at java.lang.ClassLoader.defineClass1(Native Method)
at java.lang.ClassLoader.defineClassCond(ClassLoader.java:631)
at java.lang.ClassLoader.defineClass(ClassLoader.java:615)
at java.security.SecureClassLoader.defineClass(SecureClassLoader.java:141)
at java.net.URLClassLoader.defineClass(URLClassLoader.java:283)
at java.net.URLClassLoader.access$000(URLClassLoader.java:58)
at java.net.URLClassLoader$1.run(URLClassLoader.java:197)
at java.security.AccessController.doPrivileged(Native Method)
at java.net.URLClassLoader.findClass(URLClassLoader.java:190)
at java.lang.ClassLoader.loadClass(ClassLoader.java:306)
at com.google.appengine.tools.development.IsolatedAppClassLoader.loadClass(IsolatedAppClassLoader.java:176)
at java.lang.ClassLoader.loadClass(ClassLoader.java:247)
at org.mortbay.util.Loader.loadClass(Loader.java:91)
at org.mortbay.util.Loader.loadClass(Loader.java:71)
at org.mortbay.jetty.servlet.Holder.doStart(Holder.java:73)
at org.mortbay.jetty.servlet.ServletHolder.doStart(ServletHolder.java:242)
at org.mortbay.component.AbstractLifeCycle.start(AbstractLifeCycle.java:50)
at org.mortbay.jetty.servlet.ServletHandler.initialize(ServletHandler.java:685)
at org.mortbay.jetty.servlet.Context.startContext(Context.java:140)
at org.mortbay.jetty.webapp.WebAppContext.startContext(WebAppContext.java:1250)
at org.mortbay.jetty.handler.ContextHandler.doStart(ContextHandler.java:517)
at org.mortbay.jetty.webapp.WebAppContext.doStart(WebAppContext.java:467)
at org.mortbay.component.AbstractLifeCycle.start(AbstractLifeCycle.java:50)
at org.mortbay.jetty.handler.HandlerWrapper.doStart(HandlerWrapper.java:130)
at org.mortbay.component.AbstractLifeCycle.start(AbstractLifeCycle.java:50)
at org.mortbay.jetty.handler.HandlerWrapper.doStart(HandlerWrapper.java:130)
at org.mortbay.jetty.Server.doStart(Server.java:224)
at org.mortbay.component.AbstractLifeCycle.start(AbstractLifeCycle.java:50)
at com.google.appengine.tools.development.JettyContainerService.startContainer(JettyContainerService.java:191)
at com.google.appengine.tools.development.AbstractContainerService.startup(AbstractContainerService.java:239)
at com.google.appengine.tools.development.DevAppServerImpl.start(DevAppServerImpl.java:146)
at com.google.appengine.tools.development.DevAppServerMain$StartAction.apply(DevAppServerMain.java:164)
at com.google.appengine.tools.util.Parser$ParseResult.applyArgs(Parser.java:48)
at com.google.appengine.tools.development.DevAppServerMain.<init>(DevAppServerMain.java:113)
at com.google.appengine.tools.development.DevAppServerMain.main(DevAppServerMain.java:89)
Caused by: java.lang.ClassNotFoundException: com.google.visualization.datasource.DataSourceServlet
at java.net.URLClassLoader$1.run(URLClassLoader.java:202)
at java.security.AccessController.doPrivileged(Native Method)
at java.net.URLClassLoader.findClass(URLClassLoader.java:190)
at java.lang.ClassLoader.loadClass(ClassLoader.java:306)
at com.google.appengine.tools.development.IsolatedAppClassLoader.loadClass(IsolatedAppClassLoader.java:176)
at java.lang.ClassLoader.loadClass(ClassLoader.java:247)
... 35 more
no sé si el hecho de que se imprime la clase con cortado en lugar de con puntos es parte del problema: com/google/visualization/datasource/DataSourceServlet
. En la segunda parte él usa puntos.
Busqué un problema por mucho tiempo y escuché cosas sobre el archivo classpath. Mi archivo .classpath se ve así:
<?xml version="1.0" encoding="UTF-8"?>
<classpath>
<classpathentry kind="src" path="src"/>
<classpathentry kind="src" output="test-classes" path="test"/>
<classpathentry kind="con" path="com.google.appengine.eclipse.core.GAE_CONTAINER"/>
<classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER"/>
<classpathentry kind="con" path="com.google.appengine.eclipse.core.GAE_CONTAINER/App Engine (1)"/>
<classpathentry kind="lib" path="war/WEB-INF/lib/chart-datasource/lib/commons-lang-2.4.jar"/>
<classpathentry kind="lib" path="war/WEB-INF/lib/chart-datasource/lib/commons-logging-1.1.1.jar"/>
<classpathentry kind="lib" path="war/WEB-INF/lib/chart-datasource/lib/opencsv-1.8.jar"/>
<classpathentry kind="lib" path="war/WEB-INF/lib/chart-datasource/visualization-datasource-1.1.1.jar"/>
<classpathentry kind="output" path="war/WEB-INF/classes"/>
</classpath>
Sólo el war/WEB-INF/classes
no existe ..
Ay, otra cosa: He encontrado documentos sobre App Engine específicamente y que a veces se mencionó la carpeta war/WEB-INF/lib
, así que probé poniéndolo allí también. Por supuesto, después de eliminar de la ruta de compilación y de leer después del movimiento. (Es la versión del archivo classpath que he pegado).
¿Alguien tiene una idea de cómo se puede resolver esto? Resumen: Eclipse reconoce los JAR importados, pero generación falla por alguna razón ...
EDIT: solución encontré la siguiente:
- JAR deben estar en WEB-INF/lib
- Los JAR no deben estar en carpetas dentro de lib, todo en la carpeta raíz WEB-INF/lib. Tenía el mío en una carpeta separada y eso no funcionó.
- Lo hice Origen> Limpieza y origen> Administrar las importaciones y funcionó.
Operación limpia? ¿Cómo puedo hacer eso? Soy relativamente nuevo en Eclipse en realidad. ¿Y construir? Cuando hago clic en el botón de depuración o ejecución, el proyecto se vuelve a generar, ¿no? –
¿Puedo actualizar la publicación en alguna parte con la solución? Encontré lo siguiente: - Los archivos JAR deberían estar en WEB-INF/lib - Los JAR no deberían estar en carpetas dentro de lib, todo en la carpeta raíz WEB-INF/lib. Tenía el mío en una carpeta separada y eso no funcionó. - Lo hice Source> Clean Up y Source> Manage imports y funcionó después :) –
A veces eclipse no puede copiar los jars especificados en la ruta de compilación a la carpeta WEB-INF/lib. en mi caso, las entradas de la biblioteca bajo pedido y la pestaña exportar de la configuración de la ruta de compilación quedan sin marcar (no sé por qué), así que solo las revisé todas y resolvió el problema. –