web-dev-qa-db-ja.com

java.lang.VerifyError:ブランチターゲットJDK 1.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)
83
John

Java 7ではより厳密な検証が導入され、クラス形式が少し変更されました。コードが正しいことを検証するために使用されるスタックマップが含まれるようになりました。表示される例外は、一部のメソッドに有効なスタックマップがないことを意味します。

Javaバージョンまたはバイトコードインストルメンテーションの両方が原因である可能性があります。通常、これは、アプリケーションが使用するライブラリが、より厳密な検証に合格しない無効なバイトコードを生成することを意味します。そのため、開発者はそれをライブラリのバグとして報告する以外に何もできません。

回避策として、検証を無効にするために-noverifyをJVM引数に追加できます。 Java 7では、-XX:-UseSplitVerifierを使用して厳密性の低い検証方法を使用することもできましたが、そのオプションはJava 8で削除されました。

161
Mirko Adari

Java 1.8を使用している場合は、XX:-UseSplitVerifierを削除し、JVMプロパティで-noverifyを使用します。

14
Anand Kumar K K

私はこの問題にぶつかり、本当に機能するフラグ-noverifyを使用してみました。これは、新しいバイトコード検証ツールによるものです。したがって、フラグは本当に機能するはずです。 JDK 1.7を使用しています。

注:JDK 1.8を使用している場合、これは機能しません。

8
Charan Raj

-noverify JVM引数をテストタスクに渡します。 gradleを使用している場合、build.gradleには次のようなものがあります。

test {
  jvmArgs "-noverify"
}
2
Leo

問題の原因となっているファイル間の唯一の違いは、ファイルの8バイト目です

CA FE BA BE 00 00 00 33-Java 7

vs.

CA FE BA BE 00 00 00 32-Java 6

-XX:-UseSplitVerifierを設定すると、問題が解決します。ただし、この問題の原因は https://bugs.Eclipse.org/bugs/show_bug.cgi?id=339388 です

2
A Kunin

掘ってすみませんが、私は同じ問題に出会い、よりシンプルな解決策を見つけました。

Javaコンパイラオプションでは、「未使用(読み込まない)ローカル変数を保持」のチェックを外す必要があるため、ターゲットJVMバージョンを元に戻す必要はありません。

これは、古いEclipeバージョンのバグのようです。

0
scoro