2011-11-27 18 views
17

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ó.

Respuesta

21

Estás en el camino correcto.Dado que la aplicación cuando se implementa en appengine se empaqueta como una guerra (archivo de aplicación web), los archivos jar de la biblioteca deben estar en WEB-INF/lib. Debes asegurarte de que tus jarras estén allí y luego agregar esos frascos a tu camino de construcción de eclipse. Intente realizar una operación "limpia" en el proyecto y vuelva a generarlo para asegurarse de que las bibliotecas estén en el paquete.

+0

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? –

+1

¿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 :) –

+0

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. –

4

esta solución que:

  • fuente de la copia (archivo .jar) en la guerra/lib WEB-INF/
2

Aún hay que añadir los archivos jar a la vía java acumulación de ¡evite los errores de compilación después de agregar los archivos a la carpeta war/WEB-INF/lib!

1

Copie y pegue los archivos .jar en guerra/WEB-INF/lib y luego vaya a Propiedades (del proyecto en Eclipse) -> Ruta de compilación Java -> Agregar JAR -> Seleccione los .jar relacionados de el proyecto actual. ¡Deberías estar todo listo!

0

Podría ser "un poco" demasiado tarde para esto, pero en eclipse no tiene que copiar manualmente. Haga clic con el botón derecho en proyecto -> Ruta de acceso de compilación -> Configurar ruta de compilación ... -> seleccione Conjunto de despliegue (a la izquierda). Agregue sus jarras aquí y se incluirán en la implementación.

Cuestiones relacionadas