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)

답변:


171

Java 7은보다 엄격한 검증을 도입하고 코드가 올바른지 확인하는 데 사용되는 스택 맵을 포함하도록 클래스 형식을 약간 변경했습니다. 표시되는 예외는 일부 메서드에 유효한 스택 맵이 없음을 의미합니다.

Java 버전 또는 바이트 코드 계측 모두 문제가 될 수 있습니다. 일반적으로 이는 애플리케이션에서 사용하는 라이브러리가 더 엄격한 검증을 통과하지 못하는 유효하지 않은 바이트 코드를 생성 함을 의미합니다. 따라서 개발자는이를 라이브러리에 버그로보고하는 것 외에는 할 수 없습니다.

해결 방법으로 -noverify확인을 비활성화하기 위해 JVM 인수에 추가 할 수 있습니다 . Java 7에서는 -XX:-UseSplitVerifier덜 엄격한 확인 방법을 사용하는 것도 가능 했지만 해당 옵션은 Java 8에서 제거되었습니다.


1
그러나 -XX : -UseSplitVerifier는 무엇을 의미합니까 ?? 오라클의 설명을 살펴보면 "StackMapTable 속성과 함께 새로운 유형 검사기를 사용하십시오"라는 메시지가 표시됩니다. 이해하지 못했습니다.
John

2
따라서이 오류가 표시되면 JVM 또는 내 코드 내의 버그입니까?
bentolor 2013 년

4
이 대답은 Oracle이이 옵션을 더 이상 사용하지 않기 때문에 장기적으로 또는 더 이상 유효하지 않습니다. 나는이 버그의 고통있어 (다른 코드)와 stackmaps의 다시 전면에 방법을 찾고 있어요
ZiglioUK

2
단위 테스트의 경우 surefire 플러그인에서 인수를 전달해야합니다. 이로 인해 Java 7 및 8 컴파일러 모두에 대한 문제가 해결되었습니다. <plugin> <groupId> org.apache.maven.plugins </ groupId> <artifactId> maven-surefire-plugin </ artifactId> <version> 2.18.1 </ version > <구성> <argLine> -noverify -XX : -UseSplitVerifier </ argLine> </ 설정> </ 플러그인>
앙투안 Wils

2
나는 같은 문제에 직면하고 있었지만 -noverify를 추가 한 후에 정말 나를 위해 일했습니다.
Praveen Kumar Mekala

15

Java 1.8을 사용하는 경우 JVM 속성에서 제거 XX:-UseSplitVerifier하고 사용 -noverify하십시오.


8

이 문제가 발생하여 -noverify실제로 작동 하는 플래그 를 사용해보십시오 . 새로운 바이트 코드 검증기 때문입니다. 따라서 플래그는 실제로 작동합니다. JDK 1.7을 사용하고 있습니다.

참고 : JDK 1.8을 사용하는 경우 작동하지 않습니다.


3
나를 위해 JRE 8을 런타임으로 사용하여 Android 단위 테스트를 실행하는 고정 플래그를 사용했습니다.
ubuntudroid

2
또한 자바 나 안드로이드와 I 있도록 Gradle을 사용하고 8 일 나를 위해 일한 -noverify stackoverflow.com/a/37593189/2848676에 지정된 -noverify 플래그를 넣어했다
마이클 Osofsky

-noverify를 어디에 설정 했습니까? 나는 MAVEN_OPTS로 설정하지만 나를 위해 작동하지 않습니다
dev에

@Sara Antunez, Android 클로저에있는 애플리케이션 모듈의 build.gradle 파일에 이것을 추가합니다. android {.... testOptions {unitTests.all {jvmArgs '-noverify'}}}
GrokkingDroid


2

패스 -noverify테스트 작업에 JVM 인수를. gradle을 사용하는 경우 build.gradle다음과 같은 것을 가질 수 있습니다.

test {
  jvmArgs "-noverify"
}

0

이 오류는 Mockito를 사용하여 최종 클래스모의 할 때 발생할 수 있습니다 .

대신 Mockito 인라인 또는 Powermock을 사용하는 것이 좋습니다.


-1

파헤쳐 서 미안하지만 같은 문제를 만났고 더 간단한 해결책을 찾았습니다.

Java 컴파일러 옵션에서 "사용하지 않는 (읽지 않음) 로컬 변수 보존" 을 선택 취소해야 하므로 대상 JVM 버전을 다시 변경할 필요가 없습니다.

이전 Eclipe 버전의 버그 인 것 같습니다.


그것은 나를 위해 작동하지 않습니다. 내 오류의 요점은 다음과 같습니다. gist.github.com/ZiglioNZ/bd1d7d424727b3f26c64
ZiglioUK

3
OP는 Eclipse를 언급하지 않습니다. 그는 그것을 사용하지 않을 수도 있습니다.
Don Branson

-3

코드를 직접 빌드하는 경우 Java 컴파일러에 "-target 1.5"를 제공하거나 IDE 또는 빌드 구성에서 해당 옵션을 설정하여이 문제를 해결할 수 있습니다.


-11

이 링크는 도움이됩니다. java.lang.VerifyError : 스택 맵 프레임이 필요합니다.

가장 간단한 방법은 JRE를 6으로 변경하는 것입니다.


7
간단한 JVM 인수로 해결할 수있을 때 다운 그레이드? 단순함에 대한 당신의 정의를 의심합니다.
Visionary Software Solutions

1
이 이론적으로 질문에 대답 할 수 있습니다 동안, 바람직 할 것이다 여기에 대한 대답의 본질적인 부분을 포함하고 참조 할 수 있도록 링크를 제공합니다.
Joachim Sauer 2013 년

이것은 해결 방법입니다. Joachim이 말했듯이 작동 할 수는 있지만 Java 7을 사용해야하는 팀 또는 코드 기반에 대한 문제 나 도움말을 정의하지는 않습니다
Crowie

연결된 질문에 여러 답변이 있습니다. 다운 그레이드는 나열된 옵션 중 하나 일뿐입니다.
오우거 시편 33
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.