2011-09-18 113 views
5

我和朋友正在使用Java SDK在App Engine中进行游戏。我们有 汇总了一个“你好,世界”的例子,没有问题;然而,当我们 尝试添加代码com.google.api.client.http使用 类,可以到WebService一个简单的通话,我们的代码编译罚款,但 导致运行时错误:使用Google App Engine for Java的ClassNotFoundException

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) 

(...切)

有问题的代码是:

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

我们最好的猜测是构建类路径和 运行时类路径,但我们的运行时类路径之间的差异似乎是确定的。该 HttpTransport类是在谷歌的API客户端-1.4.1-beta.jar 库,而这包含在命令行Eclipse是产生 运行项目:

/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 

有没有人遇到这个问题之前还是没有人有我们应该做的调试 建议?我确定这很简单,可能是一个配置问题,但作为新手,我们不知道除了classpath之外还需要看什么。

+0

直接您需要打包在你的web应用中的一些API罐子? –

+0

JAR位于类路径中 - 是否还有其他需要我们处理的内容,以便根据需要打包它们? – Arkaaito

+0

可能需要将jar文件复制到WEB-INF/lib文件夹中。你在使用Maven,还是只是手动下载了罐子? –

回答

5

在您WEB-INF/lib目录,你有一些子目录google-api-java-client-1.4.1-betagoogle-api-java-client-1.4.1-beta/dependencies用罐子那些子目录中,应该是内WEB-INF/lib

+0

哎唷!那么,我*确实认为这个问题会非常简单。我只是没有意识到这很简单。谢谢! – Arkaaito

+0

@Arkaaito您似乎将运行应用引擎所需的配置与运行您的应用的应用引擎混淆在一起。类路径是让应用程序引擎运行,并且不需要任何特定于您的应用程序的东西。设置应用程序对其所有依赖项的访问权限与标准servlet一样。 –