2012-07-25 61 views
1

我是整個Google代碼的新手。GWT,Google Code和App Engine的新手

所以我的問題是以下。

已經下載了eclipse的Google Plugin,我已經創建了一個新的Project,它自動創建了一個示例代碼,即Greeting Example。

因此,我將它部署到應用程序引擎中,一切正常。所以現在我正在嘗試添加一些功能。通過eclipse,我下載了Google Contacts API,並將Jars傳輸到類路徑以及LIB目錄中。

因此,該項目的服務器端,文件GreetingServiceImpl.java我加入以下行

 ContactsService contactsService = new ContactsService("Contacts"); 

所以文件看起來像這樣..

package com.gnt.server; 

import com.gnt.client.GreetingService; 
import com.gnt.shared.FieldVerifier; 
import com.google.gdata.client.contacts.ContactsService; 
import com.google.gwt.user.server.rpc.RemoteServiceServlet; 

/** 
* The server side implementation of the RPC service. 
*/ 
@SuppressWarnings("serial") 
public class GreetingServiceImpl extends RemoteServiceServlet implements 
     GreetingService { 

    public String greetServer(String input) throws IllegalArgumentException { 
     // Verify that the input is valid. 
     if (!FieldVerifier.isValidName(input)) { 
      // If the input is not valid, throw an IllegalArgumentException back to 
      // the client. 
      throw new IllegalArgumentException(
        "Name must be at least 4 characters long"); 
     } 

     String serverInfo = getServletContext().getServerInfo(); 
     String userAgent = getThreadLocalRequest().getHeader("User-Agent"); 

     // Escape data from the client to avoid cross-site script vulnerabilities. 
     input = escapeHtml(input); 
     userAgent = escapeHtml(userAgent); 
      ContactsService contactsService = new ContactsService("Contacts"); 
     return "Hello, " + input + "!<br><br>I am running " + serverInfo 
       + ".<br><br>It looks like you are using:<br>" + userAgent; 
    } 

    /** 
    * Escape an html string. Escaping data received from the client helps to 
    * prevent cross-site script vulnerabilities. 
    * 
    * @param html the html string to escape 
    * @return the escaped string 
    */ 
    private String escapeHtml(String html) { 
     if (html == null) { 
      return null; 
     } 
     return html.replaceAll("&", "&amp;").replaceAll("<", "&lt;") 
       .replaceAll(">", "&gt;"); 
    } 
} 

現在,當我將此部署到App Engine,我得到以下錯誤。

javax.servlet.ServletContext log: Exception while dispatching incoming RPC call 
com.google.gwt.user.server.rpc.UnexpectedException: Service method 'public abstract java.lang.String com.gnt.client.GreetingService.greetServer(java.lang.String) throws java.lang.IllegalArgumentException' threw an unexpected exception: java.lang.NoClassDefFoundError: com/google/gdata/client/GoogleService 
    at com.google.gwt.user.server.rpc.RPC.encodeResponseForFailure(RPC.java:385) 
    at com.google.gwt.user.server.rpc.RPC.invokeAndEncodeResponse(RPC.java:588) 
    at com.google.gwt.user.server.rpc.RemoteServiceServlet.processCall(RemoteServiceServlet.java:208) 
    at com.google.gwt.user.server.rpc.RemoteServiceServlet.processPost(RemoteServiceServlet.java:248) 
    at com.google.gwt.user.server.rpc.AbstractRemoteServiceServlet.doPost(AbstractRemoteServiceServlet.java:62) 
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:637) 
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:717) 
    at org.mortbay.jetty.servlet.ServletHolder.handle(ServletHolder.java:511) 
    at org.mortbay.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1166) 
    at com.google.apphosting.utils.servlet.ParseBlobUploadFilter.doFilter(ParseBlobUploadFilter.java:102) 
    at org.mortbay.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1157) 
    at com.google.apphosting.runtime.jetty.SaveSessionFilter.doFilter(SaveSessionFilter.java:35) 
    at org.mortbay.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1157) 
    at com.google.apphosting.utils.servlet.TransactionCleanupFilter.doFilter(TransactionCleanupFilter.java:43) 
    at org.mortbay.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1157) 
    at org.mortbay.jetty.servlet.ServletHandler.handle(ServletHandler.java:388) 
    at org.mortbay.jetty.security.SecurityHandler.handle(SecurityHandler.java:216) 
    at org.mortbay.jetty.servlet.SessionHandler.handle(SessionHandler.java:182) 
    at org.mortbay.jetty.handler.ContextHandler.handle(ContextHandler.java:765) 
    at org.mortbay.jetty.webapp.WebAppContext.handle(WebAppContext.java:418) 
    at com.google.apphosting.runtime.jetty.AppVersionHandlerMap.handle(AppVersionHandlerMap.java:249) 
    at org.mortbay.jetty.handler.HandlerWrapper.handle(HandlerWrapper.java:152) 
    at org.mortbay.jetty.Server.handle(Server.java:326) 
    at org.mortbay.jetty.HttpConnection.handleRequest(HttpConnection.java:542) 
    at org.mortbay.jetty.HttpConnection$RequestHandler.headerComplete(HttpConnection.java:923) 
    at com.google.apphosting.runtime.jetty.RpcRequestParser.parseAvailable(RpcRequestParser.java:76) 
    at org.mortbay.jetty.HttpConnection.handle(HttpConnection.java:404) 
    at com.google.apphosting.runtime.jetty.JettyServletEngineAdapter.serviceRequest(JettyServletEngineAdapter.java:135) 
    at com.google.apphosting.runtime.JavaRuntime$RequestRunnable.run(JavaRuntime.java:477) 
    at com.google.tracing.TraceContext$TraceContextRunnable.runInContext(TraceContext.java:449) 
    at com.google.tracing.TraceContext$TraceContextRunnable$1.run(TraceContext.java:455) 
    at com.google.tracing.TraceContext.runInContext(TraceContext.java:695) 
    at com.google.tracing.TraceContext$AbstractTraceContextCallback.runInInheritedContextNoUnref(TraceContext.java:333) 
    at com.google.tracing.TraceContext$AbstractTraceContextCallback.runInInheritedContext(TraceContext.java:325) 
    at com.google.tracing.TraceContext$TraceContextRunnable.run(TraceContext.java:453) 
    at com.google.apphosting.runtime.ThreadGroupPool$PoolEntry.run(ThreadGroupPool.java:251) 
    at java.lang.Thread.run(Thread.java:679) 
