1. ホーム
  2. java

[解決済み] 予期しない例外: java.lang.NoClassDefFoundError: org/apache/log4j/LogManager

2022-02-19 05:41:50

質問

GWTアプリケーションを開発しています。RPCを使用して、内部システムから情報を収集しています。これは、alpha.jarと呼ばれるライブラリjarを使用することによって行われます。私たちは多くのアプリケーションでこのjarを使用しているので、問題なく動作しています。

alpha.jarのいくつかのクラスは、LOG4J2や他の多くの外部jarを参照しています。 アプリケーションを実行するときに、これらすべてのクラスパスを渡すと、すべてがうまくいきます。 . これは単純な初心者の問題ではないことに注意してください。alpha.jarはLog4Jの呼び出しを含め、正常に動作しています。

問題点は

Eclipseには、このGWTアプリケーションのプロジェクトと、Alpha.jarプロジェクト(もちろんソースコード付き)があります。サーバー部分は、Alphaオブジェクトをインスタンス化し、Alphaシステムと通信する必要があります。

Alphaプロジェクトにbuild-path-referenceを追加してGWTでこれを行うと、私のGWTアプリは正常に実行されます。

プロジェクトリファレンスの代わりにalpha.jarをinclude(war/WEB-INF/libに)してアプリを実行すると、alpha.jarから初めてクラスをインスタンス化するときに表題のエラーが発生します。

alpha.jarのビルドの仕方にクセはないので、基本的にはeclipseのプロジェクトと同じものでいいんですよね?

以下のことに注意してください。

*) alpha.jarの依存jarもwar/WEB-INF/libにあります。 log4j2-core、log4j-api、その他多数(例えばapache common)です。

*) alpha.jar(とそれを呼び出すコード)を削除して、代わりにLOG4J2を呼び出すコードだけを追加すると、そのコードも問題なく動作するようになりました

JARを使用すると、どうしてこのような変なエラーが出るのですか?NoClassDefFoundErrorにも注意してください。一般的なClassNotFoundExceptionではありません。参照してください。 NoClassDefFoundErrorとClassNotFoundExceptionの原因と違いは何ですか?

もっと情報が必要なら教えてください。

解決方法は?

org.apache.log4j.LogManager は、log4j 1.2 のクラスです (log4j2 ではありません)。

したがって、Web アプリの jar のいずれかがそれを参照している必要があります。スタックトレースを見れば、その原因がわかるはずです。

あなたの状況によっては、2つのバージョンは互いに完全に独立しているので、ウェブアプリにlog4j 1.2のjarを追加するだけでもいいかもしれません。