java.lang.VerifyError:期望分支目标JDK 1.7处的stackmap帧

Joh*_*ohn 83 java jaxb java-7

升级到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)
Run Code Online (Sandbox Code Playgroud)

Mir*_*ari 163

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

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

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

  • 所以如果我看到这个错误:这是JVM或我的代码中的错误吗? (2认同)
  • 这个答案从长期来看是无效的,或者已经不再有效,因为Oracle正在弃用此选项.我受到这个bug(与其他代码)的影响,我正在寻找一种方法来重建堆栈图 (2认同)
  • 对于单元测试,您必须在surefire插件中传递参数。这解决了Java 7和8编译器的问题:&lt;plugin&gt; &lt;groupId&gt; org.apache.maven.plugins &lt;/ groupId&gt; &lt;artifactId&gt; maven-surefire-plugin &lt;/ artifactId&gt; &lt;version&gt; 2.18.1 &lt;/ version &gt; &lt;configuration&gt; &lt;argLine&gt; -noverify -XX:-UseSplitVerifier &lt;/ argLine&gt; &lt;/ configuration&gt; &lt;/ plugin&gt; (2认同)
  • 我面临同样的问题,但在添加-noverify之后它确实对我有用.谢谢. (2认同)

小智 14

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


小智 8

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

注意:如果您使用的是JDK 1.8,则无法使用

  • 对我来说,使用固定执行我们的Android单元测试的标志使用JRE 8作为运行时. (3认同)
  • -noverify在Java 8上也对我有用。我在Android上使用gradle,因此我必须将-noverify标志放在stackoverflow.com/a/37593189/2848676中指定的位置 (2认同)