[英]java.lang.VerifyError: Expecting a stackmap frame
Is there a way to load a custom HttpServlet to GAE? 有没有办法将自定义HttpServlet加载到GAE? I uploaded a project that included an HttpServlet in the .server package and added it to the web.xml...
我上传了一个包含.server包中的HttpServlet的项目,并将其添加到web.xml中...
<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>
Is there something else I am missing, or is it not possible? 还有其他我想念的东西,还是不可能?
--------EDIT-------- - - - - 编辑 - - - -
some things that appear when i init my server, which im not used to seeing... 当我启动我的服务器时出现的一些东西,我不习惯看到......
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
and here is what shows when it crashes.. 这是什么显示它崩溃..
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 编辑#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");
}
}
As BalusC pointed out, one solution to the problem is to just use JDK6. 正如BalusC指出的那样,问题的一个解决方案就是使用JDK6。
Another solution, if you want to stay with JDK7, would be to use " -XX:-UseSplitVerifier " as an argument for the VM. 如果你想继续使用JDK7,另一个解决方案是使用“ -XX:-UseSplitVerifier ”作为VM的参数。 Go to
去
Window → Preferences → Java → Installed JREs → Edit... → Default VM arguments 窗口→首选项→Java→已安装的JRE→编辑...→默认VM参数
and add it there. 并将其添加到那里。
GAE uses Java 1.6, but you've compiled the code with Java 1.7. GAE使用Java 1.6,但您已使用Java 1.7编译代码。 You need to recompile with Java 1.6.
您需要使用Java 1.6重新编译。 As per the comments, you're using Eclipse;
根据评论,你正在使用Eclipse; you can set the Java compiler level in Java > Compiler section of project's properties.
您可以在项目属性的Java> Compiler部分中设置Java编译器级别。
Using -XX:-UseSplitVerifier is a temporary solution. 使用-XX:-UseSplitVerifier是一种临时解决方案。 Now java uses the previous version of the bytecode verifier which tolerates this bad or missing stackmap frames.
现在java使用以前版本的字节码验证器,它可以容忍这个坏的或丢失的堆栈映射帧。 Java8 doesnt support this option.
Java8不支持此选项。
I could solve this issue by setting Eclipse Mars / Project properties / Java compiler : 我可以通过设置Eclipse Mars / Project属性/ Java编译器来解决这个问题:
as I didn't have 1.7 specific code :-) 因为我没有1.7特定代码:-)
Server Ubuntu + Tomcat 7.0.52 on JVM 1.7.0_85-b01 Dev Eclipse Mars on JDK 7u55 JVM上的服务器Ubuntu + Tomcat 7.0.52 1.7.0_85-b01在JDK 7u55上开发Eclipse Mars
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.