2011-09-18 20 views
5

Un amico e io ci stiamo dilettando in App Engine utilizzando l'SDK Java. Abbiamo messo insieme un esempio "Ciao, Mondo" senza problemi; tuttavia, quando cerchiamo di aggiungere il codice per effettuare una semplice chiamata ad un webservice utilizzando i classi com.google.api.client.http, nostro codice compila bene, ma causa un errore di runtime:ClassNotFoundException utilizzando Google App Engine per 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) 

(... cut)

il codice in questione è:

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

la nostra migliore ipotesi era una discrepanza tra il classpath accumulo e il classpath fase di esecuzione, ma il nostro percorso di classe runtime sembra essere OK. Il HttpTransport classe è nel google-api-client-1.4.1-beta.jar biblioteca e che è incluso nella riga di comando Eclipse sta generando per eseguire il progetto:

/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 

Chiunque ha funzionato in questo problema prima o qualcuno ha suggerimenti su cosa dovremmo fare per eseguire il debug? Sono sicuro che sia qualcosa di semplice, probabilmente un problema di configurazione, ma come principianti non siamo sicuri di cosa guardare oltre i percorsi di classe.

+0

Avete bisogno di confezionare alcuni vasi API nel web app? –

+0

I JAR sono sul classpath - c'è qualcos'altro che devo fare con loro per averli impacchettati come necessario? – Arkaaito

+0

Potrebbe essere necessario copiare i vasi nella cartella WEB-INF/lib. Stai usando Maven, o hai appena scaricato i vasi manualmente? –

risposta

5

all'interno della directory WEB-INF/lib, avete alcune sottodirectory google-api-java-client-1.4.1-beta e google-api-java-client-1.4.1-beta/dependencies con barattoli in quelle sottodirectory che dovrebbero essere direttamente all'interno WEB-INF/lib

+0

Ouch! Bene, ho * pensato * che il problema sarebbe stato dolorosamente semplice. Semplicemente non mi rendevo conto che era abbastanza dolorosamente semplice. Grazie! – Arkaaito

+0

@Arkaaito sembra confondere la configurazione richiesta per eseguire il motore dell'app, con il motore dell'app in esecuzione la tua app. Il percorso della classe è quello di avviare il motore dell'app e non dovrebbe richiedere nulla di specifico per la tua app. Impostare l'accesso dell'applicazione a tutte le sue dipendenze è come per un servlet standard. –