參考:http://tomcat.apache.org/tomcat-9.0-doc/building.html
1.下載JDK8
安裝JDK8
編譯Tomcat9需要安裝JDK8
下載地址:http://www.oracle.com/technetwork/java/javase/downloads/index.html
設置環(huán)境變量:
JAVA_HOME
D:\dev\Java\jdk1.8.0_72
PATH新增:%JAVA_HOME%\bin
2.安裝Ant1.9.5或者更高版本
下載地址:http://ant.apache.org/bindownload.cgi
解壓到D:\dev\ant
設置環(huán)境變量:
ANT_HOME
D:\dev\ant\apache-ant-1.9.6
PATH新增:%ANT_HOME%\bin
3.獲取Tomcat9的源碼
地址:http://archive.apache.org/dist/tomcat/tomcat-9/
下載是windows版的源碼即zip版的源碼:apache-tomcat-9.0.0.M17-src.zip
然后將其解壓到一個目錄下(D:\dev\workspace)其弊,即源碼所在目錄是:D:\dev\workspace\apache-tomcat-9.0.0.M17-src膨更。
4.配置下載區(qū)域
編譯Tomcat要下載大量的依賴庫双饥。強烈推薦為這些庫配置下載區(qū)域。
進入tomcat源碼的目錄液茎,
即D:\dev\workspace\apache-tomcat-9.0.0.M17-src,
將其中的build.properties.default文件重命名為build.properties免钻,
并修改base.path為:
base.path=D:/dev/workspace/apache-tomcat-9.0.0.M17-src/../lib-tomcat9
5.編譯Tomcat
${tomcat.source}表示tomcat源碼所在目錄致盟。
cd ${tomcat.source}
ant
即
cd D:\dev\workspace\apache-tomcat-9.0.0.M17-src
ant
運行這條命令將要下載編譯Tomcat所需要的庫文件到base.path指定的目錄中。
一旦編譯成功匾南,一個可用的Tomcat將會被產(chǎn)生在${tomcat.source}/output/build目錄中,且能夠被腳本啟動和關(guān)閉蛔外。
6.使用Eclipse編譯
(1)生成Eclipse項目
Ant的target 提供一種便捷下載所有二進制依賴關(guān)系蛆楞,和在源代碼樹的根目錄下創(chuàng)建Eclipse項目及classpath文件。
cd ${tomcat.source}
ant ide-eclipse
即:
cd D:\dev\eclipse\workspace\tomcat
ant ide-eclipse
(2)增加Classpath變量
啟動Eclipse夹厌,打開Preferences對話框豹爹,選擇Java->Build Path->Classpath Variables,增加兩個Classpath Variables:
TOMCAT_LIBS_BASE:
D:/dev/workspace/apache-tomcat-9.0.0.M3-src/../lib-tomcat9
(路徑和在build.properties中的base.path設置一樣矛纹,即存放的是已經(jīng)下載的二進制依賴)
ANT_HOME:
D:\dev\ant\apache-ant-1.9.6
(Ant的根目錄)
(3)配置JRE:
打開Preferences對話框臂聋,
選擇Java->Installed JREs->Add。選擇JRE Home:D:\dev\Java\jdk1.8.0_72或南;
選擇Java -> Compiler孩等,設置Compiler compliance level 等于當前JDK的版本(1.8),默認一般是最新版本采够。
單擊OK肄方,設置完成。
(4)導入Tomcat源碼到Eclipse中
File->Import->General->Existing Projects into Workspace->選擇Tomcat源碼的根目錄蹬癌,單擊完成即可導入权她。
導入完成之后,項目自動完成編譯逝薪。
(5)啟動
在Eclipse中找到org.apache.catalina.startup.Bootstrap隅要,使用它作為主類,選中右擊“Run As->Run configurations”董济,然后雙擊”Java Aplication”就會出來一個新的”Bootstrap”:
進行如下設置:
Name:Bootstrap start
Project:apache-tomcat-9.0.0.M17-src
Main class(Search而來):org.apache.catalina.startup.Bootstrap
Program arguments:start
VM arguments:-Dcatalina.home="D:\dev\workspace\apache-tomcat-9.0.0.M17-src\output\build"
單擊Apply步清,即可保存設置
接著單擊Run,Tomcat即可啟動虏肾。
打開瀏覽器尼啡,輸入http://127.0.0.1:8080/examples/ 看看例子暂衡。
(6)停止
與(5)同樣的方法設置Bootstrap stop,不同之處在于Program arguments:stop
(7)調(diào)試Tomcat源碼的方法
選中org.apache.catalina.startup.Bootstrap崖瞭,單擊右鍵Debug As->Debug configurations
7.簡單的源代碼閱讀指南
包名 | 用途 |
---|---|
javax | servlet/jsp/el相關(guān)的api |
org.apache.catalina | tomcat自身架構(gòu) |
org.apache.coyote | http狂巢、ajp協(xié)議實現(xiàn)相關(guān)的類 |
org.apache.el | 實現(xiàn)el規(guī)范 |
org.apache.jasper | 實現(xiàn)jsp規(guī)范、編譯jsp文件 |
org.apache.juli | tomcat的日志系統(tǒng) |
org.apache.naming | jndi實現(xiàn) |
org.apache.tomcat | tomcat的工具包书聚、net唧领、digester xml解析器 |
閱讀順序:
可以從org.apache.catalina.startup.Bootstrap這個類開始看起,
然后到org.apache.catalina.startup.Catalina,
在Catalina類中會觸發(fā)conf/server.xml文件的解析雌续,
這時要看org.apache.tomcat.util.digester中的類斩个,
解析的過程中會用到org.apache.catalina.startup包中的很多RuleSet類,
server.xml文件解析完后驯杜,會生成org.apache.catalina.core包中的各種StandardXXX類的實例受啥,
比如StandardServer、StandardService鸽心、StandardEngine等等滚局,
這些Standard組件都是有生命周期的,接著會調(diào)用他們的init顽频、start等方法藤肢,
會觸發(fā)下面這些組件進入init、start狀態(tài)
org.apache.catalina.connector.Connector
org.apache.coyote.http11.Http11Protocol
org.apache.tomcat.util.net.JIoEndpoint
在JIoEndpoint(或NioEndpoint糯景、AprEndpoint)中會監(jiān)聽8080這樣的端口嘁圈,
有請求進來了,就進行相關(guān)的io操作蟀淮,接著轉(zhuǎn)到org.apache.coyote包中的相應類進行協(xié)議解析最住,
生成org.apache.catalina.connector.Request和org.apache.catalina.connector.Response實例,
然后轉(zhuǎn)到各種Valve怠惶、應用Filter温学,最后到達應用的Servlet/JSP。
下圖描述了Tomcat7的核心架構(gòu):