java.lang.VerifyError:在分支目标JDK 1.7处期待一个堆栈映射框架


88

升级到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)

Answers:


171

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

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

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


1
但是-XX:-UseSplitVerifier是什么意思呢?我看了一下oracle的解释,上面写着“使用带有StackMapTable属性的新类型检查器”。我没听懂
约翰,

2
因此,如果我看到以下错误:这是JVM还是我的代码内的错误?
bentolor

4
从长远来看,这个答案是无效的,或者也许已经不再有效,因为Oracle不赞成使用此选项。我受到此错误(以及其他代码)的困扰,正在寻找一种方法来重新构建堆栈映射
ZiglioUK

2
对于单元测试,您必须在surefire插件中传递参数。这解决了Java 7和8编译器的问题:<plugin> <groupId> org.apache.maven.plugins </ groupId> <artifactId> maven-surefire-plugin </ artifactId> <version> 2.18.1 </ version > <configuration> <argLine> -noverify -XX:-UseSplitVerifier </ argLine> </ configuration> </ plugin>
Antoine Wils

2
我遇到了同样的问题,但是在添加-noverify之后,它确实对我有用。谢谢。
Praveen Kumar Mekala '16


8

我遇到了这个问题,并尝试使用-noverify确实有效的标志。这是因为新的字节码验证程序。因此,该标志应该确实起作用。我正在使用JDK 1.7。

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


3
对我来说,使用固定的标志使用JRE 8作为运行时执行我们的Android单元测试。
ubuntudroid

2
-noverify也为我工作于Java 8.我的gradle使用Android的,所以我不得不把-noverify标志凡在指定stackoverflow.com/a/37593189/2848676
迈克尔Osofsky

您在哪里设置-noverify?我将其设置为MAVEN_OPTS,但对我不起作用
dev

@Sara Antunez,在android闭包中的应用程序模块的build.gradle文件中,添加它。android {.... testOptions {unitTests.all {jvmArgs'-noverify'}}}
GrokkingDroid


2

-noverifyJVM参数传递给您的测试任务。如果您使用gradle,则build.gradle可以使用以下代码:

test {
  jvmArgs "-noverify"
}

0

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

考虑改用内联Mockito或Powermock。


-1

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

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

在较旧的Eclipe版本中,这似乎是一个错误。


它对我不起作用。这是我的错误要点:gist.github.com/ZiglioNZ/bd1d7d424727b3f26c64
ZiglioUK

3
OP没有提到Eclipse。他甚至可能没有使用它。
唐·布兰森

-3

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


-11

该链接很有帮助。 java.lang.VerifyError:需要一个堆栈映射框架

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


7
降级时,简单的JVM arg可以解决?我怀疑您对简单的定义。
有远见的软件解决方案

1
尽管从理论上讲这可以回答问题,但最好在此处包括答案的基本部分,并提供链接以供参考。
Joachim Sauer

这是一种解决方法。正如约阿希姆说,它可能工作-但它并没有为团队或代码库必须使用Java 7中的问题或帮助
Crowie

链接的问题中有多个答案。降级只是列出的一个选项。
Ogre Psalm33,2014年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.