2

私は、他のコードの中でも特に多数のサーブレットを含むアプリケーションの開発に取り組んでいます。私が使用している開発環境は Eclipse (3.2.1、かなり古い) であり、タスク用の Eclipse Tomcat Wrapper プラグインを使用して Tomcat サーバー (5.5.23、これもかなり古い) を実行しています。これらはすべて、RedHat 5.2 Linux システムで実行されます。

私が使用している Java ランタイムは JDK 1.6.0(21) です。これはごく最近 (以前の JDK 1.5 バージョンから) アップグレードしたもので、覚えている限りでは、上記のソフトウェアの組み合わせ (使用しているアプリケーションと一緒に) ) 実際に動作しました: Tomcat サーバーを起動できました。エラーや苦情なしで起動し、アプリケーションのサーブレットはポート 8080 で利用できました。

ただし、どこかで何かが変更されています (アプリケーションの jar ファイル自体にある可能性があります。ホスト上のすべてのものが根本的な原因であるとは思えません)。ここで、Tomcat サーバーを起動しようとするとsun.misc.InvalidJarIndexException、コンソール出力にエラーが表示されます。これは、次のクラスとメソッドで発生します。

  • org.apache.commons.modeler.Registry registerComponent(3回発生)
  • org.apache.catalina.core.StandardServer initialize(1回発生)
  • org.apache.catalina.connector.Connector start(2回あります)

Java クラスの JAR が有用であることを確認する方法に関するこのスタック オーバーフローの質問を見つけました。また、提案された問題のある JARS を追跡するために数回実行しfind /usr -name \*name-of-suspected-jar\*.jarました。また、Eclipse で Tomcat サーバーのランタイム構成を確認しようとしましたが、システム上の JAR ファイルと、CLASSPATHどちらの Tomcat ランタイム セットアップ (またはCLASSPATHEclipse の起動時に環境で使用される) とも一致しませんでした。 その努力には、おそらく私の側でもう少し厳密さが必要ですが、それを行う前に(そのため、現在、 s に関するすべての詳細をCLASSPATHここに投稿していません)、実際に何が起こっているのかを正確に読み上げましたInvalidJarIndexException.

そのため、JAR ファイルには、JAR ファイルで検索するクラス (およびメソッド) に関する情報を含むオプションの INDEX.LIST ファイルが含まれる場合があります。CLASSPATHアイデアは、多くの状況で役立つすべての JARS で検索を短絡することです。問題は、INDEX.LISTファイルが破損している (または破損していると思われる) 場合で、クラスのロードが完全に放棄され (クラスローダーは .xml 内のすべての JAR を検索するようにフォールバックしませんCLASSPATH)、エラーが発生InvalidJarIndexExceptionします。投げられる。さらに厄介なことに、JAR が検索される順序は、クラス ローダーがINDEX.LISTファイルを処理する方法に影響を与える可能性がありINDEX.LISTます。1 つの JAR のファイルが他の JARS を参照する可能性があり、JARS を参照するファイルが最初の JAR と同期していない場合INDEX.LISTファイルの場合、クラス ローダーはこのInvalidJarIndexExceptionエラーで失敗します。

したがって (このStackOverflowの質問によると)、このエラーは、JAR ファイルに破損INDEX.LISTした .以前に検索された JAR がクラス ローダーを混乱させたためです。(別の言い方をすれば、この例外は、システムの他の場所に違反者がいるために、「無実の」破損していない JAR ファイルに対してもスローされる可能性があります)。INDEX.LISTINDEX.LIST

それで、単なる小説を書いた後、ここに私の主要な一連の質問があります:

  • それぞれがスローされる正確な.jarファイルを追跡する最良の方法は何ですか?InvalidJarIndexException
  • .jarランダムに選択されたファイルにファイルがあるかどうかを確認する最善の方法は何INDEX.LISTですか? このタスクにはどのようなツールがありますか?
  • ファイルの検索順序を自動的に推測する効率的な方法はあり.jarますか? 手動でフォローすることもできますCLASSPATHが、正直なところ、エラー発生しやすく、面倒です。
  • クラスローダーを混乱させて、検索の後半で.jar無実の破損していないファイルが不正なファイルであると非難する可能性がある、検索順序にある​​ファイルを把握する効率的な方法はありますか?.jarINDEX.LIST

免責事項: 私は古いバージョンのソフトウェアを実行していることを知っています (Redhat 5.2 の最新の更新プログラムがインストールされている場合でも)。多くの人が、これをデバッグするのに何の努力もしていないことを提案するのが反射的な反応であることを知っています。代わりに、Tomcat、Eclipse、および Linux のより新しいバージョンにアップグレードします (Java は最近のものです)。そうしたくない理由は、物事を調べた結果、アップグレードを行ったり、現在使用している RHEL5.2 提供の Tomcat/Eclipse の隣に別の最新の Tomcat または Eclipse をインストールしようとしたりするのはかなり面倒だとわかったからです。また、この種のトラブルシューティングは、Java とそれに関連するツールや機能について、役に立つ核心的な詳細を学ぶ機会だと考えています。クラスのロードがどのように機能し、何がこれをスローするのかを理解するInvalidJarIndexException私のシステムでは非常に教育的です!

(しかし、このトラブルシューティングが失敗した場合は、最新の Linux、Eclipse、および Tomcat を使用することを真剣に検討します...約束します)

4

2 に答える 2

2

問題を診断するには、次の手順を実行します。

  1. Eclipse に例外ブレークポイント (感​​嘆符アイコンが付いた J) を追加し、 InvalidJarIndexExceptionタイプのキャッチされた例外とキャッチされなかった例外に対して停止するように設定します。
  2. プログラムのデバッグを開始します。

InvalidJarIndexExceptionがスローされると、Eclipse は例外ブレークポイントで停止します。URLClassPath のソースがなくても、URLClassPath が検索しようとしているクラスの名前など、例外の原因となったスタック上の変数を調べることができます。クラスの名前がわかれば、調べる必要のある JAR のリストが大幅に絞り込まれます。

おそらく、新しいクラスをパッケージにローカルで追加しましたが、そのパッケージの内容は、クラスパス上の古い JAR のインデックス ファイルによって記述されていますか?

于 2011-08-03T20:42:28.650 に答える
1

jar の優れたレポート ツールであるTattletaleを試してください。この場合、InvalidJarIndexException が発生しなくなるまで、jar から INDEX.LIST を 1 つずつ削除しました。

于 2011-09-07T11:02:46.783 に答える