2

Tomcat 6.0.18でWebアプリケーションをホストし、次の問題が発生しました。

WebApp1とWebApp2の2つのWebアプリがあり、どちらも同じシステムですが、バージョンが異なります。

ここで問題となるのは、Tomcatが1週間以上実行されている場合、システムがNoClassDefFoundErrorを返すことがあります。また、WebApp1のクラスローダーがWebApp2のjarに存在するクラスをロードするという奇妙な問題が発生しました。同じjarがWebApp1にも存在しますが、バージョンが異なります。

Tomcatを再起動すると、すべてが正常に機能し始めました。JREは1.5.10です

このような問題が発生した場合はお知らせください。

よろしく、ジャタンポレチャ

4

4 に答える 4

1

私はTomcatで多くの種類のクラスローダーの奇妙さに遭遇しました-自分でクラスローダーコードを実行しなくても、Tomcat自体が問題を引き起こすのは非常に簡単です。最も一般的な問題は、Webアプリケーションのアンロードとリロードを繰り返すと、クラスローダーがリークし、最終的にTomcatがメモリ不足になることです。

バージョンの不一致について私が見た最も一般的な理由は、TomcatがWebアプリケーションクラスパスで一部のクラスとjar(Tomcat自体の一部)が他のクラスよりも進んでいることを確認することです-commons-loggingが最も一般的な例のようです-そしてそれは可能です予期しないときにクラスローダーをロード、アンロード、または保持するため。

もう少し詳しく教えていただけますか?jarがサードパーティのものである場合、誰かが以前に問題を確認した可能性があります。それがあなた自身のjarである場合、アプリケーションにあなた自身のクラスローダーコードがありますか?

于 2008-11-25T17:54:45.330 に答える
1

コメントを追加するのに十分な担当者がまだいないので、別の回答を投稿する必要があります。:)

これはどうやら MailSender.class が個々の Web アプリケーションではなく Tomcat に読み込まれているようです。WebApp2 は最初にそれをロードし、WebApp2 にプライベートではないすべての Tomcat にロードされますが、機能します。WebApp1 がそのクラスを必要とする場合、Tomcat の親にロードされていることを既に認識しており、WebApp1 にプライベートなものをロードしようとはしません。

まず、Tomcat、JRE などのディレクトリをチェックして、それらのパスに jar またはクラスのコピーがあるかどうかを確認することをお勧めします。その後、2 つの jar ファイルのそれぞれからクラスを手動で削除し、Tomcat または Web アプリケーションを再起動して何が起こるかを確認します。失敗してスタック トレースが生成されることが予想され、クラスが最初に読み込まれた場所がわかります。誰がそれを読み込もうとしているか。(たとえば、クラス名から、クラスをロードするTomcat JVMにロードされたメールAPIがある可能性があります-WebアプリケーションではなくTomcatにロードされます)。

于 2008-11-25T19:17:46.613 に答える
1

Is there a particular reason you are hosting 2 versions of the exact same code on the same server?

Having 2 different jars with the exact same name, containing classes in the same namespace, and having identical class names seems like it would cause all sorts of issues (not the least of which is human error).

于 2008-11-25T19:23:24.073 に答える
0

回答ありがとうございます。

jar はシステムの一部であり、他のプロセスによって共有されるいくつかの共通クラスがあります。

その jar を comutils.jar と呼びましょう。シナリオは次のようになります。

WebApp1 (バージョン 1)
  | |
  |- comutils.jar (バージョン 1)
        | |
        |- MailSender.class (ver 1)


WebApp2 (バージョン 2)
  | |
  |- comutils.jar (バージョン 2)
        | |
        |- MailSender.class (バージョン 2)

この MailSender クラスはシングルトンです。

ここで、WebApp1 のコードが getInstance メソッドを使用してそのインスタンスを取得した後に MailSender のメソッドを呼び出すと、実際の呼び出しは ver 1 ではなく MailSender (ver 2) に移動することがあります。

これがあなたにいくつかのリードを与えることを願っています。

于 2008-11-25T18:42:56.777 に答える