1 - Tomcat的類載入器的結(jié)構(gòu)
Tomcat Server在啟動(dòng)的時(shí)候?qū)?gòu)造一個(gè)ClassLoader樹,以保證模塊的類庫是私有的
Tomcat Server的ClassLoader結(jié)構(gòu)如下:
+-----------------------------+
| Bootstrap |
| | |
| System |
| | |
| Common |
| / \ |
| Catalina Shared |
| / \ |
| WebApp1 WebApp2 |
+-----------------------------+
其中:
- Bootstrap - 載入JVM自帶的類和$JAVA_HOME/jre/lib/ext/*.jar
- System - 載入$CLASSPATH/*.class
- Common - 載入$CATALINA_HOME/common/...,它們對(duì)TOMCAT和所有的WEB APP都可見
- Catalina - 載入$CATALINA_HOME/server/...,它們僅對(duì)TOMCAT可見,對(duì)所有的WEB APP都不可見
- Shared - 載入$CATALINA_HOME/shared/...,它們僅對(duì)所有WEB APP可見,對(duì)TOMCAT不可見(也不必見)
- WebApp? - 載入ContextBase?/WEB-INF/...,它們僅對(duì)該WEB APP可見
2 - ClassLoader的工作原理
每個(gè)運(yùn)行中的線程都有一個(gè)成員contextClassLoader,用來在運(yùn)行時(shí)動(dòng)態(tài)地載入其它類
系統(tǒng)默認(rèn)的contextClassLoader是systemClassLoader,所以一般而言java程序在執(zhí)行時(shí)可以使用JVM自帶的類、$JAVA_HOME/jre/lib/ext/中的類和$CLASSPATH/中的類
可以使用Thread.currentThread().setContextClassLoader(...);更改當(dāng)前線程的contextClassLoader,來改變其載入類的行為
ClassLoader被組織成樹形,一般的工作原理是:
1) 線程需要用到某個(gè)類,于是contextClassLoader被請(qǐng)求來載入該類
2) contextClassLoader請(qǐng)求它的父ClassLoader來完成該載入請(qǐng)求
3) 如果父ClassLoader無法載入類,則contextClassLoader試圖自己來載入
注意:WebApp?ClassLoader的工作原理和上述有少許不同:
它先試圖自己載入類(在ContextBase?/WEB-INF/...中載入類),如果無法載入,再請(qǐng)求父ClassLoader完成
由此可得:
- 對(duì)于WEB APP線程,它的contextClassLoader是WebApp?ClassLoader
- 對(duì)于Tomcat Server線程,它的contextClassLoader是CatalinaClassLoader
3 - 部分原代碼分析
3.1 - org/apache/catalina/startup/Bootstrap.java
Tomcat Server線程的起點(diǎn)
構(gòu)造ClassLoader樹,并設(shè)置Tomcat Server線程的contextClassLoader為catalinaloader
載入若干類,然后轉(zhuǎn)入org.apache.catalina.startup.Catalina類中
[查看代碼]
3.2 - org/apache/catalina/startup/ClassLoaderFactory.java
根據(jù)設(shè)置創(chuàng)建并返回StandardClassLoader的實(shí)例
[查看代碼]
3.3 - org/apache/catalina/loader/StandardClassLoader.java
類載入器
3.4 - org/apache/catalina/startup/SecurityClassLoad.java
該類僅包含一個(gè)靜態(tài)方法,用來為catalinaLoader載入一些類
[查看代碼]
Appendix - 參考
[1] http://jakarta.apache.org/tomcat/中的Tomcat 4.1.x文檔Class Loader HOW-TO
1 - Tomcat的類載入器的結(jié)構(gòu)
Tomcat Server在啟動(dòng)的時(shí)候?qū)?gòu)造一個(gè)ClassLoader樹,以保證模塊的類庫是私有的
Tomcat Server的ClassLoader結(jié)構(gòu)如下:
+-----------------------------+
| Bootstrap |
| | |
| System |
| | |
| Common |
| / \ |
| Catalina Shared |
| / \ |
| WebApp1 WebApp2 |
+-----------------------------+
其中:
- Bootstrap - 載入JVM自帶的類和$JAVA_HOME/jre/lib/ext/*.jar
- System - 載入$CLASSPATH/*.class
- Common - 載入$CATALINA_HOME/common/...,它們對(duì)TOMCAT和所有的WEB APP都可見
- Catalina - 載入$CATALINA_HOME/server/...,它們僅對(duì)TOMCAT可見,對(duì)所有的WEB APP都不可見
- Shared - 載入$CATALINA_HOME/shared/...,它們僅對(duì)所有WEB APP可見,對(duì)TOMCAT不可見(也不必見)
- WebApp? - 載入ContextBase?/WEB-INF/...,它們僅對(duì)該WEB APP可見
2 - ClassLoader的工作原理
每個(gè)運(yùn)行中的線程都有一個(gè)成員contextClassLoader,用來在運(yùn)行時(shí)動(dòng)態(tài)地載入其它類
系統(tǒng)默認(rèn)的contextClassLoader是systemClassLoader,所以一般而言java程序在執(zhí)行時(shí)可以使用JVM自帶的類、$JAVA_HOME/jre/lib/ext/中的類和$CLASSPATH/中的類
可以使用Thread.currentThread().setContextClassLoader(...);更改當(dāng)前線程的contextClassLoader,來改變其載入類的行為
ClassLoader被組織成樹形,一般的工作原理是:
1) 線程需要用到某個(gè)類,于是contextClassLoader被請(qǐng)求來載入該類
2) contextClassLoader請(qǐng)求它的父ClassLoader來完成該載入請(qǐng)求
3) 如果父ClassLoader無法載入類,則contextClassLoader試圖自己來載入
注意:WebApp?ClassLoader的工作原理和上述有少許不同:
它先試圖自己載入類(在ContextBase?/WEB-INF/...中載入類),如果無法載入,再請(qǐng)求父ClassLoader完成
由此可得:
- 對(duì)于WEB APP線程,它的contextClassLoader是WebApp?ClassLoader
- 對(duì)于Tomcat Server線程,它的contextClassLoader是CatalinaClassLoader
3 - 部分原代碼分析
3.1 - org/apache/catalina/startup/Bootstrap.java
Tomcat Server線程的起點(diǎn)
構(gòu)造ClassLoader樹,并設(shè)置Tomcat Server線程的contextClassLoader為catalinaloader
載入若干類,然后轉(zhuǎn)入org.apache.catalina.startup.Catalina類中
[查看代碼]
3.2 - org/apache/catalina/startup/ClassLoaderFactory.java
根據(jù)設(shè)置創(chuàng)建并返回StandardClassLoader的實(shí)例
[查看代碼]
3.3 - org/apache/catalina/loader/StandardClassLoader.java
類載入器
3.4 - org/apache/catalina/startup/SecurityClassLoad.java
該類僅包含一個(gè)靜態(tài)方法,用來為catalinaLoader載入一些類
[查看代碼]
Appendix - 參考
[1] http://jakarta.apache.org/tomcat/中的Tomcat 4.1.x文檔Class Loader HOW-TO
]]>
posted on 2005-09-20 15:18
Sung 閱讀(599)
評(píng)論(0) 編輯 收藏 所屬分類:
Tomcat