Tomcatは2つのWebアプリにある場合、同じライブラリファイルをメモリに2回ロードしますか?
-
06-07-2019 - |
質問
tomcat / webapps
フォルダーの下に2つのアプリケーションがあります。
tomcat/webapps/App1
tomcat/webapps/App2
両方のアプリケーションは同じライブラリを共有します。たとえば、 tomcat / webapps / App1 / WEB-INF / lib
に保存されます。
両方のライブラリがメモリに2回ロードされていますか?
これらの共有ライブラリを tomcat / server / lib
に配置すべきですか?
解決
こちらを見るとわかるように、Tomcatはサーバー上のwebappごとに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フォルダーは、クラスが見つからない例外をスローする前に最後に見る場所です。これはTomcat 6およびTomcat 7には当てはまりません。Webアプリのlibおよびclasssフォルダ内のクラスは、共通のクラスよりも前に解決されるため、すべてのクラスをデプロイする他のアプリを破壊することはありません。戦争の瓶 2 。
そのため、そのディレクトリに共有ライブラリをデプロイする際の問題は、個別のアプリケーションが相互に分離されているためにアーキテクチャを壊すことです。最初の例では問題ありませんが、サードパーティアプリケーションをデプロイする場合(たとえば、特定のコンテンツを処理するためにポートレットを使用するアプリを実行している場合)、バージョン依存関係の問題にすぐに遭遇します-ライブラリの共有バージョンはサードパーティのアプリケーションに対しては正しくありませんが、パッケージが既にロードされているため、左右および中央に例外がスローされます。
tomcat6 を使用しており、webappに必要なすべての共通ライブラリをTomcatに詰め込む良い方法を見つけています。
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を超えた後、展開は悪夢になり始めました!
Never jarバージョンのwebappがある場合でも、 WEB-INF / lib に配置して、 mylibs にあるものを上書きできます。
ライブラリを2回ロードしたくない場合は、次の場所に置きます:
- Tomcat 6:
$ CATALINA_HOME / lib
- Tomcat 5:
$ CATALINA_HOME / common / lib
(質問から削除され、投票/コメントできるようにここにコピーされます)
PermGenヒープのスペースは、クラスおよびJavaのクラスに関するメタデータを格納するために使用されます。
エラーjava.lang.OutOfMemoryError:Apache Tomcatで多数の重複ライブラリをロードしているため、PermGenスペースが頻繁に発生する可能性があります 誰でも詳細について共有できます