J2EEサーバのクラスローダ

Understanding J2EE Application Server ClassLoading Architectures
2002/05 と、ちょっと古いけど、どのJ2EEサーバも試行錯誤してるんだな、と参考になる。

ポイントはEJB-JAR、WAR(のなかのライブラリ)、Manifest Class-Pathに記述されたJARを読むクラスローダはどれか、と、その親子関係。
ちなみにManifest Class-PathはJARファイルのManifest Class-PathにのみJ2EE1.3仕様で決まっており(Extension Mechanism Architecture と呼ぶそうだ)、WARは各J2EEサーバベンダが独自に対応しているらしい。WARも仕様で対応してくれたほうが、余計なJARをWEB-INF/libに入れなくて済むので良いなあ。

・WebLogic6.1sp2
ひとつのアプリケーションに対し、[EJBすべてとManifest Class-PathのJARすべてを読むクラスローダ]ひとつの子供として、[WARひとつを読むクラスローダ]がWARの数だけ複数できる。
[EJBすべてとManifest Class-PathのJARすべてを読むクラスローダ]がひとつでまかなわれているため、EJBやJAR同士ではクラスが参照し放題ということになる。当然WARからも見える。

・WebSphere4.0
4種類のモードがあるが、基本は「Module」である。ひとつのアプリケーションに対し、[アプリ用クラスローダ](たぶん何も読まない)ひとつの子供として、全モジュール(jar,war)ごとにひとつずつ[モジュール用クラスローダ]ができる。
[モジュール用クラスローダ]は兄弟同士になるから本来参照不能だが、内部的にはうまいことやって、Manifest Class-PathのJARを参照するEJBは、そのJARの子供のように振舞う(つまりEJB->JARは見えて、JAR->EJBは見えない)

・HP-AS8mp3
ひとつのアプリケーションに対し、[アプリ用クラスローダ](何も読まない)ひとつの子供として、WARごとにひとつずつ[WAR用クラスローダ]と[すべてのEJB用クラスローダ]がひとつできる。
WAR->EJBは見えて、EJB->WARは見えない。またManifest Class-Pathには対応していない。

…なんだけど、最近のバージョンではまた全然変わっていると思われるので、あくまで参考というかJ2EEサーバの歴史の勉強みたいなもの。
あとでWebLogic8.1とJBoss3.2を追加しよう