web-dev-qa-db-ja.com

Tomcatは2つのWebアプリにある場合、同じライブラリファイルをメモリに2回ロードしますか?

Tomcat/webappsフォルダーの下に2つのアプリケーションがあります。

Tomcat/webapps/App1
Tomcat/webapps/App2

両方のアプリケーションは同じライブラリを共有します。たとえば、Tomcat/webapps/App1/WEB-INF/libに保存されます。

両方のライブラリがメモリに2回ロードされていますか?

これらの共有ライブラリをTomcat/server/libに配置する必要がありますか?

49
Sergio del Amo

here を見るとわかるように、Tomcatはサーバー上のWebアプリケーションごとに1つのクラスローダーを作成します。したがって、同じライブラリを共有するwebapp1とwebapp2がある場合、このライブラリは実際に2回ロードされます。

Tomcatサーバーで実行されるallwebappsによって共有されている場合、最終的にこのライブラリを共通ディレクトリ(Tomcat-dir/common/lib)に配置できます。 。

38
Romain Linsolas

Jarファイルを共有フォルダーに配置することはお勧めしません。たとえば、WEB-INFフォルダーに新しいバージョンのjarファイルを持つサードパーティアプリケーションをデプロイする必要があるとしましょう。このアプリケーションの場合、jarのクラスは(同じ名前でも)2回ロードされます。1つは共有フォルダーから、もう1つはWebアプリフォルダーからです。この状況では、バグを見つけるのが非常に困難になる場合があります。

JarファイルがWebアプリフォルダーにある場合、それらは別々のクラスローダーによってロードされ、互いに干渉しません。

29
kgiannakakis

経験から:2つのWebアプリは完全に分離されています-一方のライブラリは別のライブラリでは使用されません-したがって、最初の質問に答えるために-はい、それらは2回読み込まれます。

これらのライブラリをTomcatの共有ディレクトリに展開するかどうかという2番目の質問に答えるために、私はノーと言いますが、これが理由です。

ライブラリJarを共有場所(T​​omcat/server/lib)にデプロイすると、そのバージョンのライブラリが、Tomcatのインスタンスの下で実行されているすべてのWebアプリケーションのデフォルトになります。 Tomcatアーキテクチャのこの概要 からわかるように、クラスローダーは「連鎖的に」動作します。個々のWebアプリのlibフォルダーは、クラスをスローする前に見る最後の場所です-not-found例外。これはTomcat 6およびTomcat 7には当てはまりません。Webアプリのlibおよびclasssフォルダー内のすべてのクラスは、共通の前に解決されるため、したがって、これにより、すべてのjarファイルを戦争で展開する他のアプリが破損することはありません 2

そのため、そのディレクトリに共有ライブラリをデプロイする際の問題は、個々のアプリケーションが相互に分離されているため、アーキテクチャが破壊されることです。最初の例では問題ありませんが、サードパーティアプリケーションをデプロイする場合(たとえば、特定のコンテンツを処理するためにポートレットを使用するアプリを実行している場合)、バージョン依存関係の問題がすぐに発生します-ライブラリの共有バージョンはサードパーティのアプリケーションには正しくありませんが、パッケージが既にロードされているため、例外を左右および中央にスローします。

8
Ian

Tomcat6を使用しており、Tomcatにすべてのwebappが必要とする共通ライブラリを詰め込む良い方法を見つけています。

conf/catalina.propertiesエントリcommon.loaderで編集します。例えば。 'mylibs'を共有したいjarを追加したフォルダーを追加します

common.loader=${catalina.base}/lib,${catalina.base}/lib/*.jar,
              ${catalina.home}/lib,${catalina.home}/lib/*.jar,
              {catalina.home}/mylibs/*.jar

次に、すべての共通ライブラリをそこに配置します。できた.

すべてのwebapps(WARファイル)でWEB-INF/libの代わりにmylibsフォルダーを使用し始めたのはなぜですか?

WARが50MBを超えた後、展開は悪夢になり始めました!

決してjarバージョンのwebappを持っている場合でも、それをWEB-INF/libに入れて、mylibsにあるものを上書きできます。

6
Toni Bünter

ライブラリを2回ロードしたくない場合は、次の場所に置きます。

  • Tomcat 6:$CATALINA_HOME/lib
  • Tomcat 5:$CATALINA_HOME/common/lib

(質問から削除し、ここにコピーして投票/コメントできるようにする)

3
Kevin Panko

ヒープのPermGenスペースは、Javaのクラスおよびクラスに関するメタデータを格納するために使用されます。

エラーJava.lang.OutOfMemoryError:PermGenスペースは頻繁に発生する可能性があります。これは、Apache Tomcatで多数の重複ライブラリをロードしているため、誰でも詳細について共有できます。

0
mayank agrawal