解決したい問題
- WARを実行するときに、訳あってクラスパス上に同名の設定ファイルが複数存在する場合に、ロードされる順番を指定したい
- 環境はWebSphere Liberty、Java8を想定
- 設定ファイル、クラスをクラスパスに含める方法として単純なものは以下の3種類がある。この3つの優先順位を確認したい
- WARファイルに含める
- JARファイルに含め、WARファイルのWEB-INF/libに配置する
- WAR外部に配置する(Libertyのserver.xmlで
<library>
に指定する)
調査した結果
以下の順番となった。1と2はパッケージングの方法や環境依存ファイルの配置の都合上、自由に設定しにくいのでロード順を細かく指定したい場合は、WARの外部にJARを配置する形をとり、さらに<library>
のなかで細かく順序を指定するのが良さそう。
- WARファイルに含める
- JARファイルに含め、WARファイルのWEB-INF/libに配置する
- WAR外部に配置する(Libertyのserver.xmlで
<library>
に指定する)
具体的にはこのような形となる。<library>
の子要素の指定順がクラスロードの順番となる。<file>
だけでなく<folder>
で指定する場合もXML要素の順番がクラスロードの順番となる。
<library id="mydir">
<file name="/mydir/foo1.jar"/>
<file name="/mydir/foo2.jar"/>
</library>
<webApplication location="/dir/bar.war">
<classloader privateLibraryRef="mydir"/>
</webApplication>
よくわからなかったこと
MANIFEST.MFのClass-Path
指定でも同様の設定ができるのではないかと思えるのだが、WARに含めたMANIFEST.MFのClass-Path
で指定した場合、なぜかクラスロードの対象にならないようだった。