[jjbug-jboss 42] JBOSS(5.1)におけるクラスローダの仕組みについて

264 views
Skip to first unread message

kirang...@mail.goo.ne.jp

unread,
Sep 3, 2009, 6:38:46 AM9/3/09
to japan-jb...@lists.sourceforge.jp
現在、JOBSSの勉強をしているのですが、不思議に思ったことがありました。
それは、クラスローダの仕組みについてです。

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

Takayoshi Kimura

unread,
Sep 3, 2009, 9:16:04 AM9/3/09
to japan-jb...@lists.sourceforge.jp
まず最初にJBoss AS 5のクラスローダはUnifiedClassLoaderではあ
りません。

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,

kirang...@mail.goo.ne.jp

unread,
Sep 3, 2009, 11:18:43 AM9/3/09
to japan-jb...@lists.sourceforge.jp
Kimura様
大変、丁寧な説明をして頂きありがとうございます。

> 通常クラスローダというのは、…(略)
はい、その点については理解しております。

> JBoss AS 4.x以前のUnifiedClassLoaderが…(略)
そもそも、私が、「UnifiedClassLoader」の存在を知ったは、
Kimura様が提示するアドレスのサイトを見たからなのです。

> JBoss 5のクラスローダの概要はここに記述されています。
英語が苦手なのであれなのですが、提示して頂いたアドレスのサイトには、
 ・JBoss5からの、クラスロードは「UnifiedClassLoader」ではない。
 ・JBoss5からは、クラスロードは「UnifiedClassLoader」と同等の機能を
  提供しつつ、更に新しい機能を提供している。
と、書かれているように見受けられました。

以上の事をを踏まえて、ご回答頂いた内容を拝見させて頂き、
なんとか、理解できました。
※かなり危うい点はありますが^^;

ありがとうございました。

Reply all
Reply to author
Forward
0 new messages