Sung in Blog

                     一些技術文章 & 一些生活雜碎

          WebSite ConnecTionS

          西北工業大學 Offer收割機
          Java開源大全 Matrix - 與 Java 共舞
          Java World Kingnet國家網絡醫院

          常用鏈接

          隨筆檔案

          文章分類

          積分與排名

          • 積分 - 255931
          • 排名 - 221

          最新評論

          閱讀排行榜

          評論排行榜

          1 - Tomcat的類載入器的結構

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

                  +-----------------------------+
                  |         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可見

          2 - ClassLoader的工作原理

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

          ClassLoader被組織成樹形,一般的工作原理是:
          1) 線程需要用到某個類,于是contextClassLoader被請求來載入該類
          2) contextClassLoader請求它的父ClassLoader來完成該載入請求
          3) 如果父ClassLoader無法載入類,則contextClassLoader試圖自己來載入

          注意:WebApp?ClassLoader的工作原理和上述有少許不同:
          它先試圖自己載入類(在ContextBase?/WEB-INF/...中載入類),如果無法載入,再請求父ClassLoader完成

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

          3 - 部分原代碼分析

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

          Tomcat Server線程的起點
          構造ClassLoader樹,并設置Tomcat Server線程的contextClassLoader為catalinaloader
          載入若干類,然后轉入org.apache.catalina.startup.Catalina類中

          [查看代碼]

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

          根據設置創建并返回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

          1 - Tomcat的類載入器的結構

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

                  +-----------------------------+
                  |         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可見

          2 - ClassLoader的工作原理

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

          ClassLoader被組織成樹形,一般的工作原理是:
          1) 線程需要用到某個類,于是contextClassLoader被請求來載入該類
          2) contextClassLoader請求它的父ClassLoader來完成該載入請求
          3) 如果父ClassLoader無法載入類,則contextClassLoader試圖自己來載入

          注意:WebApp?ClassLoader的工作原理和上述有少許不同:
          它先試圖自己載入類(在ContextBase?/WEB-INF/...中載入類),如果無法載入,再請求父ClassLoader完成

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

          3 - 部分原代碼分析

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

          Tomcat Server線程的起點
          構造ClassLoader樹,并設置Tomcat Server線程的contextClassLoader為catalinaloader
          載入若干類,然后轉入org.apache.catalina.startup.Catalina類中

          [查看代碼]

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

          根據設置創建并返回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

          ]]>
          posted on 2005-09-20 15:18 Sung 閱讀(601) 評論(0)  編輯  收藏 所屬分類: Tomcat
          主站蜘蛛池模板: 乐清市| 安徽省| 陆丰市| 峨眉山市| 犍为县| 台中市| 新沂市| 资中县| 都匀市| 西畴县| 新源县| 水富县| 横山县| 万源市| 日喀则市| 凤翔县| 东源县| 光泽县| 淄博市| 河北区| 陇川县| 通城县| 盱眙县| 广平县| 文昌市| 山阴县| 泸水县| 苍南县| 普格县| 扎鲁特旗| 改则县| 永定县| 越西县| 库车县| 泽州县| 扎鲁特旗| 闸北区| 潜江市| 固镇县| 锡林郭勒盟| 磐石市|