【问题标题】:Understanding how to resolve "Inconsistent stackmap frames" exception了解如何解决“不一致的堆栈图帧”异常
【发布时间】:2013-10-07 16:29:12
【问题描述】:

我在启动 web 应用程序时遇到异常,因为 guice 正在尝试构建提到的类。

java.lang.VerifyError: Inconsistent stackmap frames at branch target 2770 in method com.aptusi.apps.magazine.api.servlet.internal.EditorServlet.service(Ljavax/servlet/http/HttpServletRequest;Ljavax/servlet/http/HttpServletResponse;Ljava/lang/String;Lcom/aptusi/persistence/runtime/framework/DboSession;)V at offset 200
at java.lang.Class.getDeclaredConstructors0(Native Method)
at java.lang.Class.privateGetDeclaredConstructors(Class.java:2483)
at java.lang.Class.getDeclaredConstructors(Class.java:1891)
at com.google.inject.spi.InjectionPoint.forConstructorOf(InjectionPoint.java:243)
at com.google.inject.internal.ConstructorBindingImpl.create(ConstructorBindingImpl.java:96)
at com.google.inject.internal.InjectorImpl.createUninitializedBinding(InjectorImpl.java:629)
at com.google.inject.internal.InjectorImpl.createJustInTimeBinding(InjectorImpl.java:845)
at com.google.inject.internal.InjectorImpl.createJustInTimeBindingRecursive(InjectorImpl.java:772)
at com.google.inject.internal.InjectorImpl.getJustInTimeBinding(InjectorImpl.java:256)
at com.google.inject.internal.InjectorImpl.getBindingOrThrow(InjectorImpl.java:205)
at com.google.inject.internal.InjectorImpl.getBinding(InjectorImpl.java:146)
at com.google.inject.internal.InjectorImpl.getBinding(InjectorImpl.java:66)
at com.google.inject.servlet.ServletDefinition.init(ServletDefinition.java:103)
at com.google.inject.servlet.ManagedServletPipeline.init(ManagedServletPipeline.java:82)
at com.google.inject.servlet.ManagedFilterPipeline.initPipeline(ManagedFilterPipeline.java:102)
at com.google.inject.servlet.GuiceFilter.init(GuiceFilter.java:172)`

我知道 -XX:-UseSplitVerifier 和 -noverify jvm 选项,但我不想使用,因为我想确保这个项目中的所有代码至少是 java 版本 7。

为了做到这一点,了解这在我的代码中到底发生在哪里会很有用,我不清楚提到的 200 的偏移量是什么,但它可以与行号相关吗?

还有谁知道我可以找到类路径上所有类的 java 版本的方法,我使用的是 maven,所以有很多依赖项,所以我正在寻找一种自动查找任何类的方法在可能已编译为低于 1.7 的 java 版本的类路径上?

【问题讨论】:

    标签: maven java-7 verification .class-file verifyerror


    【解决方案1】:

    要查找类文件的版本,只需查看类文件的第 8 个字节。对于 Java 7 类,它将是 51。像 ASM 这样的框架会为您做到这一点。

    就错误而言,这意味着您的类文件格式错误。您是如何创建这些课程的?你做过任何字节码操作吗?如果是这样,您的代码中可能存在错误。

    【讨论】:

    • 感谢 Antimony,问题是这个项目依赖于大约 100 个 jar,所以我需要一种方法来快速验证所有 jar 中的所有类是否符合某个版本。
    • 只需要写一个 Python 脚本(假设你知道 jars 的位置)。
    • 这似乎是验证这一点的唯一方法,尽管我很惊讶没有任何工具可以做到这一点。
    • 你知道偏移量与类文件中的行号有什么关系吗?
    • @Antimony,失败的总是同一个静态方法。但它随机失败。有时我重建了一个依赖项并且它消失了,有时它在开发服务器和 gae 的生产服务器上都没有。我不明白 GAE sdk 在运行时做了什么,它可以做一些字节码修改。我发现 2012 年的错误报告显示 Eclipse 编译器发生错误,所以我不知道。一些奇怪的互动
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-06-10
    • 1970-01-01
    • 1970-01-01
    • 2012-09-24
    • 2017-01-31
    • 2015-08-17
    • 1970-01-01
    相关资源
    最近更新 更多