5

当我使用 JDK7 或 JDK6 在 Eclipse 中编译和运行我的项目时,一切都很好。但是,在我使用 ANT 构建它然后尝试使用系统 JDK7 运行它之后,我收到错误消息:

方法 myClass.myMethod() [[Ljava/lang/Object; 中分支目标 25 处的堆栈图帧不一致;在偏移 14

我到处找,在 StackOverFlow 上发现了几个很好的问题:

两者基本上都建议添加-XX:-UseSplitVerifier为确实解决了该问题的 JVM 选项。我仍然不完全理解为什么,但显然这个错误报告应该会有所帮助。可惜我还是没看懂……

我确实注意到有人在使用面向方面的编程的问题之一,这让我觉得我正在使用Guice(谷歌的 DI 框架),这可能会导致问题,但我不知道如何。假设支持JDK7。

我也在使用 Proguard,但这也应该适用于 JDK7。

无论如何,在这一点上,我不知道为什么这种解决方法有效,除了它基本上回退到以前的 JDK(在这种情况下是 JDK6)版本时,当代码的某些部分试图使用字节码时(这就是为什么我认为它与DI)代码有关。但我仍然无法建立正确的链接。而且我也可能会离开!

如果有人可以解释发生了什么或为什么会发生这种情况,我将非常感激。此外,我真的很讨厌不得不使用解决方法,因为这不是我认为的长期解决方案。

4

1 回答 1

3

从 Java 7 开始,编译后的字节码必须包含额外的 StackMapTable 属性。这些有助于 JVM 内部的验证器在类加载时检查类的构造是否正确。Java 的早期版本更加宽松,在没有属性的情况下使用较慢的验证。

修改原始编译字节码的工具(编译后的 ProGuard,执行前的 AOP 框架,......)需要与修改后的代码一致地更新属性。如果他们不这样做,您将收到错误消息“不一致的堆栈图帧”。

ProGuard 应执行此预验证罚款;我不知道它有任何问题。如果在没有应用 ProGuard 的情况下仍然看到错误,则问题一定出在 DI 或 AOP 上。

于 2012-10-17T00:51:21.563 回答