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

Java 7-不一致的stackmap框架-需要帮助了解解决方案的工作原理,java,dependency-injection,guice,proguard,java-7,Java,Dependency Injection,Guice,Proguard,Java 7,当我使用JDK7或JDK6在Eclipse中编译和运行我的项目时,一切都很好。但是,在我使用ANT构建它并尝试使用系统JDK7运行它之后,我得到了错误: 方法myClass.myMethod()[[Ljava/lang/Object;偏移量14处的分支目标25处的堆栈映射帧不一致 我到处都找过了,在StackOverFlow上发现了几个好问题: 两者基本上都建议添加-XX:-使用SplitVerifier作为JVM选项,这确实解决了问题。我仍然不完全理解为什么,但显然是有帮助的。不幸的是

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

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

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

两者基本上都建议添加
-XX:-使用SplitVerifier
作为JVM选项,这确实解决了问题。我仍然不完全理解为什么,但显然是有帮助的。不幸的是,我仍然不明白

我确实注意到有人在使用面向方面的编程,这让我觉得我在使用(谷歌的DI框架),这可能会导致问题,但我不知道怎么做。它应该支持JDK7

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

无论如何,在这一点上,我不知道这个解决方案为什么会起作用,除了它基本上是回到以前的JDK(在本例中是JDK6)版本,当代码的某些部分试图处理字节码时(这就是为什么我认为它与DI相关)代码。但我仍然无法建立正确的链接。而且我可能还差得很远


<>如果有人能解释发生了什么或为什么会发生这种情况,我会非常感激。我也很讨厌使用一个解决方案,因为这不是我认为的长期解决方案。

< p>正如java 7,编译的字节码必须包含额外的StabpMaTable属性。这些帮助了JVM内部的验证器检查类是在类加载时构造良好。早期版本的Java更为宽松,采用较慢的无属性验证

修改原始编译字节码的工具(编译后的ProGuard,执行前的AOP框架,…)需要使用修改后的代码一致地更新属性。如果它们不能这样做,您将得到错误消息“stackmap框架不一致”


ProGuard应该可以很好地执行此预验证;我不知道它有任何问题。如果您在没有应用ProGuard的情况下仍然看到错误,那么问题一定出在DI或AOP上。

“它应该支持JDK7。”-也许它的支持有缺陷。你搜索过Guice问题跟踪程序/组/列表吗?在他们的问题跟踪程序中找不到任何关于缺陷的内容。我猜在java7中,他们添加了更积极的字节码验证检查,Guice对字节码执行依赖项注入的任何操作都不起作用h这些检查当你说你用ant构建时,你是从eclipse运行ant吗?这也可能是eclipse编译器中的一个bug,如果是这样的话,试着用纯javac或者NetBeans构建这段代码。问题是它在eclipse中工作,而不是在纯jvm中。我也使用proguard,并认为这可能是问题的一部分,但这也是问题的一部分假设您支持JDK7