89

升级到 JDK 1.7 后,出现以下异常:

java.lang.VerifyError: Expecting a stackmap frame at branch target 71 in method com.abc.domain.myPackage.MyClass$JaxbAccessorM_getDescription_setDescription_java_lang_String.get(Ljava/lang/Object;)Ljava/lang/Object; at offset 20
    at java.lang.Class.getDeclaredConstructors0(Native Method)
    at java.lang.Class.privateGetDeclaredConstructors(Class.java:2413)
    at java.lang.Class.getConstructor0(Class.java:2723)
    at java.lang.Class.newInstance0(Class.java:345)
    at java.lang.Class.newInstance(Class.java:327)
    at com.sun.xml.internal.bind.v2.runtime.reflect.opt.OptimizedAccessorFactory.instanciate(OptimizedAccessorFactory.java:184)
    at com.sun.xml.internal.bind.v2.runtime.reflect.opt.OptimizedAccessorFactory.get(OptimizedAccessorFactory.java:129)
    at com.sun.xml.internal.bind.v2.runtime.reflect.Accessor$GetterSetterReflection.optimize(Accessor.java:384)
    at com.sun.xml.internal.bind.v2.runtime.property.SingleElementLeafProperty.<init>(SingleElementLeafProperty.java:72)
    at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
    at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:57)
    at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
    at java.lang.reflect.Constructor.newInstance(Constructor.java:525)
    at com.sun.xml.internal.bind.v2.runtime.property.PropertyFactory.create(PropertyFactory.java:113)
    at com.sun.xml.internal.bind.v2.runtime.ClassBeanInfoImpl.<init>(ClassBeanInfoImpl.java:166)
    at com.sun.xml.internal.bind.v2.runtime.JAXBContextImpl.getOrCreate(JAXBContextImpl.java:494)
    at com.sun.xml.internal.bind.v2.runtime.JAXBContextImpl.<init>(JAXBContextImpl.java:311)
    at com.sun.xml.internal.bind.v2.runtime.JAXBContextImpl.<init>(JAXBContextImpl.java:126)
    at com.sun.xml.internal.bind.v2.runtime.JAXBContextImpl$JAXBContextBuilder.build(JAXBContextImpl.java:1148)
    at com.sun.xml.internal.bind.v2.ContextFactory.createContext(ContextFactory.java:130)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:601)
    at javax.xml.bind.ContextFinder.newInstance(ContextFinder.java:248)
    at javax.xml.bind.ContextFinder.newInstance(ContextFinder.java:235)
    at javax.xml.bind.ContextFinder.find(ContextFinder.java:445)
    at javax.xml.bind.JAXBContext.newInstance(JAXBContext.java:637)
    at javax.xml.bind.JAXBContext.newInstance(JAXBContext.java:584)
    at com.abc.domain.myPackage.MyClass.marshalFacetsTest(MyClass.java:73)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:601)
    at org.testng.internal.MethodInvocationHelper.invokeMethod(MethodInvocationHelper.java:80)
    at org.testng.internal.Invoker.invokeMethod(Invoker.java:714)
    at org.testng.internal.Invoker.invokeTestMethod(Invoker.java:901)
    at org.testng.internal.Invoker.invokeTestMethods(Invoker.java:1231)
    at org.testng.internal.TestMethodWorker.invokeTestMethods(TestMethodWorker.java:128)
    at org.testng.internal.TestMethodWorker.run(TestMethodWorker.java:111)
    at org.testng.TestRunner.privateRun(TestRunner.java:767)
    at org.testng.TestRunner.run(TestRunner.java:617)
    at org.testng.SuiteRunner.runTest(SuiteRunner.java:334)
    at org.testng.SuiteRunner.runSequentially(SuiteRunner.java:329)
    at org.testng.SuiteRunner.privateRun(SuiteRunner.java:291)
    at org.testng.SuiteRunner.run(SuiteRunner.java:240)
    at org.testng.SuiteRunnerWorker.runSuite(SuiteRunnerWorker.java:52)
    at org.testng.SuiteRunnerWorker.run(SuiteRunnerWorker.java:86)
    at org.testng.TestNG.runSuitesSequentially(TestNG.java:1203)
    at org.testng.TestNG.runSuitesLocally(TestNG.java:1128)
    at org.testng.TestNG.run(TestNG.java:1036)
    at org.testng.remote.RemoteTestNG.run(RemoteTestNG.java:111)
    at org.testng.remote.RemoteTestNG.initAndRun(RemoteTestNG.java:204)
    at org.testng.remote.RemoteTestNG.main(RemoteTestNG.java:175)
4

9 回答 9

175

Java 7 引入了更严格的验证并稍微改变了类格式——包含用于验证代码是否正确的堆栈映射。您看到的异常意味着某些方法没有有效的堆栈映射。

Java 版本或字节码检测都可能是罪魁祸首。通常这意味着应用程序使用的库会生成未通过更严格验证的无效字节码。因此,开发人员只能将其作为错误报告给库。

作为一种解决方法,您可以添加-noverify到 JVM 参数以禁用验证。在 Java 7 中,也可以-XX:-UseSplitVerifier使用不太严格的验证方法,但在 Java 8 中删除了该选项。

于 2013-02-27T21:40:50.130 回答
15

如果您使用的是 java 1.8,请在您的 JVM 属性中删除XX:-UseSplitVerifier并使用。-noverify

于 2016-01-28T11:16:08.183 回答
8

我遇到了这个问题并尝试使用-noverify真正有效的标志。这是因为新的字节码验证器。所以旗帜应该真的有效。我正在使用 JDK 1.7。

注意:如果您使用的是 JDK 1.8,这将不起作用

于 2015-02-03T02:21:34.900 回答
3

-noverify将 JVM 参数传递给您的测试任务。如果你使用 gradle,build.gradle你可以有类似的东西:

test {
  jvmArgs "-noverify"
}
于 2018-07-06T00:51:13.123 回答
2

导致问题的文件之间的唯一区别是文件的第 8 个字节

CA FE BA BE 00 00 00 33 - Java 7

对比

CA FE BA BE 00 00 00 32 - Java 6

设置-XX:-UseSplitVerifier解决了这个问题。但是,此问题的原因是https://bugs.eclipse.org/bugs/show_bug.cgi?id=339388

于 2016-11-02T02:41:20.560 回答
0

当您使用 Mockito模拟最终类时,可能会发生此错误。

考虑改用 Mockito inline 或 Powermock。

于 2020-05-04T12:16:21.183 回答
-2

抱歉挖掘,但我遇到了同样的问题并找到了更简单的解决方案。

在 Java 编译器选项中,您需要取消选中“保留未使用(从不读取)的局部变量”,因此无需更改回目标 JVM 版本。

这似乎是旧 Ecipe 版本中的一个错误。

于 2013-10-16T14:38:02.863 回答
-4

如果您自己构建代码,则可以通过向 java 编译器提供“-target 1.5”(或通过在 IDE 或构建配置中设置相应的选项)来解决此问题。

于 2014-08-09T16:41:46.053 回答
-11

这个链接很有帮助。 java.lang.VerifyError:期望堆栈图帧

最简单的方法是将 JRE 更改为 6。

于 2013-05-23T05:45:59.243 回答