簡體   English   中英

Twitter4j Google App Engine-java.lang.NoClassDefFoundError

[英]Twitter4j Google App Engine - java.lang.NoClassDefFoundError

我正在嘗試使用Twitter4j庫在Google App Engine上創建Java應用程序。

當我創建普通(不是Google)應用時,我可以使用twitter4j,並且一切正常。 我在項目->屬性-> Java構建路徑->庫->添加外部JAR中包含庫。 我的代碼:

Twitter twitter = new TwitterFactory().getInstance();
     twitter.setOAuthConsumer(consumer_key, consumer_secret);
     twitter.setOAuthAccessToken(new AccessToken(oauth_token,oauth_token_secret));

     try{
         ResponseList<Status> a = twitter.getUserTimeline("medium");
         for(Status b:a)
         {
             System.out.println(b.getText());
         }
     }
     catch(Exception e)
     {
         System.out.println(e.toString());
     }

當我創建Google Java項目並嘗試初始化Twitter時,出現錯誤:

java.lang.NoClassDefFoundError: twitter4j/TwitterFactory
at com.paperbox.HelloWorldServlet.doGet(HelloWorldServlet.java:26)
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)
at org.mortbay.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1166)
at com.google.appengine.api.socket.dev.DevSocketFilter.doFilter(DevSocketFilter.java:74)
at org.mortbay.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1157)
at com.google.appengine.tools.development.ResponseRewriterFilter.doFilter(ResponseRewriterFilter.java:123)
at org.mortbay.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1157)
at com.google.appengine.tools.development.HeaderVerificationFilter.doFilter(HeaderVerificationFilter.java:34)
at org.mortbay.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1157)
at com.google.appengine.api.blobstore.dev.ServeBlobFilter.doFilter(ServeBlobFilter.java:63)
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 com.google.appengine.tools.development.StaticFileFilter.doFilter(StaticFileFilter.java:125)
at org.mortbay.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1157)
at com.google.appengine.tools.development.DevAppServerModulesFilter.doDirectRequest(DevAppServerModulesFilter.java:368)
at com.google.appengine.tools.development.DevAppServerModulesFilter.doDirectModuleRequest(DevAppServerModulesFilter.java:351)
at com.google.appengine.tools.development.DevAppServerModulesFilter.doFilter(DevAppServerModulesFilter.java:116)
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.appengine.tools.development.DevAppEngineWebAppContext.handle(DevAppEngineWebAppContext.java:97)
at org.mortbay.jetty.handler.HandlerWrapper.handle(HandlerWrapper.java:152)
at com.google.appengine.tools.development.JettyContainerService$ApiProxyHandler.handle(JettyContainerService.java:485)
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.HttpParser.parseNext(HttpParser.java:547)
at org.mortbay.jetty.HttpParser.parseAvailable(HttpParser.java:212)
at org.mortbay.jetty.HttpConnection.handle(HttpConnection.java:404)
at org.mortbay.io.nio.SelectChannelEndPoint.run(SelectChannelEndPoint.java:409)
at org.mortbay.thread.QueuedThreadPool$PoolThread.run(QueuedThreadPool.java:582)

Twitter4j的JAR應該放在WEB-INF / lib中。

我不知道Twitter4j是否有問題-GAE連接或其他問題。

現在,我必須使用異步連接-代碼:

AsyncTwitterFactory factory = new AsyncTwitterFactory();
AsyncTwitter asyncTwitter = factory.getInstance();
asyncTwitter.setOAuthConsumer(consumer_key, consumer_secret);
asyncTwitter.setOAuthAccessToken(new AccessToken(oauth_token,oauth_token_secret));
asyncTwitter.addListener(listener);
//asyncTwitter.updateStatus("asd");
System.out.println(asyncTwitter.toString());
        try{
            asyncTwitter.getUserTimeline("medium");
        }
        catch(Exception e)
         {
             System.out.println(e.toString());
         }

例外:

HTTP ERROR 500

Problem accessing /testapp Reason:

java.lang.reflect.InvocationTargetException
Caused by:

 java.lang.AssertionError: java.lang.reflect.InvocationTargetException
at twitter4j.internal.async.DispatcherFactory.getInstance(DispatcherFactory.java:61)
at twitter4j.AsyncTwitterImpl.getDispatcher(AsyncTwitterImpl.java:3146)
at twitter4j.AsyncTwitterImpl.getUserTimeline(AsyncTwitterImpl.java:109)
at twitter4j.AsyncTwitterImpl.getUserTimeline(AsyncTwitterImpl.java:170)
...
...

Twitter4j異步調用引導new Thread()在GAE這是不允許的。

您需要修改DispatcherImpl構造函數以使用GAE的ThreadManager創建線程。

請參考GAE沙箱聲明

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM