1. ホーム
  2. java

[解決済み] java.lang.VerifyErrorが発生する原因

2022-01-25 11:45:46

質問事項

以下のことを調査しています。 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 .