2011-09-18 41 views
5

Un amigo y yo estamos incursionando en App Engine con el SDK de Java. Hemos juntos un ejemplo de "Hola, Mundo" sin problemas; sin embargo, cuando tratamos de agregar código para hacer una simple llamada a un servicio web utilizando los clases en com.google.api.client.http, nuestro código se compila bien, pero provoca un error de ejecución:ClassNotFoundException con Google App Engine para Java

HTTP ERROR 500 

Problem accessing /surreality. Reason: 

    com/google/api/client/http/HttpTransport 

Caused by: 

HTTP ERROR 500 

Problem accessing /surreality. Reason: 

    com/google/api/client/http/javanet/NetHttpTransport 

Caused by: 

java.lang.NoClassDefFoundError: com/google/api/client/http/javanet/ 
NetHttpTransport 
     at 
com.surreality.scratch.SurrealityServlet.performSearch(SurrealityServlet.java: 
31) 
     at 
com.surreality.scratch.SurrealityServlet.doGet(SurrealityServlet.java: 
18) 
     at javax.servlet.http.HttpServlet.service(HttpServlet.java:617) 
     at javax.servlet.http.HttpServlet.service(HttpServlet.java:717) 
     at org.mortbay.jetty.servlet.ServletHolder.handle(ServletHolder.java: 
511) 

(... corte)

el código en cuestión es:

package com.surreality.scratch; 

import java.io.IOException; 
import javax.servlet.http.*; 
import java.util.List; 
import com.google.api.client.googleapis.*; 
import com.google.api.client.http.*; 
import com.google.api.client.http.javanet.*; 
import com.google.api.client.util.Key; 

@SuppressWarnings("serial") 
public class SurrealityServlet extends HttpServlet { 

     public void doGet(HttpServletRequest req, HttpServletResponse resp) 
         throws IOException { 
       resp.setContentType("text/plain"); 
       try { 
         this.performSearch(resp); 
         resp.getWriter().println("Here..."); 
       } catch (Exception e) { 
         resp.getWriter().println("Onoes!"); 
       } 
     } 

     public void performSearch(HttpServletResponse resp) throws Exception 
{ 

       try { 
         resp.getWriter().println("Perform Search ...."); 
         resp.getWriter().println("-------------------"); 

         HttpTransport transport = new NetHttpTransport(); // This line 
causes our servlet to implode on every request 
       } catch (Exception e) { 
         resp.getWriter().println("failed"); 
         throw e; 
       } 
     } 
} 

nuestra mejor estimación fue una discrepancia entre la ruta de clase de construcción y la ruta de clase tiempo de ejecución, pero nuestra ruta de clases de tiempo de ejecución parece para estar bien. El HttpTransport clase está en el google-api-cliente-1.4.1-beta.jar biblioteca, y que se incluye en la línea de comandos Eclipse está generando para ejecutar el proyecto:

