web-dev-qa-db-ja.com

Java 7 EclipseでのJVM VerifyError

JDK 7を使用してEclipse Indigoでプロジェクトをコンパイルすると、次のエラーダイアログが表示されます

enter image description here

次のスタックトレース

Exception in thread "main" Java.lang.VerifyError: Expecting a stackmap frame at branch target 32 in method ... at offset 0
    at Java.lang.Class.getDeclaredMethods0(Native Method)
    at Java.lang.Class.privateGetDeclaredMethods(Unknown Source)
    at Java.lang.Class.getMethod0(Unknown Source)
    at Java.lang.Class.getMethod(Unknown Source)
    at Sun.launcher.LauncherHelper.getMainMethod(Unknown Source)
    at Sun.launcher.LauncherHelper.checkAndLoadMain(Unknown Source)

私は関連するバグ here を見つけ、jvmオプション-XX:-UseSplitVerifierを使用するという推奨される回避策を使用しました。

なぜこれが起こっているのか、なぜ回避策が機能するのか誰にも分かりますか?

- 注意 -

プロジェクトはJDK 6を使用して正常にコンパイルされます。

33
mre

Bug 353467-XX:-UseSplitVerifierを使用して古いベリファイアをアクティブにする」について説明しています。
これは、そのオプションを次のように説明する JDK TM 6導入ガイド と一致しています。

従来のベリファイアは-XX:-UseSplitVerifierフラグで強制できます。

バージョン50.0クラスファイルのStackMapTable属性がないか、正しくない場合、VerifyError例外が発生する可能性があります。
バージョン50.0クラスファイルのバイトコードを書き換え、StackMapTableを正しく更新しないツールは、例外の検証とトリガーに失敗する場合があります。

したがって 2011-10-03からのコメント はそれを指摘しています:

AspectJは、クラスがJava7の場合、以前はオプションであった設定を自動的にアクティブにしてスタックマップを作成します。

27
VonC

この問題が発生したときに、プロジェクトからJDK 1.7システムライブラリを削除して修正し、代わりに1.6 JDKライブラリを追加しました。私は再びプロジェクトを実行しに行きましたが、エラーは発生しませんでした。 JDK 1.7ライブラリを再度追加したとき、それはまだ機能します。そのため、「スワッピング」で何かが機能します。

1
pauwel

Junoでこの問題に遭遇しましたが、4.2アップデートサイトから最新の4.2バージョンをインストールすることで解決しました:

http://www.Eclipse.org/ajdt/downloads/

これは@VonCが1年前に提供したものと同じですが、更新されたAspectJが存在するため(ただし、最新のJunoリポジトリにも、Springに付属するものにも含まれていません)、これが答えになります。

しかし、@ VonCの功績です。

これは3.8と4.2で機能するはずです。

0
Bob Kerns

現在、私の環境はEclipse 4.2 juno(SR2)を使用したjdk 1.7(j2sdk 1.7 update 21)です。同じ問題があったため、VM argumentsオプション '-XX:-UseSplitVerifierを構成するように修正しました'しかし、google-app-engineに基づいて製品をデプロイするときに大きな問題が発生しました。

最後にJava 6(update 43)を変更しました

0
SMJ