2012-01-22 25 views
26

有沒有辦法將自定義HttpServlet加載到GAE?我上傳了一個項目,其中包括在.server包的了HttpServlet並把它添加到web.xml ...java.lang.VerifyError:期望一個堆棧映射框架

<servlet> 
    <servlet-name>testServlet</servlet-name> 
    <servlet-class>gwtone.server.TestServlet</servlet-class> 
</servlet> 

<servlet-mapping> 
    <servlet-name>testServlet</servlet-name> 
    <url-pattern>/tester/greet</url-pattern> 
</servlet-mapping> 

有別的我失蹤,或者是不可能的?

-------- --------編輯

一些事情時,我初始化我的服務器,即時通訊不習慣於看到出現......

Jan 22, 2012 4:23:44 AM com.google.apphosting.utils.jetty.JettyLogger info 
INFO: Logging to JettyLogger(null) via com.google.apphosting.utils.jetty.JettyLogger 
Jan 22, 2012 4:23:44 AM com.google.apphosting.utils.config.AppEngineWebXmlReader readAppEngineWebXml 
INFO: Successfully processed E:\Program Files\eclipse-SDK-3.7.1-win32-x86_64\Workspace\gwtone\war\WEB-INF/appengine-web.xml 
Jan 22, 2012 4:23:44 AM com.google.apphosting.utils.config.AbstractConfigXmlReader readConfigXml 
INFO: Successfully processed E:\Program Files\eclipse-SDK-3.7.1-win32-x86_64\Workspace\gwtone\war\WEB-INF/web.xml 
Jan 21, 2012 10:23:44 PM com.google.appengine.tools.development.DevAppServerImpl start 
INFO: The server is running at http://localhost:8888/ 
Jan 21, 2012 10:23:44 PM com.google.appengine.tools.development.DevAppServerImpl start 
INFO: The admin console is running at http://localhost:8888/_ah/admin 

而且這裏是顯示了當它崩潰..

WARNING: Error for /tester/greet 
java.lang.VerifyError: Expecting a stackmap frame at branch target 14 in method gwtone.server.TestServlet.doGet(Ljavax/servlet/http/HttpServletRequest;Ljavax/servlet/http/HttpServletResponse;)V at offset 0 
    at java.lang.Class.getDeclaredConstructors0(Native Method) 
    at java.lang.Class.privateGetDeclaredConstructors(Unknown Source) 
    at java.lang.Class.getConstructor0(Unknown Source) 
    at java.lang.Class.newInstance0(Unknown Source) 
    at java.lang.Class.newInstance(Unknown Source) 
    at org.mortbay.jetty.servlet.Holder.newInstance(Holder.java:153) 
    at org.mortbay.jetty.servlet.ServletHolder.initServlet(ServletHolder.java:428) 
    at org.mortbay.jetty.servlet.ServletHolder.getServlet(ServletHolder.java:339) 
    at org.mortbay.jetty.servlet.ServletHolder.handle(ServletHolder.java:487) 
    at org.mortbay.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1166) 
    at com.google.appengine.tools.development.HeaderVerificationFilter.doFilter(HeaderVerificationFilter.java:35) 
    at org.mortbay.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1157) 
    at com.google.appengine.api.blobstore.dev.ServeBlobFilter.doFilter(ServeBlobFilter.java:60) 
    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:122) 
    at org.mortbay.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1157) 
    at com.google.appengine.tools.development.BackendServersFilter.doFilter(BackendServersFilter.java:97) 
    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:78) 
    at org.mortbay.jetty.handler.HandlerWrapper.handle(HandlerWrapper.java:152) 
    at com.google.appengine.tools.development.JettyContainerService$ApiProxyHandler.handle(JettyContainerService.java:362) 
    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) 

編輯#2

package gwtone.server; 
import java.io.IOException; 
import javax.servlet.ServletException; 
import javax.servlet.http.HttpServlet; 
import javax.servlet.http.HttpServletRequest; 
import javax.servlet.http.HttpServletResponse; 

public class TestServlet extends HttpServlet { 

public TestServlet(){} 

@Override 
public void doGet(HttpServletRequest req, HttpServletResponse resp) 
     throws ServletException, IOException { 
    System.out.println("0"); 
    try { 
     System.out.println("1"); 
     resp.getWriter().println("IT WORKED"); 
     resp.getWriter().flush(); 
     System.out.println("2"); 
    } catch (IOException e) { 
     e.printStackTrace(); 
    } 
    System.out.println("3"); 
} 
} 
+0

提供的配置看起來確定。你能提供日誌或錯誤信息嗎? – h3xStream

+0

看到我上面的編輯 – user1163009

+0

VerifyError可能是指無效的字節碼。驗證Servlet類是否沒有編譯錯誤(更具體地說是doGet方法或構造函數)。如果可能的話,發佈Servlet代碼。 – h3xStream

回答

25

GAE使用Java 1.6,但您已經使用Java 1.7編譯了代碼。您需要使用Java 1.6進行重新編譯。根據評論,您使用的是Eclipse;您可以在項目屬性的Java> Compiler部分中設置Java編譯器級別。

enter image description here

+0

感謝,我試圖使用1.6作爲我的默認通過Windows控制面板,但我想我不得不改變它在月食... – user1163009

+0

和我的默認jdk for eclipse更改爲1.6,再次感謝 – user1163009

+1

1.6現在由GAE棄用 – ZiglioUK

35

由於BalusC指出,一個解決問題的辦法是隻使用JDK6。

如果您想留在JDK7中,另一種解決方案是使用「-XX:-UseSplitVerifier」作爲虛擬機的參數。 轉到

窗口→首選項→Java的安裝→→的JRE編輯...→默認VM參數

,並添加它。

Installed JREs JRE Definition

+0

感謝Dominik,此解決方案與JDK 7一起工作 –

+1

這是一個愚蠢的解決方案:1. UseSplitVerifier被Oracle棄用(如果我找到鏈接對此,我會發布它)2.它可能會解決開發服務器,那麼GAE的生產服務器呢? – ZiglioUK

+0

更多關於UserSplitVerifier選項:https://stackoverflow.com/questions/15253173/how-safe-is-it-to-use-xx-usesplitverifier –

1

使用-XX:-UseSplitVerifier是一個臨時解決方案。現在,java使用字節碼驗證器的先前版本,該版本容許這種不良或缺失的堆棧映射幀。 Java8不支持這個選項。

0

我可以通過設置Eclipse的火星/項目屬性解決這個問題/ Java編譯器:

  • 編譯器合規水平1.7(因爲我沒有做1.6了)
  • 生成的.class文件兼容性: 1.6
  • 源代碼兼容性:1.6

,因爲我沒有有:-)

服務器的Ubuntu + Tomcat的7.0.52 1.7特定代碼在JVM 1.7.0_85-B01 開發的Eclipse火星上JDK 7u55