Tomcat Server在啟動的時候將構造一個ClassLoader樹以保證模塊的類庫是私有的
Tomcat Server的ClassLoader結構如下
代碼
Bootstrap
|
System
|
Common
/ \
Catalina Shared
/ \
WebApp WebApp
其中
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可見
每個運行中的線程都有一個成員contextClassLoader用來在運行時動態地載入其它類系統默認的 contextClassLoader是systemClassLoader所以一般而言java程序在執行時可以使用JVM自帶的類$ JAVA_HOME/jre/lib/ext/中的類和$CLASSPATH/中的類可以使用ThreadcurrentThread() setContextClassLoader();更改當前線程的contextClassLoader來改變其載入類的行為
ClassLoader被組織成樹形一般的工作原理是
) 線程需要用到某個類於是contextClassLoader被請求來載入該類
) contextClassLoader請求它的父ClassLoader來完成該載入請求
) 如果父ClassLoader無法載入類則contextClassLoader試圖自己來載入
注意WebApp?ClassLoader的工作原理和上述有少許不同
它先試圖自己載入類(在ContextBase?/WEBINF/中載入類)如果無法載入再請求父ClassLoader完成
由此可得
對於WEB APP線程它的contextClassLoader是WebApp?ClassLoader
對於Tomcat Server線程它的contextClassLoader是CatalinaClassLoader
From:http://tw.wingwit.com/Article/program/Java/ky/201311/28494.html