2012-01-22 26 views
26

Có cách nào để tải một HttpServlet tùy chỉnh lên GAE không? Tôi đã tải lên một dự án bao gồm một HttpServlet trong gói .server và thêm nó vào web.xml ...java.lang.VerifyError: Mong đợi một khung stackmap

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

Có điều gì khác mà tôi bị thiếu hoặc không thể?

-------- EDIT --------

một số điều mà xuất hiện khi tôi init máy chủ của tôi, mà không im quen thấy ...

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 

và đây là những gì thể hiện khi nó bị treo ..

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) 

EDIT # 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

Cấu hình cung cấp trông ok. Bạn có thể cung cấp nhật ký hoặc thông báo lỗi không? – h3xStream

+0

xem chỉnh sửa của tôi ở trên – user1163009

+0

VerifyError có thể tham chiếu đến bytecode không hợp lệ. Xác minh rằng lớp Servlet không có lỗi biên dịch (cụ thể hơn là phương thức doGet hoặc hàm tạo). Nếu có thể, hãy đăng mã Servlet. – h3xStream

Trả lời

25

GAE sử dụng Java 1.6, nhưng bạn đã biên dịch mã bằng Java 1.7. Bạn cần biên dịch lại với Java 1.6. Theo nhận xét, bạn đang sử dụng Eclipse; bạn có thể đặt mức trình biên dịch Java trong phần Java> Compiler thuộc tính của dự án.

enter image description here

+0

cảm ơn, tôi đã cố gắng sử dụng 1.6 làm mặc định của tôi thông qua cửa sổ bảng điều khiển, nhưng tôi đoán tôi đã phải thay đổi nó trong nhật thực ... – user1163009

+0

và jdk mặc định của tôi cho nhật thực được thay đổi thành 1.6, nhờ một lần nữa – user1163009

+1

1.6 không được GAE chấp nhận bây giờ – ZiglioUK

35

Như BalusC chỉ ra, một giải pháp cho vấn đề là chỉ cần sử dụng JDK6.

Một giải pháp khác, nếu bạn muốn ở lại với JDK7, sẽ sử dụng "-XX: -UseSplitVerifier" làm đối số cho máy ảo. JRE cùng Tới

Window → Preferences → Java → Cài đặt → Chỉnh sửa ... → Mặc định VM đối số

và thêm nó ở đó.

Installed JREs JRE Definition

+0

cảm ơn Dominik, giải pháp này hoạt động với JDK 7 –

+1

đây là một giải pháp ngớ ngẩn: 1. Sử dụngSplitVerifier không được Oracle chấp nhận (nếu tôi tìm thấy liên kết , tôi sẽ đăng nó) 2. nó có thể giải quyết máy chủ phát triển, điều gì về máy chủ sản xuất của GAE? – ZiglioUK

+0

nhiều hơn về tùy chọn UserSplitVerifier: https://stackoverflow.com/questions/15253173/how-safe-is-it-to-use-xx-usesplitverifier –

1

Sử dụng -XX: -UseSplitVerifier là một giải pháp tạm thời. Bây giờ java sử dụng phiên bản trước của trình xác minh bytecode để chấp nhận khung stackmap xấu hoặc thiếu này. Java8 không hỗ trợ tùy chọn này.

0

tôi có thể giải quyết vấn đề này bằng cách thiết lập thuộc tính Eclipse Mars/dự án/biên dịch Java:

  • Compiler mức độ tuân thủ 1,7 (như tôi không có 1.6 nữa)
  • tạo .class tương thích tập tin: khả năng tương thích 1,6
  • Nguồn: 1,6

như tôi không có 1,7 mã cụ thể :-)

Ubuntu Server + Tomcat 7.0.52 trên JVM 1.7.0_85-b01 Dev Eclipse sao Hỏa trên JDK 7u55

Các vấn đề liên quan