java.lang.VerifyError:期望堆栈图帧

Posted

技术标签:

【中文标题】java.lang.VerifyError:期望堆栈图帧【英文标题】:java.lang.VerifyError: Expecting a stackmap frame 【发布时间】:2012-02-16 00:19:30 【问题描述】:

有没有办法将自定义 HttpServlet 加载到 GAE?我上传了一个在 .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>

还有什么我遗漏的,还是不可能的?

--------编辑--------

当我初始化我的服务器时出现的一些东西,我不习惯看到......

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");


【问题讨论】:

提供的配置看起来不错。你能提供日志或错误信息吗? VerifyError 可能是指无效的字节码。验证 Servlet 类是否没有编译错误(更具体地说是 doGet 方法或构造函数)。如果可能,请发布 Servlet 代码。 servlet 代码发布在编辑 #2 中,它不打印 0,1,2,3 它只是响应状态 500。另外,我在工作中使用 GWT,但这是第一次单独项目也必须设置 eclipse 和其他东西。 似乎是 JDK 1.7 问题:groups.google.com/a/googleproductforums.com/forum/#!msg/apps/… 是的,我尝试了 12 种不同的东西。不能用 Indigo 和 GWT 什么的吗? 【参考方案1】:

正如 BalusC 所指出的,解决问题的一种方法是只使用 JDK6。

如果您想继续使用 JDK7,另一种解决方案是使用“-XX:-UseSplitVerifier”作为 VM 的参数。 去

Window → Preferences → Java → Installed JREs → Edit... → Default VM arguments

并将其添加到那里。

【讨论】:

这是一个愚蠢的解决方案: 1. UseSplitVerifier 已被 Oracle 弃用(如果我找到链接,我会发布它) 2. 它可能解决开发服务器,GAE 的生产呢服务器? 有关 UserSplitVerifier 选项的更多信息:***.com/questions/15253173/…【参考方案2】:

GAE 使用 Java 1.6,但您使用 Java 1.7 编译了代码。您需要使用 Java 1.6 重新编译。根据 cmets,您使用的是 Eclipse;您可以在项目属性的 Java > Compiler 部分设置 Java 编译器级别。

【讨论】:

谢谢,我尝试通过 Windows 控制面板使用 1.6 作为我的默认值,但我想我必须在 eclipse 中更改它... 我的eclipse默认jdk改成1.6了,再次感谢 1.6 现已被 GAE 弃用【参考方案3】:

使用 -XX:-UseSplitVerifier 是一个临时解决方案。现在 java 使用以前版本的字节码验证器,它可以容忍这种错误或丢失的堆栈图帧。 Java8 不支持此选项。

【讨论】:

【参考方案4】:

我可以通过设置 Eclipse Mars/项目属性/Java 编译器来解决这个问题:

编译器合规级别为 1.7(因为我不再有 1.6) 生成的 .class 文件兼容性:1.6 源兼容性:1.6

因为我没有 1.7 特定代码:-)

在 JVM 1.7.0_85-b01 上的服务器 Ubuntu + Tomcat 7.0.52 在 JDK 7u55 上开发 Eclipse Mars

【讨论】:

以上是关于java.lang.VerifyError:期望堆栈图帧的主要内容,如果未能解决你的问题,请参考以下文章

java.lang.VerifyError:在分支目标 73 处期望堆栈图帧

java.lang.VerifyError

API < 21 的 java.lang.VerifyError

Android java.lang.VerifyError?

Proguard - 找不到常见的超类/java.lang.VerifyError

java.lang.verifyError 在休眠特定用户类型上