クラスローダーに関して
1. Tomcatのクラスロード関係
Bootstrap
|
System
|
Common
/ \
Catalina Shared
/ \
Webapp1 Webapp2 ...
2.Java 2 (つまり、JDK 1.2 かそれ以降) 環境では、クラスローダーは、親子ツリーで配備されます。通常、クラスローダーが特定クラスやリソースをロードするように要求されると、それは、まず、リクエストを親のクラスローダーに委譲し、親のクラスローダーが要求したクラスやリソースを見付けることができない場合にのみ、自分自身のリポジトリーを探します。
3.Webappクラスローダーからのクラスのロード要求を処理する場合、このクラスローダーは、探す前に委任するのではなく、まず、ローカルリポジトリーを探します。Tomcat 4 のその他のクラスローダーは、通常の委譲パターンに従います。
4.WEBAPPクラスローダー順番
- WEBアプリケーションクラスローダー:Webapp/WEB-INF/lib , webapp/WEB-INF/classes
- ブートストラップクラスローダー: コアのjavaクラスをチェック
① Java1.4を使う場合、ブートストラップクラスローダーは bin ,common/lig ,common/endorsed(Corba,XMLクラス非標準の実装を探す。)
- システムクラスローダー: bin/bootstrap.jar と lib/tools.jarをチェック
- Commonクラスローダー: common/lib ,common/classes チェック
- Sharedクラスローダー: shared/lib,shared/classesをチェック
設定例:
JFTWEBのクラスローダー
* omcat/webapp/jftweb/lib の下に次のファイルがあります。
Axis.jar, axis-ant.jar , commons-discovery.jar, commons-logging.jar , jaxrpc.jar jftx-web.jar, log4j-1.2.8.jar,saaj.jar ,wsdl4j.jar
* Tomcat/shared/lib に下に次のファイルがあります。
Vic.jar
ローダー順
initSevletがinitする場合、InitConfigServlet.classを探します。(webappローダー)
InitConfigServlet.classは jftx-web.jarに含まれてますから起動します。
InitConfigServlet.classの中のDBコネクション部分は vic.jarのjplanのDBConnectionを探します。
WEBAPPフォルダには DBConnectionクラスがないから、Bootstrap,System,Common,Shared順番のクラスローダーを起動します。
Sharedフォルダにvic.jarがありますから、起動します。
Tomcatのjftwebフォルダ起動正常
Jftx-web.jarとvic.jarをsharedフォルダに入れた場合:
initSevletがinitする場合、InitConfigServlet.classを探します。
WEBAPPフォルダにInitConfigServlet.classがないから、Bootstrap,System,Common,Shared順番のクラスローダーで起動します。
Sharedのlibの下のjft-web.jarをローダーします。(sharedローダー)
ログ出力用のlog4jクラスを探します。
Bootstrap,System,Commonに探します。
Sharedフォルダにはlog4jクラスがないから、ClassNotFoundExceptionが出ます。
参照: http://www.janit.com/TechnoInf/Java/Tomcat4.1/class-loader-howto.html
|