eclipseのWTPプロジェクトでユーザライブラリを参照

あらまし

 

Tomcat等のサーブレットコンテナは複数のWebアプリケーションをデプロイでき、それぞれが独立したClassLoaderの管理下となる。つまり、複数アプリケーションをデプロイした場合、同じライブラリをそれぞれのClassLoaderに読み込んでしまう。

これによってライブラリのバージョンの競合は避けられるが、PermGenが肥大化するため低スペックサーバーでのメモリ圧迫やJava.1.7以前はPermGenのOutOfMemory等の問題に悩まされた。

しかし、サーブレットコンテナ全体に一つのライブラリを参照させることで個別のClassLoaderに新しいクラスが読み込まれるのを阻止し、PermGen領域を節約することができる。(1.8からはPermGen自体は可変らしい)

 

何をやりたいか

TomcatのClassLoaderに任意のクラスを読み込むためには開発環境上でもアプリケーションとライブラリを切り離してバージョン管理する必要が出てくる。

このような場合、WEB-INF/libにjarを放り込むのではなく、eclipseのユーザライブラリの機能を使用すればいいと考えたが、WTPプロジェクトで実施したところ、ビルドは正常に通ったがユーザライブラリがクラスパスに含まれず動作させることができなかった。

 

解決方法

サーブレットコンテナの実行構成のクラスパスで任意のライブラリを指定すれば、WEB-INF/libにjarファイルを置かずともサーバーにバンドルすることができます。
 

f:id:dachihada:20151112173008j:plain