tomcat/webapps
フォルダ の下に 2 つのアプリケーションがあります。
tomcat/webapps/App1
tomcat/webapps/App2
両方のアプリケーションが同じライブラリを共有します。たとえば、に保存されtomcat/webapps/App1/WEB-INF/lib
ます。
両方のライブラリがメモリに 2 回読み込まれていますか?
これらの共有ライブラリを に配置する必要がありtomcat/server/lib
ますか?
tomcat/webapps
フォルダ の下に 2 つのアプリケーションがあります。
tomcat/webapps/App1
tomcat/webapps/App2
両方のアプリケーションが同じライブラリを共有します。たとえば、に保存されtomcat/webapps/App1/WEB-INF/lib
ます。
両方のライブラリがメモリに 2 回読み込まれていますか?
これらの共有ライブラリを に配置する必要がありtomcat/server/lib
ますか?
ここでわかるように、Tomcat はサーバー上の Web アプリケーションごとに 1 つのクラスローダーを作成します。したがって、同じライブラリを共有する webapp1 と webapp2 がある場合、このライブラリは実際に 2 回読み込まれます。
Tomcat サーバーで実行されるすべての Web アプリケーションで共有されている場合は、最終的にこのライブラリを共通ディレクトリ (tomcat-dir/common/lib) に配置できます。
jar ファイルを共有フォルダーに配置することはお勧めしません。たとえば、将来、WEB-INF フォルダーに新しいバージョンの jar ファイルがあるサードパーティ アプリケーションをデプロイする必要があるとします。このアプリケーションでは、jar のクラスが 2 回 (同じ名前であっても) ロードされます。1 つは共有フォルダーから、もう 1 つは Web アプリ フォルダーからです。この状況により、バグを見つけるのが非常に困難になる場合があります。
jar ファイルが Web アプリ フォルダーにある場合、それらは個別のクラス ローダーによって読み込まれ、互いに干渉しません。
経験から:2つのWebアプリは互いに完全に分離されています-一方のライブラリは別のアプリでは使用されていません-したがって、最初の質問に答えるために-はい、2回ロードされます.
これらのライブラリを Tomcat の共有ディレクトリにデプロイする必要があるかどうかという 2 番目の質問に答えるために、私はノーと答えます。理由は次のとおりです。
ライブラリ Jar を共有の場所 (tomcat/server/lib) にデプロイすると、そのバージョンのライブラリが、Tomcat のそのインスタンスで実行されるすべての Web アプリケーションのデフォルトになります。このtomcat アーキテクチャの概要からわかるように、クラスローダーは「チェーンを下って」動作し、個々の Web アプリの lib フォルダーが、class-not-found 例外をスローする前に最後に検索する場所になります。これは、Tomcat 6 と Tomcat 7 には当てはまりません。Web アプリの lib および classes フォルダー内のクラスは、共通のクラスの前に解決されるため、war 2ですべての jar をデプロイする他のアプリが壊れることはありません。
したがって、共有ライブラリをそのディレクトリにデプロイする問題は、個々のアプリケーションが互いに分離されているためのアーキテクチャが壊れることです。最初の例では問題ありませんが、サードパーティのアプリケーションをデプロイする場合 (たとえば、特定のコンテンツを処理するためにポートレットを使用するアプリを実行している場合)、バージョンの依存関係の問題にすぐに遭遇します - ライブラリの共有バージョンがサードパーティのアプリケーションには正しくありませんが、パッケージが既に読み込まれているため、左右中央に例外がスローされます。
私たちはtomcat6を使用しており、Tomcat にすべての Web アプリケーションに必要な共通ライブラリを詰め込む良い方法を見つけました。
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
次に、すべての共通ライブラリをそこに置きます。終わり。
すべての Web アプリケーション (WAR ファイル) で WEB-INF/lib の代わりにmylibsフォルダーを使用し始めたのはなぜですか?
WAR が 50MB の境界を越えた後、展開は悪夢になり始めました!
jar を使用しないバージョンの webapp がある場合でも、それをWEB-INF/libに入れて、 mylibsにあるものを上書きできます。
PermGen ヒープの領域は、Java でクラスとクラスに関するメタデータを格納するために使用されます。
エラー java.lang.OutOfMemoryError: PermGen スペースが頻繁に発生する可能性があります。これは、Apache Tomcat に多数の重複したライブラリをロードしているためです。