編譯tomcat源碼
Ⅰ Tomcat源碼解析-組件之StandardServer
StandardServer是tomcat容器的最高層的組件,職責如下:
實現Tomcat一鍵啟動關閉,管理全局 JDNI資源,管理子組件,阻塞tomcat主線程。
StandardServer子組件
Bootstarp作為tomcat啟動類,JVM會調用main函數完成tomcat啟動。在其內部流程如下:
核心方法功能
Tomcat使用Digester解析server.xml,Digester是一款用於將xml轉換為Java對象的事件驅動型工具,是對SAX的高層次的封裝。相對於SAX可以為xml中每一個標簽設置對應的解析規則。詳見 Tomcat相關技術-Digester(二)
這里通過解析server.xml實例化StandardServer,並設置server.xml文件中定義的屬性初始化。
server.xml配置
<Server>標簽用來表示當前StandardServer組件
StandardServer構造函數
將<server>標簽屬性映射到StandardServer對象屬性中
<GlobalNamingResources>標簽中定義了全局JNDI資源,
<Listener>標簽中定義StandardServer組件中需要的LifecycleListener監聽器。<Server>標簽內可以設置多個<Listener>。
Server中定義的Listener
添加LifecycleListener監聽器
<Service>標簽中定義StandardServer組件中子組件Service。<Server>標簽內可以設置多個<Service>。
添加Service子組件
StandardServer作為tomcat最上層的組件,和其他所有組件一樣都實現了Lifecycle 介面。
Tomcat 定義一個基類LifecycleBase 來實現 Lifecycle 介面,把一些公共的邏輯放到基類中去,比如生命狀態的轉變與維護、生命事件的觸發以及監聽器的添加和刪除等,而子類就負責實現自己的初始化、啟動和停止等模板方法。為了避免跟基類中的方法同名,我們把具體子類的實現方法改個名字,在後面加上 Internal,叫 initInternal、startInternal 等。
其他模板方法
詳見 Tomcat架構設計-組件生命周期
StandardServer組件初始化的核心是調用所有Service子組件初始化方法init。
詳細流程如下:
啟動start的核心是調用所有Service子組件初始化方法start。
詳細流程如下:
啟動stop的核心是調用所有Service子組件初始化方法stop。
詳細流程如下:
銷毀destroy的核心是調用所有Service子組件初始化方法destroy。
1 調用所有Service子組件啟動方法destroy
2 銷毀JND全局資源
3 jmx bean注銷MBeanFactory
4 jmx bean注銷StringCache
5 調用LifecycleMBeanBase.destroyInternal 將當前組件對象從jmx 注銷
在這樣的設計中,在父組件的 init 方法里需要創建子組件並調用子組件的 init 方法。同樣,在父組件的 start 方法里也需要調用子組件的 start 方法。只要調用最頂層組件StandardServer的 init 和 start 方法,整個 Tomcat 就被啟動起來了。只要調用最頂層組件StandardServer的 destroy 和 stop 方法,整個 Tomcat 就被關閉。
添加已在解析server.xml初始化設置調用
阻塞tomcat主線程,只要stopAwait不為true, tomcat主線程在此無限循環.監聽到客戶端發起SHUTDOWN命令後退出
Ⅱ 如何將tomcat7.0源碼導入eclipse
1.Tomcat源碼下載
這個里下載tomcat-6.0.33源碼。
2.ant安裝,用於編譯tomcat的源碼。
ant下載解壓後將其bin添加到系統環境path中。
3.IDE——選用Eclipse3.7。
Ⅲ 怎麼將tomcat源碼導入eclipse
1. 去apache官網下載對應的tomcat版本源碼(我這里下載的是9.0.0.M9) http://tomcat.apache.org/download-90.cgi
2. 解壓後的源碼是沒法作為工程直接導入eclipse的。需要使用ant進行編譯,所以這里需要去ant官網下載ant對應版本。http://ant.apache.org/bindownload.cgi
Ⅳ tomcat的classloader的源碼解析
相關源碼如下:
common,catalina,shared三個classloader沒有違背雙親載入原則
WebappClassLoader違背了雙親委派機制 因為重寫了loadclass
在context啟動的時候其會啟動一個webappLoader
而webappLoader會創建一個WebappClassLoader,設置一個source(對應咱們webapps下面的一個項目)
設置delegate=false 代表不需要遵循雙親委派機制,然後啟動WebappClassLoader,
然後這個context的載入的會使用自己的context裡面含有的WebappClassLoader去載入bean
當webapps下面有多個項目就建立多個standardContext
每個standardContext 設有一個對應的webappLoader和webappClassLoader
Ⅳ tomcat怎麼編譯jsp文件
一、jsp執行過程圖解
用戶訪問jsp頁面時,jsp的處理過程如下圖所示:
從圖中可以看出,Tomcat的核心組建是connector和container,container就是容器。容器就是負責管理控制servlet的應用程序。圖中的jasper就是解析jsp的jsp引擎。Tomcat既是servlet容器又是web伺服器,也是jsp引擎。