/System/Library/Java/JavaVirtualMachines/1.6.0.jdk/Contents/Home/bin/ 
java -Ddatastore.default_high_rep_job_policy_unapplied_job_pct=50 - 
Xmx512m -javaagent:/Applications/eclipse/plugins/ 
com.google.appengine.eclipse.sdkbundle_1.5.3.r37v201108301710/ 
appengine-java-sdk-1.5.3/lib/agent/appengine-agent.jar - 
XstartOnFirstThread -Xbootclasspath/p:/Applications/eclipse/plugins/ 
com.google.appengine.eclipse.sdkbundle_1.5.3.r37v201108301710/ 
appengine-java-sdk-1.5.3/lib/override/appengine-dev-jdk-overrides.jar - 
Dfile.encoding=MacRoman -classpath /Users/Arkaaito/Documents/AppEngine/ 
scratch/surreality/war/WEB-INF/classes:/Applications/eclipse/plugins/ 
com.google.appengine.eclipse.sdkbundle_1.5.3.r37v201108301710/ 
appengine-java-sdk-1.5.3/lib/shared/appengine-local-runtime- 
shared.jar:/Applications/eclipse/plugins/ 
com.google.appengine.eclipse.sdkbundle_1.5.3.r37v201108301710/ 
appengine-java-sdk-1.5.3/lib/shared/el-api.jar:/Applications/eclipse/ 
plugins/com.google.appengine.eclipse.sdkbundle_1.5.3.r37v201108301710/ 
appengine-java-sdk-1.5.3/lib/shared/jsp/repackaged-appengine- 
ant-1.7.1.jar:/Applications/eclipse/plugins/ 
com.google.appengine.eclipse.sdkbundle_1.5.3.r37v201108301710/ 
appengine-java-sdk-1.5.3/lib/shared/jsp/repackaged-appengine-ant- 
launcher-1.7.1.jar:/Applications/eclipse/plugins/ 
com.google.appengine.eclipse.sdkbundle_1.5.3.r37v201108301710/ 
appengine-java-sdk-1.5.3/lib/shared/jsp/repackaged-appengine- 
jasper-6.0.29.jar:/Applications/eclipse/plugins/ 
com.google.appengine.eclipse.sdkbundle_1.5.3.r37v201108301710/ 
appengine-java-sdk-1.5.3/lib/shared/jsp/repackaged-appengine-jasper- 
el-6.0.29.jar:/Applications/eclipse/plugins/ 
com.google.appengine.eclipse.sdkbundle_1.5.3.r37v201108301710/ 
appengine-java-sdk-1.5.3/lib/shared/jsp/repackaged-appengine-tomcat- 
juli-6.0.29.jar:/Applications/eclipse/plugins/ 
com.google.appengine.eclipse.sdkbundle_1.5.3.r37v201108301710/ 
appengine-java-sdk-1.5.3/lib/shared/jsp-api.jar:/Applications/eclipse/ 
plugins/com.google.appengine.eclipse.sdkbundle_1.5.3.r37v201108301710/ 
appengine-java-sdk-1.5.3/lib/shared/servlet-api.jar:/Applications/ 
eclipse/plugins/ 
com.google.appengine.eclipse.sdkbundle_1.5.3.r37v201108301710/ 
appengine-java-sdk-1.5.3/lib/user/appengine-api-1.0-sdk-1.5.3.jar:/ 
Applications/eclipse/plugins/ 
com.google.appengine.eclipse.sdkbundle_1.5.3.r37v201108301710/ 
appengine-java-sdk-1.5.3/lib/user/appengine-api-labs-1.5.3.jar:/ 
Applications/eclipse/plugins/ 
com.google.appengine.eclipse.sdkbundle_1.5.3.r37v201108301710/ 
appengine-java-sdk-1.5.3/lib/user/appengine-jsr107cache-1.5.3.jar:/ 
Applications/eclipse/plugins/ 
com.google.appengine.eclipse.sdkbundle_1.5.3.r37v201108301710/ 
appengine-java-sdk-1.5.3/lib/user/jsr107cache-1.1.jar:/Applications/ 
eclipse/plugins/ 
com.google.appengine.eclipse.sdkbundle_1.5.3.r37v201108301710/ 
appengine-java-sdk-1.5.3/lib/user/orm/datanucleus- 
appengine-1.0.9.final.jar:/Applications/eclipse/plugins/ 
com.google.appengine.eclipse.sdkbundle_1.5.3.r37v201108301710/ 
appengine-java-sdk-1.5.3/lib/user/orm/datanucleus-core-1.1.5.jar:/ 
Applications/eclipse/plugins/ 
com.google.appengine.eclipse.sdkbundle_1.5.3.r37v201108301710/ 
appengine-java-sdk-1.5.3/lib/user/orm/datanucleus-jpa-1.1.5.jar:/ 
Applications/eclipse/plugins/ 
com.google.appengine.eclipse.sdkbundle_1.5.3.r37v201108301710/ 
appengine-java-sdk-1.5.3/lib/user/orm/geronimo-jpa_3.0_spec-1.1.1.jar:/ 
Applications/eclipse/plugins/ 
com.google.appengine.eclipse.sdkbundle_1.5.3.r37v201108301710/ 
appengine-java-sdk-1.5.3/lib/user/orm/geronimo-jta_1.1_spec-1.1.1.jar:/ 
Applications/eclipse/plugins/ 
com.google.appengine.eclipse.sdkbundle_1.5.3.r37v201108301710/ 
appengine-java-sdk-1.5.3/lib/user/orm/jdo2-api-2.3-eb.jar:/ 
Applications/eclipse/plugins/ 
com.google.appengine.eclipse.sdkbundle_1.5.3.r37v201108301710/ 
appengine-java-sdk-1.5.3/lib/appengine-tools-api.jar:/Users/Arkaaito/ 
Documents/AppEngine/scratch/surreality/war/WEB-INF/lib/google-api-java- 
client-1.4.1-beta/dependencies/httpclient-4.0.3.jar:/Users/Arkaaito/ 
Documents/AppEngine/scratch/surreality/war/WEB-INF/lib/google-api-java- 
client-1.4.1-beta/dependencies/httpcore-4.0.1.jar:/Users/Arkaaito/ 
Documents/AppEngine/scratch/surreality/war/WEB-INF/lib/google-api-java- 
client-1.4.1-beta/google-api-client-1.4.1-beta.jar:/Users/Arkaaito/ 
Documents/AppEngine/scratch/surreality/war/WEB-INF/lib/google-api-java- 
client-1.4.1-beta/google-api-client-googleapis-1.4.1-beta.jar:/Users/ 
Arkaaito/Documents/AppEngine/scratch/surreality/war/WEB-INF/lib/google- 
api-java-client-1.4.1-beta/google-api-client-extensions-1.4.1- 
beta.jar:/Users/Arkaaito/Documents/AppEngine/scratch/surreality/war/ 
WEB-INF/lib/google-api-java-client-1.4.1-beta/google-api-client- 
googleapis-extensions-1.4.1-beta.jar:/Users/Arkaaito/Documents/ 
AppEngine/scratch/surreality/war/WEB-INF/lib/geronimo- 
jpa_3.0_spec-1.1.1.jar:/Users/Arkaaito/Documents/AppEngine/scratch/ 
surreality/war/WEB-INF/lib/geronimo-jta_1.1_spec-1.1.1.jar 
com.google.appengine.tools.development.DevAppServerMain --port=3333/
Users/Arkaaito/Documents/AppEngine/scratch/surreality/war 

