tomcat啓動分析(3)

1 - Tomcat的類載入器的結構

Tomcat Server在啓動的時候將構造一個ClassLoader樹,以保證模塊的類庫是私有的
Tomcat Server的ClassLoader結構以下:
html

        +-----------------------------+
        |         Bootstrap           |
        |             |               |
        |          System             |
        |             |               |
        |          Common             |
        |         /      \            |
        |     Catalina  Shared        |
        |               /    \        |
        |          WebApp1  WebApp2   |
        +-----------------------------+

其中:
- Bootstrap - 載入JVM自帶的類和$JAVA_HOME/jre/lib/ext/*.jar
- System - 載入$CLASSPATH/*.class
- Common - 載入$CATALINA_HOME/common/...,它們對TOMCAT和全部的WEB APP均可見
- Catalina - 載入$CATALINA_HOME/server/...,它們僅對TOMCAT可見,對全部的WEB APP都不可見
- Shared - 載入$CATALINA_HOME/shared/...,它們僅對全部WEB APP可見,對TOMCAT不可見(也沒必要見)
- WebApp? - 載入ContextBase?/WEB-INF/...,它們僅對該WEB APP可見
java

2 - ClassLoader的工做原理

每一個運行中的線程都有一個成員contextClassLoader,用來在運行時動態地載入其它類
系統默認的contextClassLoader是systemClassLoader,因此通常而言java程序在執行時可使用JVM自帶的類、$JAVA_HOME/jre/lib/ext/中的類和$CLASSPATH/中的類
可使用Thread.currentThread().setContextClassLoader(...);更改當前線程的contextClassLoader,來改變其載入類的行爲
apache

ClassLoader被組織成樹形,通常的工做原理是:
1) 線程須要用到某個類,因而contextClassLoader被請求來載入該類
2) contextClassLoader請求它的父ClassLoader來完成該載入請求
3) 若是父ClassLoader沒法載入類,則contextClassLoader試圖本身來載入
tomcat

注意:WebApp?ClassLoader的工做原理和上述有少量不一樣:
它先試圖本身載入類(在ContextBase?/WEB-INF/...中載入類),若是沒法載入,再請求父ClassLoader完成
ui

由此可得:
- 對於WEB APP線程,它的contextClassLoader是WebApp?ClassLoader
- 對於Tomcat Server線程,它的contextClassLoader是CatalinaClassLoader
spa

3 - 部分原代碼分析

3.1 - org/apache/catalina/startup/Bootstrap.java 線程

Tomcat Server線程的起點
構造ClassLoader樹,並設置Tomcat Server線程的contextClassLoader爲catalinaloader
載入若干類,而後轉入org.apache.catalina.startup.Catalina類中
code

[查看代碼] server

3.2 - org/apache/catalina/startup/ClassLoaderFactory.java htm

根據設置建立並返回StandardClassLoader的實例

[查看代碼]

3.3 - org/apache/catalina/loader/StandardClassLoader.java

類載入器

3.4 - org/apache/catalina/startup/SecurityClassLoad.java

該類僅包含一個靜態方法,用來爲catalinaLoader載入一些類

[查看代碼]

Appendix - 參考

[1] http://jakarta.apache.org/tomcat/中的Tomcat 4.1.x文檔Class Loader HOW-TO

相關文章
相關標籤/搜索