Tomcat5.5/ CLASSLOADER

Tomcatは複数スレッドから構成されるJavaアプリ
クラスローダも複数

Bootstrap
 |―System
 |  |―Common
 |  |  |―Catalina
 |  |  |―Shared
 |  |  |  |―WEBアプリ①
 |  |  |  |―WEBアプリ②
 |  |  |  |―…

【Commonクラスローダ】
CatlinaクラスローダとSharedクラスローダの親クラスローダ。
∴Tomcatと全WEBアプリで共通のクラスローダ。
検索対象:
Tomcatのcommon/lib + classes + endorsed 下のもの。

【Catalinaクラスローダ】
Tomcat実行に要るクラスローダ。
このクラスローダはどのWEBアプリからも見えない。
∴このクラスローダでロードしたクラス/リソースはWEBアプリから使用できない。

【Sharedクラスローダ】
各WEBアプリのクラスローダの親。
全WEBアプリで共有されるものをロードする。
検索対象:
Tomcatのshared/classes + lib 下のclassファイルとjarファイル

【各WEBアプリ毎のクラスローダ】
Tomcatでは、各WEBアプリ毎に設定されるクラスローダ。
検索対象:
WEB-INF/classes + lib 下のclassファイルとjarファイル
サーブレットが動作するスレッドのコンテキスト・クラスローダも同クラスローダ。

■Tomcatのロード順位
* Bootstrap classes of your JVM
* System class loader classses (described above)
* /WEB-INF/classes of your web application
 (this class loader will look in the local repositories first, instead of delegating before looking.)
* /WEB-INF/lib/*.jar of your web application
 (this class loader will look in the local repositories first, instead of delegating before looking.)
* $CATALINA_HOME/common/classes
* $CATALINA_HOME/common/endorsed/*.jar
* $CATALINA_HOME/common/i18n/*.jar
* $CATALINA_HOME/common/lib/*.jar
* $CATALINA_BASE/shared/classes
* $CATALINA_BASE/shared/lib/*.jar

■CAUTION
WEBアプリ間でクラスを共有する場合

Tomcatでは、commonとshared下のファイルが共通で使用されるため、クラス変数には要注意。

インスタンスは、処理が実行されているスレッド内に作成されるため、
共通のクラスであってもインスタンスそのものが共有されることはない。
しかし
クラスに属するクラス変数は、
そのクラスをロードしたクラスローダに属する為、全WEBアプリで共有される!

□ex

Commonクラスローダ(or Sharedクラスローダ)にホゲクラス
-hoge class-------------------
package shared;

public class Hoge {
private static String text="";

public synchronized void setText(String text){
this.text=text;
}

public String getText(){
return(text);
}
}
-/hoge class------------------
ホゲクラスは
インスタンス単位ではなく、内部でクラス単位でデータ管理している。
∴あるWEBアプリでsetText()を使用すると、
 他のWEBアプリにもその結果が影響する。

同じホゲクラスを複数のクラスローダに配置した場合は危険度UP!!

■ログ出力には
1. log4j.propertiesをcommon/classesに。
-log4j.properties-------------
log4j.rootLogger=DEBUG, R
log4j.appender.R=org.apache.log4j.RollingFileAppender
log4j.appender.R.File=${catalina.home}/logs/tomcat.log
log4j.appender.R.MaxFileSize=10MB
log4j.appender.R.MaxBackupIndex=10
log4j.appender.R.layout=org.apache.log4j.PatternLayout
log4j.appender.R.layout.ConversionPattern=%p %t %c - %m%n
-/log4j.properties------------
2. ver1.2以降のlog4j.jarを$CATALINA_HOME/common/libに。
3. commons-logging-x.y.z.jarもcommon/libに。
  ※commons-logging-api-x.y.z.jarじゃないよ!
4. start tomcat
5. logs/tomcat.logをチェック。


ref:
[5.5_en] http://tomcat.apache.org/tomcat-5.5-doc/class-loader-howto.html
[log_jp] http://www.oki.com/jp/oss/document/tomcat/tomcat-docs-ja/logging.html
[5.0_jp] http://www.jajakarta.org/tomcat/tomcat5.0/ja/docs/tomcat-docs/class-loader-howto.html
[abs_jp] http://www.techscore.com/tech/J2EE/Servlet/supplement-1.html

tag : tomcat classloader

2008-10-17 07:38 : apsrv : コメント : 0 : トラックバック : 0 :
コメントの投稿
非公開コメント

« next  ホーム  prev »

search

ad



counter


tag cloud

category cloud