当我使用JDK7或JDK6在Eclipse中编译和运行我的项目时,一切都很顺利。然而,在我使用ANT构建它然后尝试使用系统JDK7运行它之后,我收到错误:
方法myClass.myMethod()中的分支目标25处的堆栈映射帧不一致[[Ljava / lang / Object;偏移14
我到处寻找并在StackOverFlow上找到了几个很好的问题:
两者基本上都建议添加-XX:-UseSplitVerifier
作为解决问题的JVM选项。我仍然不完全理解为什么,但显然this bug report可能会有所帮助。不幸的是我仍然没有得到它......
我注意到有人使用面向方面编程的一个问题,这让我觉得我正在使用Guice(谷歌的DI框架),这可能导致问题,但我看不出如何。它假设支持JDK7。
我也在使用Proguard,但也可以使用JDK7。
无论如何,在这一点上我不知道为什么这个解决方法是有效的,除了它基本上回到以前的JDK(在这种情况下是JDK6)版本,当代码的某些部分试图使用字节代码(这是为什么我认为它与DI)代码有关。但我仍然无法建立正确的链接。我也可以离开!!
如果有人可以解释发生了什么或为什么会发生这种情况,我会非常感激。此外,我真的不想使用解决方法,因为这不是我认为的长期解决方案。
答案 0 :(得分:3)
从Java 7开始,编译后的字节码必须包含额外的StackMapTable属性。这些帮助JVM中的验证程序在类加载时检查类是否合理构造。早期版本的Java更宽松,在没有属性的情况下回退更慢的验证。
修改原始编译字节码的工具(编译后的ProGuard,执行前的AOP框架,...)需要使用修改后的代码更新属性。如果他们没有这样做,您将收到错误消息“Inconsistent stackmap frames”。
ProGuard应执行此预验证罚款;我不知道它有任何问题。如果您在未应用ProGuard的情况下仍然看到错误,则问题必须在于DI或AOP。