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)
Java 7ではより厳密な検証が導入され、クラス形式が少し変更されました。コードが正しいことを検証するために使用されるスタックマップが含まれるようになりました。表示される例外は、一部のメソッドに有効なスタックマップがないことを意味します。
Javaバージョンまたはバイトコードインストルメンテーションの両方が原因である可能性があります。通常、これは、アプリケーションが使用するライブラリが、より厳密な検証に合格しない無効なバイトコードを生成することを意味します。そのため、開発者はそれをライブラリのバグとして報告する以外に何もできません。
回避策として、検証を無効にするために-noverify
をJVM引数に追加できます。 Java 7では、-XX:-UseSplitVerifier
を使用して厳密性の低い検証方法を使用することもできましたが、そのオプションはJava 8で削除されました。
Java 1.8を使用している場合は、XX:-UseSplitVerifier
を削除し、JVMプロパティで-noverify
を使用します。
私はこの問題にぶつかり、本当に機能するフラグ-noverify
を使用してみました。これは、新しいバイトコード検証ツールによるものです。したがって、フラグは本当に機能するはずです。 JDK 1.7を使用しています。
注:JDK 1.8を使用している場合、これは機能しません。
-noverify
JVM引数をテストタスクに渡します。 gradleを使用している場合、build.gradle
には次のようなものがあります。
test {
jvmArgs "-noverify"
}
問題の原因となっているファイル間の唯一の違いは、ファイルの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 です
掘ってすみませんが、私は同じ問題に出会い、よりシンプルな解決策を見つけました。
Javaコンパイラオプションでは、「未使用(読み込まない)ローカル変数を保持」のチェックを外す必要があるため、ターゲットJVMバージョンを元に戻す必要はありません。
これは、古いEclipeバージョンのバグのようです。