編譯Tomcat9源碼

參考: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

設(shè)置環(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

設(shè)置環(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

然后將其解壓到一個(gè)目錄下(D:\dev\workspace),即源碼所在目錄是:D:\dev\workspace\apache-tomcat-9.0.0.M17-src。

4.配置下載區(qū)域

編譯Tomcat要下載大量的依賴庫。強(qiáng)烈推薦為這些庫配置下載區(qū)域。
進(jìn)入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

運(yùn)行這條命令將要下載編譯Tomcat所需要的庫文件到base.path指定的目錄中。
一旦編譯成功,一個(gè)可用的Tomcat將會(huì)被產(chǎn)生在${tomcat.source}/output/build目錄中,且能夠被腳本啟動(dòng)和關(guān)閉。

6.使用Eclipse編譯

(1)生成Eclipse項(xiàng)目

Ant的target 提供一種便捷下載所有二進(jìn)制依賴關(guān)系,和在源代碼樹的根目錄下創(chuàng)建Eclipse項(xiàng)目及classpath文件。
cd ${tomcat.source}
ant ide-eclipse

即:
cd D:\dev\eclipse\workspace\tomcat
ant ide-eclipse

(2)增加Classpath變量

啟動(dòng)Eclipse,打開Preferences對(duì)話框,選擇Java->Build Path->Classpath Variables,增加兩個(gè)Classpath Variables:

TOMCAT_LIBS_BASE:

D:/dev/workspace/apache-tomcat-9.0.0.M3-src/../lib-tomcat9
(路徑和在build.properties中的base.path設(shè)置一樣,即存放的是已經(jīng)下載的二進(jìn)制依賴)

ANT_HOME:

D:\dev\ant\apache-ant-1.9.6
(Ant的根目錄)

(3)配置JRE:

打開Preferences對(duì)話框,
選擇Java->Installed JREs->Add。選擇JRE Home:D:\dev\Java\jdk1.8.0_72;
選擇Java -> Compiler,設(shè)置Compiler compliance level 等于當(dāng)前JDK的版本(1.8),默認(rèn)一般是最新版本。

單擊OK,設(shè)置完成。

(4)導(dǎo)入Tomcat源碼到Eclipse中

File->Import->General->Existing Projects into Workspace->選擇Tomcat源碼的根目錄,單擊完成即可導(dǎo)入。
導(dǎo)入完成之后,項(xiàng)目自動(dòng)完成編譯。

(5)啟動(dòng)

在Eclipse中找到org.apache.catalina.startup.Bootstrap,使用它作為主類,選中右擊“Run As->Run configurations”,然后雙擊”Java Aplication”就會(huì)出來一個(gè)新的”Bootstrap”:
進(jìn)行如下設(shè)置:
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,即可保存設(shè)置
接著單擊Run,Tomcat即可啟動(dòng)。

打開瀏覽器,輸入http://127.0.0.1:8080/examples/ 看看例子。

(6)停止

與(5)同樣的方法設(shè)置Bootstrap stop,不同之處在于Program arguments:stop

(7)調(diào)試Tomcat源碼的方法
選中org.apache.catalina.startup.Bootstrap,單擊右鍵Debug As->Debug configurations

7.簡(jiǎn)單的源代碼閱讀指南

包名 用途
javax servlet/jsp/el相關(guān)的api
org.apache.catalina tomcat自身架構(gòu)
org.apache.coyote http、ajp協(xié)議實(shí)現(xiàn)相關(guān)的類
org.apache.el 實(shí)現(xiàn)el規(guī)范
org.apache.jasper 實(shí)現(xiàn)jsp規(guī)范、編譯jsp文件
org.apache.juli tomcat的日志系統(tǒng)
org.apache.naming jndi實(shí)現(xiàn)
org.apache.tomcat tomcat的工具包、net、digester xml解析器

閱讀順序:
可以從org.apache.catalina.startup.Bootstrap這個(gè)類開始看起,
然后到org.apache.catalina.startup.Catalina,
在Catalina類中會(huì)觸發(fā)conf/server.xml文件的解析,
這時(shí)要看org.apache.tomcat.util.digester中的類,
解析的過程中會(huì)用到org.apache.catalina.startup包中的很多RuleSet類,
server.xml文件解析完后,會(huì)生成org.apache.catalina.core包中的各種StandardXXX類的實(shí)例,
比如StandardServer、StandardService、StandardEngine等等,
這些Standard組件都是有生命周期的,接著會(huì)調(diào)用他們的init、start等方法,
會(huì)觸發(fā)下面這些組件進(jìn)入init、start狀態(tài)
org.apache.catalina.connector.Connector
org.apache.coyote.http11.Http11Protocol
org.apache.tomcat.util.net.JIoEndpoint
在JIoEndpoint(或NioEndpoint、AprEndpoint)中會(huì)監(jiān)聽8080這樣的端口,
有請(qǐng)求進(jìn)來了,就進(jìn)行相關(guān)的io操作,接著轉(zhuǎn)到org.apache.coyote包中的相應(yīng)類進(jìn)行協(xié)議解析,
生成org.apache.catalina.connector.Request和org.apache.catalina.connector.Response實(shí)例,
然后轉(zhuǎn)到各種Valve、應(yīng)用Filter,最后到達(dá)應(yīng)用的Servlet/JSP。

下圖描述了Tomcat7的核心架構(gòu):

Tomcat7核心架構(gòu)圖
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容