JavaEE5に準拠しているJBOSSは、標準で『JSF&JSTL』が搭載されているので「使ってみよう!」と思い
簡単なプロトみたいなものを作って動作を確認していました。
思ったとおりの処理をしていて、次の勉強に移ろうと思ったときに、「あれ?そういえば、『JSF&JSTL
』に関するクラスパスって通してなかったような…」と気付きました。
具体的に言えば、『JSF』でMVCモデルでいうところコントローラにあたるサーブレットである『javax.
faces.webapp.FacesServlet』をweb.xmlに記述はしたけど、クラスパスを通した覚えがなかったのです
。
そこで、自動でクラスパスに設定されるようなディレクトリに『FacesServletクラス』が格納されてい
るjarファイルがあるのだろうと思い探してみたのですが、スグに思いつくようなディレクトリにはあり
ませんでした。
いろいろ探して見つけたJarファイルは、
『JBOSS_HOME\server\default\deploy\jbossweb.sar』
『JBOSS_HOME\server\default\deploy\jbossweb.sar\jsf-libs』
と、2つのディレクトリに格納されていました。
「あれぇ~?」と思い、JBOSSのクラスローダの仕組みについて調べてみたところ、『ユニファイド・ク
ラス・ローダ』という仕組みでクラスをロードしてくるということでした。
そこで、自分なりに『ユニファイド・クラス・ローダ』の動きを調べてみました。
[実験1]
sampleA.war
┣ libディレクトリ
┃ ┗ util.class
┗ servletA…util.classを参照している
sampleB.war
┣ libディレクトリ
┃ ┗ util.class
┗ servletB…util.classを参照している
[結果1]
上記2つのwarをデブロイしたところ、sampleAとsampleBがロードした『util.class』は異なるクラスロ
ーダによってロードされる。
[実験2]
merge.ear
┣sampleA.war
┃┣ libディレクトリ
┃┃ ┗ util.class
┃┗ servletA…util.classを参照している
┗sampleB.war
┣ libディレクトリ
┃ ┗ util.class
┗ servletB…util.classを参照している
[結果2]
merge.earをデブロイしたところ、sampleAとsampleBがロードした『util.class』は異なるクラスローダ
によってロードされる。
[実験3]
merge.ear
┃┗ libディレクトリ
┃ ┗ util.class
┣sampleA.war
┃┗ servletA…util.classを参照している
┗sampleB.war
┗ servletB…util.classを参照している
[結果3]
merge.earをデブロイしたところ、sampleAとsampleBがロードした『util.class』は同じクラスローダに
よってロードされる。
※[実験1]~[実験3]までの結果は想定内だったです。
[実験4]
mergeA.ear
┃┗ libディレクトリ
┃ ┗ util.class
┗sampleA.war
┗ servletA…util.classを参照している
mergeB.ear
┃┗ libディレクトリ
┃ ┗ util.class
┗sampleB.war
┗ servletB…util.classを参照している
[結果4]
上記2つのearをデブロイしたところ、sampleAとsampleBがロードした『util.class』は同じクラスロー
ダによってロードされる。
以上の結果を踏まえて…
[質問1]
上記[実験4]~[結果4]で確認されたような動きが、正に『ユニファイド・クラス・ローダ』だと理解し
ているのですが、間違っているでしょうか?
[質問2]
仮に[質問1]の認識に問題がない場合、『FacesServletクラス』がクラスパスも設定していないのに参照
できるのは、『ユニファイド・クラス・ローダ』のおかげだと理解しているのですが、間違っているの
でしょうか?
長文になって申し訳ありませんが、何かご存知の方がいらっしゃったら、ご意見を頂戴したくよろしく
お願いいたします。
_______________________________________________
Japan-jbug-jboss mailing list
Japan-jb...@lists.sourceforge.jp
http://lists.sourceforge.jp/mailman/listinfo/japan-jbug-jboss
http://www.jboss.org/community/wiki/JBossClassLoaderHistory
通常クラスローダというのは、木構造の階層構造を形成します。ク
ラスローダは親子関係を持ち、自分のクラスローダでロードできな
いクラスのロード要求を親クラスローダに委譲できます(もちろん委
譲しない、ということもできます)。これの委譲は子から親への単方
向です。
JBoss AS 4.x以前のUnifiedClassLoaderが特殊(といっても今現在は
このようなモデルはポピュラーになっています)なのは、クラスロー
ダリポジトリを使って親子関係がないクラスローダ同士がロードし
たクラスを返却できるという点、そして特に指定が無い場合は全て
デフォルトのクラスローダリポジトリに入るという点です。日本語
の解説ではここがわかりやすいかもしれません。
http://www.itarchitect.jp/enterprise/-/30061-4.html
JBoss 5のクラスローダの概要はここに記述されています。
http://www.jboss.org/community/wiki/JBossClassLoaderOverviewandGoals
質問の回答に移ります。
1. 先に言ったようにUnifiedClassLoaderではありませんが、結果は
UnifiedClassLoaderでも、JBoss AS 5でも同じです。
2. その通りです(UnifiedClassLoaderではないですが、細かいこと
は置いておきます)。
ちなみにJava EE環境下では「クラスパス」とはあまり言いません。
「クラスパス」と言ってしまうと、JavaのSystemClassLoaderが利用
する「単一のクラスローダが利用する単一のクラスパス」を想像し
てしまうからです。Java EE環境では上記で説明したように、いくつ
かのクラスローダがからむので、もう少し複雑です。
細かい説明をしたいところですが、ものすっごく長くなりそうなの
で別の機会に。
Regards,
Takayoshi
At 3 Sep 2009 19:38:46 +0900,
> 通常クラスローダというのは、…(略)
はい、その点については理解しております。
> JBoss AS 4.x以前のUnifiedClassLoaderが…(略)
そもそも、私が、「UnifiedClassLoader」の存在を知ったは、
Kimura様が提示するアドレスのサイトを見たからなのです。
> JBoss 5のクラスローダの概要はここに記述されています。
英語が苦手なのであれなのですが、提示して頂いたアドレスのサイトには、
・JBoss5からの、クラスロードは「UnifiedClassLoader」ではない。
・JBoss5からは、クラスロードは「UnifiedClassLoader」と同等の機能を
提供しつつ、更に新しい機能を提供している。
と、書かれているように見受けられました。
以上の事をを踏まえて、ご回答頂いた内容を拝見させて頂き、
なんとか、理解できました。
※かなり危うい点はありますが^^;
ありがとうございました。