java.lang.VerifyError が発生する原因
-
01-07-2019 - |
質問
以下のことを調べています java.lang.VerifyError
java.lang.VerifyError: (class: be/post/ehr/wfm/application/serviceorganization/report/DisplayReportServlet, method: getMonthData signature: (IILjava/util/Collection;Ljava/util/Collection;Ljava/util/HashMap;Ljava/util/Collection;Ljava/util/Locale;Lorg/apache/struts/util/MessageRe˜̴Mt̴MÚw€mçw€mp:”MŒŒ
at java.lang.Class.getDeclaredConstructors0(Native Method)
at java.lang.Class.privateGetDeclaredConstructors(Class.java:2357)
at java.lang.Class.getConstructor0(Class.java:2671)
これは、サーブレットがデプロイされている jboss サーバーが起動されるときに発生します。これは jdk-1.5.0_11 でコンパイルされており、jdk-1.5.0_15 で再コンパイルしようとしましたが成功しませんでした。つまり、コンパイルは正常に実行されますが、デプロイ時に java.lang.VerifyError が発生します。
メソッド名を変更すると次のエラーが発生しました。
java.lang.VerifyError: (class: be/post/ehr/wfm/application/serviceorganization/report/DisplayReportServlet, method: getMD signature: (IILjava/util/Collection;Lj ava/util/Collection;Ljava/util/HashMap;Ljava/util/Collection;Ljava/util/Locale;Lorg/apache/struts/util/MessageResources ØÅN|ØÅNÚw€mçw€mX#ÖM|XÔM
at java.lang.Class.getDeclaredConstructors0(Native Method)
at java.lang.Class.privateGetDeclaredConstructors(Class.java:2357
at java.lang.Class.getConstructor0(Class.java:2671)
at java.lang.Class.newInstance0(Class.java:321)
at java.lang.Class.newInstance(Class.java:303)
より多くのメソッド シグネチャが表示されていることがわかります。
実際のメソッドのシグネチャは次のとおりです。
private PgasePdfTable getMonthData(int month, int year, Collection dayTypes,
Collection calendarDays,
HashMap bcSpecialDays,
Collection activityPeriods,
Locale locale, MessageResources resources) throws Exception {
すでにそれを見てみました javap
これにより、メソッドのシグネチャが本来のとおりに得られます。
他の同僚がコードをチェックアウトし、コンパイルしてデプロイすると、同じ問題が発生します。ビルド サーバーがコードを取得し、それを開発環境またはテスト環境 (HPUX) にデプロイすると、同じエラーが発生します。また、Ubuntu を実行している自動テスト マシンでも、サーバーの起動時に同じエラーが表示されます。
アプリケーションの残りの部分は正常に動作しますが、その 1 つのサーブレットだけが故障しています。どこを見ればよいかアイデアがあれば役に立ちます。
解決
java.lang.VerifyError
これは、実行時に使用しているライブラリとは異なるライブラリに対してコンパイルした場合に発生する可能性があります。
たとえば、Xerces 1 に対してコンパイルされたプログラムを実行しようとしたときに、Xerces 2 がクラスパス上で見つかったときに、これが発生しました。必要なクラス ( org.apache.*
名前空間) が実行時に見つかったので、 ClassNotFoundException
だった ない 結果。クラスとメソッドに変更があったため、実行時に見つかったメソッドのシグネチャがコンパイル時のシグネチャと一致しませんでした。
通常、コンパイラはメソッド シグネチャが一致しない問題にフラグを立てます。JVM はクラスがロードされるときにバイトコードを再度検証し、スローします。 VerifyError
バイトコードが許可されるべきではないことを実行しようとしている場合 -- 例:を返すメソッドを呼び出す String
そして、その戻り値を、 List
.
他のヒント
java.lang.VerifyError
最悪です。
メソッドのバイトコード サイズが 64 kb の制限を超えると、このエラーが発生します。しかし、おそらくあなたはそれに気づいていたでしょう。
このクラスがアプリケーションの他の場所 (別の jar など) のクラスパスに存在しないと 100% 確信していますか?
また、スタックトレースから、ソース ファイルの文字エンコーディング (utf-8
?) あれは正しいですか?
Kevin Panko 氏が言ったように、それは主にライブラリの変更によるものです。したがって、場合によっては、プロジェクト (ディレクトリ) を「クリーン」してからビルドすることでうまくいきます。
ここで説明されているように、インポートしていたプロジェクトをライブラリにすることで、Android でこのエラーを修正しました http://developer.android.com/tools/projects/projects-eclipse.html#SettingUpLibraryProject
以前は、プロジェクトを参照するだけで (ライブラリにしないで)、この奇妙な VerifyError が発生していました。
誰かの役に立てば幸いです。
試してみてはいかがでしょうか -Xverify:all
これはロード時にバイトコードを検証し、バイトコードが無効な場合には役立つエラー メッセージを表示することがあります。
VerifyError は、クラス ファイルに構文的には正しいが、セマンティック制限に違反するバイトコードが含まれていることを意味します。メソッド境界を越えるジャンプターゲット。
基本的に、VerifyError はコンパイラのバグがある場合、またはクラス ファイルが他の何らかの方法で破損した場合にのみ発生します (例:RAM の故障または HD の故障による)。
別の JDK バージョンおよび別のマシンでコンパイルしてみてください。
私の場合、Android プロジェクトは Java 7 用にコンパイルされた別の Java プロジェクトに依存しています。 java.lang.VerifyError
その Java プロジェクトのコンパイラ準拠レベルを 6.0 に変更したら消えました
後で、これが Dalvik の問題であることがわかりました。 https://groups.google.com/forum/?fromgroups#!topic/android-developers/sKsMTZ42pwE
この問題は、pack200 がクラス ファイルをマングリングするために発生していました。少し検索してみたらこれになりました Javaのバグ 上。基本的には設定 --effort=4
問題が解決しました。
Java 1.5.0_17 を使用しています (ただし、私が試した Java 1.5 のすべてのバリアントで発生しました)。
を置き換えることで、同様の java.lang.VerifyError 問題を修正しました。
catch (MagickException e)
と
catch (Exception e)
どこ MagickException
ライブラリ プロジェクトで定義されました (私のプロジェクトは依存関係があります)。
その後、私は java.lang.NoClassDefFoundError
同じライブラリのクラスについて(に従って修正されました) https://stackoverflow.com/a/9898820/755804 ).
これは、Android で Oracle の JDK に対してコンパイルされたライブラリをロードしようとしているときに発生する可能性があります。
ここに問題があります Ning 非同期 HTTP クライアント用。
私の場合、このブロックを削除する必要がありました。
compileOptions {
sourceCompatibility JavaVersion.VERSION_1_7
targetCompatibility JavaVersion.VERSION_1_7
}
近くでエラーが表示されていました Fragment.showDialog()
メソッド呼び出し。
エラーを生成する最小限の例
簡単な可能性の 1 つは、 ジャスミン, 、またはバイナリ ファイル エディタを使用してバイトコードを手動で編集します。
作成しましょう void
を使わない方法 return
命令(によって生成される) return;
Java のステートメント)、JVMS はこれは違法であると述べています。
ジャスミンでは次のように書くことができます。
.class public Main
.super java/lang/Object
.method public static main([Ljava/lang/String;)V
aload_0 ; Just so that we won't get another verify error for empty code.
.end method
次に、 javac Main.j
そして javap -v Main
私たちがコンパイルしたと言う:
public static void main(java.lang.String[]);
descriptor: ([Ljava/lang/String;)V
flags: ACC_PUBLIC, ACC_STATIC
Code:
stack=1, locals=1, args_size=1
0: aload_0
したがって、実際には返品の指示はありません。
さて、実行しようとすると java Main
我々が得る:
Error: A JNI error has occurred, please check your installation and try again
Exception in thread "main" java.lang.VerifyError: (class: NoReturn, method: main signature: ([Ljava/lang/String;)V) Falling off the end of the code
at java.lang.Class.getDeclaredMethods0(Native Method)
at java.lang.Class.privateGetDeclaredMethods(Class.java:2701)
at java.lang.Class.privateGetMethodRecursive(Class.java:3048)
at java.lang.Class.getMethod0(Class.java:3018)
at java.lang.Class.getMethod(Class.java:1784)
at sun.launcher.LauncherHelper.validateMainClass(LauncherHelper.java:544)
at sun.launcher.LauncherHelper.checkAndLoadMain(LauncherHelper.java:526)
Java コンパイラは暗黙的なエラーを追加するため、このエラーは通常 Java では発生しません。 return
に void
私たちにとってのメソッド。これが、を追加する必要がない理由です。 return
私たちのために main
メソッド。これは次のようにして確認できます javap
.
JVMS
VerifyError は、指定された特定の種類の不正なクラス ファイルを実行しようとすると発生します。 JVMS 7 4.5 章
JVMS によれば、Java がファイルをロードするときは、クラス ファイルを実行する前に一連のチェックを実行して、クラス ファイルに問題がないことを確認する必要があります。
このようなエラーは、Java コードの 1 回のコンパイルと実行サイクルでは生成されません。 JVMS 7 4.10 の言うこと:
Java プログラミング言語のコンパイラは、すべての静的および構造的制約を満たすクラス ファイルのみを生成する必要がありますが、[...】
したがって、最小限の失敗例を確認するには、次のようなコードを使用せずにソース コードを生成する必要があります。 javac
.
このページにはいくつかのヒントがあるかもしれません -http://www.zanthan.com/itymbi/archives/000337.html
そのメソッドの本体には、javac が検出できない微妙なバグがある可能性があります。方法全体をここに投稿しない限り、診断は困難です。
できるだけ多くの変数を最終変数として宣言することから始めることもできます...これは zanthan サイトで言及されているバグを捕捉するものであり、いずれにしても良い習慣となることがよくあります。
私の場合、プロジェクト A は別のプロジェクト、たとえば X に依存関係がありました (A は X で定義されたクラスの一部を使用していました)。したがって、 A のビルドパスに X を参照プロジェクトとして追加すると、このエラーが発生しました。ただし、参照プロジェクトとして X を削除し、X の jar をライブラリの 1 つとして含めると、問題は解決しました。
クラスパス上に同じ jar ファイルの複数のバージョンがあるかどうかを確認します。
たとえば、クラスパスに opennlp-tools-1.3.0.jar と opennlp-tools-1.5.3.jar があった場合、このエラーが発生しました。解決策は、opennlp-tools-1.3.0.jar を削除することでした。
CGLIB < 2.2 と JRE > 6 では同様のエラーが発生する可能性があります。 を参照してください。 「CGLIB 3.0 にアップグレードする必要がありますか?」 そしていくつかのコメント スプリング SPR-9669.
これは、JRE 6 ではすべてが正常に動作し、JRE7 に切り替えるだけで問題が発生する場合に特に当てはまります。
このエラーのもう 1 つの理由は、AspectJ <= 1.6.11 と JRE > 6 の組み合わせである可能性があります。
見る 日食のバグ 353467 そして キーカーチケット 307 詳細については。
これは、JRE 6 ではすべてが正常に動作していて、JRE7 に移行すると問題が発生する場合に特に当てはまります。
Maven で大量のモジュールをインポートした場合にも発生する可能性があります。まったく同じ名前 (同じ修飾名) を持つクラスが 2 つ以上存在します。このエラーは、コンパイル時と実行時の解釈の違いによって発生します。
Java7 に移行している場合、または Java7 を使用している場合、通常、このエラーが発生する可能性があります。上記のエラーに直面し、根本原因を見つけるのに非常に苦労しました。追加してみることをお勧めします 「-XX:-UseSplitVerifier」 アプリケーションの実行中の JVM 引数。
Kevin が述べた理由は正しいですが、他のことに移る前に必ず以下を確認してください。
- チェックしてください
cglibs
私のクラスパスで。 - チェックしてください
hibernate
クラスパス内のバージョン。
上記のバージョンのいずれかが複数ある場合、または競合するバージョンがある場合、問題のような予期しない問題が発生する可能性が高くなります。
java.lang.VerifyError は、コンパイルされたバイトコードが Android が見つけられないものを参照していることを意味します。この verifyError は次のようなものだけを発行します kitkat4.4 以下のバージョンは上記のバージョンに含まれていません 両方のデバイスで同じビルドを実行した場合でも。古いバージョンの jackson json パーサーを使用すると、java.lang.verifyerror が表示されます
compile 'com.fasterxml.jackson.core:jackson-databind:2.2.+'
compile 'com.fasterxml.jackson.core:jackson-core:2.2.+'
compile 'com.fasterxml.jackson.core:jackson-annotations:2.2.+'
次に、依存関係を次のように変更しました。 最新バージョン 2.2 ~ 2.7 なしで コアライブラリ, 、それならうまくいきます。これは、メソッドおよびその他のコンテンツを意味します。 芯 の最新バージョンに移行されます データバインド2.7. 。これで問題が解決しました。
compile 'com.fasterxml.jackson.core:jackson-annotations:2.7.0-rc3'
compile 'com.fasterxml.jackson.core:jackson-databind:2.7.0-rc3'
使用できないjarファイルを削除して実行してください。そしてそれは私にとっては機能します。私はjcommons jarファイルと別のjcommons.1.0.14 jarファイルを追加したので、jcommonsを削除すると、それは私のために機能します
私の場合、以下のスタックトレースで検証エラーが発生しました
jasperreports-server-cp-6.4.0-bin\buildomatic\build.xml:61: The following error occurred while executing this line:
TIB_js-jrs-cp_6.4.0_bin\jasperreports-server-cp-6.4.0-bin\buildomatic\bin\setup.xml:320: java.lang.VerifyError: (class: org/apache/commons/codec/binary/Base64OutputStream, method: <init> signature: (Ljava/io/OutputStream;ZI[B)V) Incompatible argument to function
at com.jaspersoft.jasperserver.crypto.KeystoreManager.createKeystore(KeystoreManager.java:257)
at com.jaspersoft.jasperserver.crypto.KeystoreManager.init(KeystoreManager.java:224)
at com.jaspersoft.buildomatic.crypto.KeystoreTask.execute(KeystoreTask.java:64)
at org.apache.tools.ant.UnknownElement.execute(UnknownElement.java:292)
at sun.reflect.GeneratedMethodAccessor4.invoke(Unknown Source)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:498)
at org.apache.tools.ant.dispatch.DispatchUtils.execute(DispatchUtils.java:106)
at org.apache.tools.ant.Task.perform(Task.java:348)
at org.apache.tools.ant.taskdefs.Sequential.execute(Sequential.java:68)
at org.apache.tools.ant.UnknownElement.execute(UnknownElement.java:292)
at sun.reflect.GeneratedMethodAccessor4.invoke(Unknown Source)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:498)
at org.apache.tools.ant.dispatch.DispatchUtils.execute(DispatchUtils.java:106)
at org.apache.tools.ant.Task.perform(Task.java:348)
at org.apache.tools.ant.Target.execute(Target.java:435)
at org.apache.tools.ant.helper.ProjectHelper2.parse(ProjectHelper2.java:169)
at org.apache.tools.ant.taskdefs.ImportTask.importResource(ImportTask.java:222)
at org.apache.tools.ant.taskdefs.ImportTask.execute(ImportTask.java:163)
at org.apache.tools.ant.UnknownElement.execute(UnknownElement.java:292)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:498)
at org.apache.tools.ant.dispatch.DispatchUtils.execute(DispatchUtils.java:106)
at org.apache.tools.ant.Task.perform(Task.java:348)
at org.apache.tools.ant.Target.execute(Target.java:435)
at org.apache.tools.ant.helper.ProjectHelper2.parse(ProjectHelper2.java:180)
at org.apache.tools.ant.ProjectHelper.configureProject(ProjectHelper.java:93)
at org.apache.tools.ant.Main.runBuild(Main.java:826)
at org.apache.tools.ant.Main.startAnt(Main.java:235)
at org.apache.tools.ant.launch.Launcher.run(Launcher.java:280)
at org.apache.tools.ant.launch.Launcher.main(Launcher.java:109)
commons-codec-1.3.jar のクラスパス エントリを削除することで問題を解決しました。この jar のバージョンと Jasper に付属しているものとの不一致がありました。