Caused by: java.lang.NoClassDefFoundError: com/google/gdata/client/GoogleService 
    at com.google.appengine.runtime.Request.process-ff033622b2cd8d3f(Request.java) 
    at java.lang.ClassLoader.defineClass1(Native Method) 
    at java.lang.ClassLoader.defineClass(ClassLoader.java:634) 
    at java.security.SecureClassLoader.defineClass(SecureClassLoader.java:142) 
    at java.net.URLClassLoader.defineClass(URLClassLoader.java:277) 
    at sun.reflect.GeneratedMethodAccessor5.invoke(Unknown Source) 
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) 
    at java.lang.reflect.Method.invoke(Method.java:616) 
    at java.lang.ClassLoader.loadClass(ClassLoader.java:266) 
    at com.gnt.server.GreetingServiceImpl.greetServer(GreetingServiceImpl.java:32) 
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57) 
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) 
    at java.lang.reflect.Method.invoke(Method.java:43) 
    at com.google.gwt.user.server.rpc.RPC.invokeAndEncodeResponse(RPC.java:569) 
    at com.google.gwt.user.server.rpc.RemoteServiceServlet.processCall(RemoteServiceServlet.java:208) 
    at com.google.gwt.user.server.rpc.RemoteServiceServlet.processPost(RemoteServiceServlet.java:248) 
    at com.google.gwt.user.server.rpc.AbstractRemoteServiceServlet.doPost(AbstractRemoteServiceServlet.java:62) 
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:637) 
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:717) 
    at org.mortbay.jetty.servlet.ServletHolder.handle(ServletHolder.java:511) 
    at org.mortbay.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1166) 
    at org.mortbay.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1157) 
    at org.mortbay.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1157) 
    at org.mortbay.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1157) 
    at org.mortbay.jetty.servlet.ServletHandler.handle(ServletHandler.java:388) 
    at org.mortbay.jetty.security.SecurityHandler.handle(SecurityHandler.java:216) 
    at org.mortbay.jetty.servlet.SessionHandler.handle(SessionHandler.java:182) 
    at org.mortbay.jetty.handler.ContextHandler.handle(ContextHandler.java:765) 
    at org.mortbay.jetty.webapp.WebAppContext.handle(WebAppContext.java:418) 
    at org.mortbay.jetty.handler.HandlerWrapper.handle(HandlerWrapper.java:152) 
    at org.mortbay.jetty.Server.handle(Server.java:326) 
    at org.mortbay.jetty.HttpConnection.handleRequest(HttpConnection.java:542) 
    at org.mortbay.jetty.HttpConnection$RequestHandler.headerComplete(HttpConnection.java:923) 
    at org.mortbay.jetty.HttpConnection.handle(HttpConnection.java:404) 
    at com.google.tracing.TraceContext$TraceContextRunnable.runInContext(TraceContext.java:449) 
    at com.google.tracing.TraceContext$TraceContextRunnable$1.run(TraceContext.java:455) 
    at com.google.tracing.TraceContext.runInContext(TraceContext.java:695) 
    at com.google.tracing.TraceContext$AbstractTraceContextCallback.runInInheritedContextNoUnref(TraceContext.java:333) 
    at com.google.tracing.TraceContext$AbstractTraceContextCallback.runInInheritedContext(TraceContext.java:325) 
    at com.google.tracing.TraceContext$TraceContextRunnable.run(TraceContext.java:453) 
    ... 1 more 
Caused by: java.lang.ClassNotFoundException: com.google.gdata.client.GoogleService 
    at com.google.appengine.runtime.Request.process-ff033622b2cd8d3f(Request.java) 
    ... 34 more 

這怎麼可能;必要的庫都在類路徑和lib目錄...

我現在已經在尋找兩天,我還沒有找到任何答案...

出於測試目的,我已經添加了Apache的公共庫並從該庫中調用了一個方法,並且它在App Engine中完美運行。

那麼我做錯了什麼?我如何使用App Engine內的Contacts API?

非常感謝您的時間!

回答

0

您可能錯過了Google Data JAR。

查看here瞭解教程。確保gdata-client,gdata-client-meta,gdata-coregdata-media JAR位於您的構建路徑中。

+0

非常感謝您的回覆。我設法克服了這個問題。奇怪的是,只要我從上面提到的例子中提取了jar,java.lang.NoClassDefFoundError就消失了。甚至認爲實際缺失的類實際上在lib中。無論如何,我將繼續閱讀OAuth2程序,因爲它需要訪問apis。再thx爲您的幫助! – ggakis 2012-07-26 10:30:01