Java 7 - 不一致的stackmap框架 - 需要帮助理解解决方案的工作原理

Ste*_*ier 5 java dependency-injection proguard guice java-7

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

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

我到处寻找,在StackOverFlow上找到了几个不错的问题:

两者基本上都建议添加-XX:-UseSplitVerifier作为JVM选项,它确实解决了这个问题.我仍然不完全理解为什么,但显然这个错误报告可能会有所帮助.不幸的是我仍然没有得到它......

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

我也在使用Proguard,但也可以使用JDK7.

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

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

Eri*_*une 3

从 Java 7 开始,编译的字节码必须包含附加的 StackMapTable 属性。这些可以帮助 JVM 内部的验证器在类加载时检查类的构造是否正确。Java 的早期版本更加宽松,依靠较慢的无属性验证。

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

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