2013-02-27 5 views
72

分岐ターゲットでスタックマップフレームを期待:はに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) 

答えて

147

のJava 7には、より厳格な検証を導入し、ビット—にクラスのフォーマットを変更しましたコードが正しいことを確認するために使用されるスタックマップを含みます。表示される例外は、一部のメソッドに有効なスタックマップがないことを意味します。

Javaバージョンまたはバイトコード計測器の両方が責任を負う可能性があります。通常、これは、アプリケーションによって使用されるライブラリが、厳密な検証に合格しない無効なバイトコードを生成することを意味します。したがって、ライブラリにバグとして報告する以外に、開発者が行うことができます。

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

+1

ですが、-XX:-UseSplitVerifierの意味は何ですか?私はoracleのexplainationを見ました。「StackMapTable属性を持つ新しいタイプのチェッカーを使用してください」と言います。私はそれを得ていない。 – John

+0

私の答えを変更しました。 –

+2

このエラーが表示された場合:これはJVMまたはコード内のバグですか? –

-11

このリンクは参考になりました。 java.lang.VerifyError: Expecting a stackmap frame

最も簡単な方法は、6

+6

で指定された場所に-noverifyフラグを設定しなければなりませんでしたか?私は単純なあなたの定義を疑う。 –

+1

これは理論的に質問に答えるかもしれませんが、答えの本質的な部分を含めることが望ましい(http://meta.stackexchange.com/q/8259)ので、参考のためのリンクを提供してください。 –

+0

これは回避策です。 Joachimが言ったように、うまくいくかもしれませんが、Java 7を使用しなければならないチームやコードベースの問題や助けを定義していません。 – Crowie

0

掘るために申し訳ありませんにJREを変更しているが、私は同じ問題に会ったとsimplierの解決策を見つけました。あなたがそのターゲットJVMのバージョンをバックに変更する必要がない「未使用(読んだことがない)ローカル変数を保持」をオフにする必要がありますJavaコンパイラオプション

古いEclipeのバグのようです。

+0

それは私のために働かない。私のエラーの要点は次のとおりです。https://gist.github.com/ZiglioNZ/bd1d7d424727b3f26c64 – ZiglioUK

+2

OPにはEclipseは含まれていません。彼はそれを使っていないかもしれない。 –

-3

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

7

この問題が発生し、実際に動作するフラグ-noverifyを試してみます。これは、新しいバイトコードベリファイアのためです。フラグが実際に機能するはずです。 JDK 1.7を使用しています。

注:Javaの1.8を使用している場合は、

+3

JRE 8をランタイムとして使用してAndroidユニットテストを実行して固定フラグを使用している私にとっては、 – ubuntudroid

+1

-noverifyもJava 8で動作しました。私はAndroid用のgradleを使用していますので、stackoverflow.com/a/37593189/2848676 –

+0

で指定された場所に-noverifyフラグを置く必要がありました。どこに-noverifyを設定しましたか?私はMAVEN_OPTSとして設定しましたが、私のために働いていません – dev

13

JDK 1.8を使用している場合、これは動作しないだろう、XX:-UseSplitVerifierを削除して、JVMのプロパティで-noverifyを使用しています。

2

問題の原因はファイルの8バイト目があると、ファイルの唯一の違いは、

CA FE BAは00 00 00 33 BE - Javaは7

CA FE BA BE 00 00 00 32 - Java 6

設定-XX:-UseSplitVerifierは、この問題を解決します。しかし、この問題の原因はhttps://bugs.eclipse.org/bugs/show_bug.cgi?id=339388

関連する問題