クラスローダーに関して

1.      Tomcatのクラスロード関係

       

        Bootstrap

          |

       System

          |

       Common

      /      \

 Catalina   Shared

             /   \

        Webapp1  Webapp2 ...

 

2.Java 2 (つまり、JDK 1.2 かそれ以降) 環境では、クラスローダーは、親子ツリーで配備されます。通常、クラスローダーが特定クラスやリソースをロードするように要求されると、それは、まず、リクエストを親のクラスローダーに委譲し、親のクラスローダーが要求したクラスやリソースを見付けることができない場合にのみ、自分自身のリポジトリーを探します。

 

3.Webappクラスローダーからのクラスのロード要求を処理する場合、このクラスローダーは、探す前に委任するのではなく、まず、ローカルリポジトリーを探します。Tomcat 4 のその他のクラスローダーは、通常の委譲パターンに従います。

 

4.WEBAPPクラスローダー順番

 

  1. WEBアプリケーションクラスローダー:Webapp/WEB-INF/lib , webapp/WEB-INF/classes
  2. ブートストラップクラスローダー: コアのjavaクラスをチェック

       Java1.4を使う場合、ブートストラップクラスローダーは bin ,common/lig ,common/endorsed(Corba,XMLクラス非標準の実装を探す。)

  1. システムクラスローダー: bin/bootstrap.jar と lib/tools.jarをチェック
  2. Commonクラスローダー: common/lib ,common/classes チェック
  3. 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

 

ローダー順

initSevletinitする場合、InitConfigServlet.classを探します。(webappローダー)

InitConfigServlet.class jftx-web.jarに含まれてますから起動します。

InitConfigServlet.classの中のDBコネクション部分は vic.jarjplanDBConnectionを探します。

WEBAPPフォルダには DBConnectionクラスがないから、Bootstrap,System,Common,Shared順番のクラスローダーを起動します。

Sharedフォルダにvic.jarがありますから、起動します。

Tomcatjftwebフォルダ起動正常

 

Jftx-web.jarvic.jarsharedフォルダに入れた場合:

initSevletinitする場合、InitConfigServlet.classを探します。

WEBAPPフォルダにInitConfigServlet.classがないから、Bootstrap,System,Common,Shared順番のクラスローダーで起動します。

Sharedlibの下のjft-web.jarをローダーします。(sharedローダー)

ログ出力用のlog4jクラスを探します。

Bootstrap,System,Commonに探します。

Sharedフォルダにはlog4jクラスがないから、ClassNotFoundExceptionが出ます。

 

 

参照: http://www.janit.com/TechnoInf/Java/Tomcat4.1/class-loader-howto.html