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属性で新しいタイプチェッカーを使用する」と表示されています。わかりませんでした。
ジョン

2
したがって、このエラーが表示された場合:これはJVMまたは私のコード内のバグですか?
ベントラー2013年

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


8

私はこの問題に遭遇し、-noverify実際に機能するフラグを使用してみました。これは、新しいバイトコード検証機能が原因です。したがって、フラグは実際に機能するはずです。JDK 1.7を使用しています。

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


3
フラグを修正して使用した場合、ランタイムとしてJRE 8を使用してAndroidユニットテストを実行しました。
ubuntudroid 2015

2
-noverifyもJava 8で動作しました。Androidにgradleを使用しているので、-noverifyフラグを、stackoverflow.com
a / 37593189/2848676

どこに-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については触れていません。彼もそれを使用していない可能性があります。
Don Branson

-3

自分でコードをビルドしている場合、この問題は、「-target 1.5」をJavaコンパイラーに与える(またはIDEまたはビルド構成で対応するオプションを設定する)ことで解決できます。


-11

このリンクは役に立ちます。 java.lang.VerifyError:スタックマップフレームが必要です

最も簡単な方法は、JREを6に変更することです。


7
単純なJVM引数で修正できる場合のダウングレード?私はあなたの単純な定義を疑います。
ビジョナリーソフトウェアソリューション

1
これは理論的には質問に答えることができますが、ここに答えの本質的な部分を含め、参照用のリンクを提供することが望ましいでしょう
Joachim Sauer

これは回避策です。ヨアヒムが言ったように、それはうまくいくかもしれませんが、Java 7を使用しなければならないチームやコードベースの問題やヘルプを定義するものではありません
Crowie

リンクされた質問には複数の回答があります。ダウングレードはリストされたオプションの1つにすぎません。
Ogre Psalm33 2014年
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.