Cualquier persona ha funcionado en este problema antes, o alguien tiene sugerencias sobre lo que deberíamos hacer para depurar? Estoy seguro de que es algo simple, probablemente un problema de configuración, pero como novatos no estamos seguros de qué mirar además de los classpaths.

+0

¿Es necesario empaquetar algunos frascos de API en su aplicación web? –

+0

Los JAR están en la ruta de clases. ¿Hay alguna otra cosa que deba hacer con ellos para que se empaqueten según sea necesario? – Arkaaito

+0

Puede ser necesario copiar las jarras en su carpeta WEB-INF/lib. ¿Estás usando Maven o simplemente descargaste los frascos manualmente? –

Respuesta

5

Dentro de su directorio WEB-INF/lib, tiene algunos subdirectorios google-api-java-client-1.4.1-beta y google-api-java-client-1.4.1-beta/dependencies con frascos de esos directorios que deben estar directamente dentro WEB-INF/lib

+0

¡Ay! Bueno, * pensé * que el problema sería algo dolorosamente simple. Simplemente no me di cuenta de que era tan dolorosamente simple. ¡Gracias! – Arkaaito

+0

@Arkaaito parece que confunde la configuración requerida para ejecutar el motor de la aplicación, con el motor de la aplicación ejecutándola. La ruta de clase es para que el motor de la aplicación se ejecute, y no debería necesitar nada específico para tu aplicación. Configurar el acceso de su aplicación a todas sus dependencias es como un servlet estándar. –