一,前言
這篇博客寫於 12 月 12 日,從 github[1] 上 fork 了一份 tomcat 的源代碼,clone 到了本地。最近想把 tomcat 的源代碼分析一下,寒假的時候有完整的時間就造個輪子。
看源碼,總不能干看,邊看邊改,驗證想法。所以這個系列從構建 tomcat 開始。首先要聲明的是,以前沒有完整看過一個項目的經歷,tomcat 是第一次嘗試看的源碼。因此,這個系列可能存在描述不正確的問題,希望讀者能幫忙指正。最后,感謝您的閱讀!
這篇博客主要內容是,在 Windows 上,使用 Intellj-IDEA 編譯運行 Tomcat。
二,問題
讀源代碼,要帶着問題去閱讀。有一些是自己想的,有一些是 How Tomcat Works[2] 的目錄,還有一些來自於別人的博客[3]。這個部分可能會時不時更新一下,因為在搬磚的時候,可能突然對某個問題產生了興趣,遂記錄下來。一開始只寫了 8 點,不知道以后這個列表會更新出多少點呢。
- 一個 Http 請求和響應,是如何轉變成 Servlet 的請求和相應的?
- Servlet 是如何抽象 Http 請求的?
- Tomcat 如何管理 tcp 連接?
- Tomcat 如何管理輸入輸出流?
- Tomcat 的生命周期,如何啟動的?如何運行?
- Session 如何管理?
- 如何加載類?
- Tomcat 如何管理 servlet 容器,如何連接?
- 不同的瀏覽器連接上應用,如何判斷是不同的客戶端呢?是 Tomcat 負責判斷的嗎?
- JSP 頁面如何轉為 java 代碼,輸出 html 文件?
問題就暫且提出這些。不知道這個 Tomcat 源碼閱讀系列是否能夠完成呢(/▽\)。不管怎樣,先搭個環境,用自己喜歡的 IDE(IntelliJ IDEA) 來閱讀、調試源碼。
三,步驟
- 下載源代碼,這里在 github 上下載
- 選擇正確的 JDK 版本,官方使用的是 JDK 8
- 下載 Ant 工具,Tomcat 使用 Ant 來構建
- 配置依賴包的下載位置
- 使用 Ant 構建
- 使用 Ant 創建 IDE 工程,IDE 支持 Intellij-IDEA,NetBean,Eclipse
獲取源代碼,安裝對應的 JDK 版本,下面就不解釋了。下面主要講講如何使用 Ant 工具來開發,在寫這篇博客之前,其實我自己也沒有想到構建 Tomcat 是很簡單的事情。官方還很貼心的考慮到了,開發者可能會使用 IDE 來開發,於是給開發者配置好了環境。使用對應的 Ant 任務就可以有對應 IDE 的工程文件了。下面的步驟,具體可以看官方的構建步驟。
1 安裝 Ant
直接去這里下載 Ant 的包,然后配置環境變量。
添加一個新的環境變量:
變量名:ANT_HOME
變量值:C:\Program Files\apache-ant-1.9.15
增加如下到 Path 中。
變量值:%ANT_HOME%\bin
在 cmd 當中輸入 ant,如果可以找到命令,那么說明成功了。
2 配置下載位置
進入下載好的 Tomcat 目錄中,我這里 tomcat 的根目錄是 D:\Code\tomcat。
新建一個文件 build.properties,復制以下的內容。指定依賴包的保存地址。
# ----- Default Base Path for Dependent Packages -----
# Replace this path with the directory path where dependencies binaries
# should be downloaded
base.path=D:\\Code\\tomcat\\lib
3 使用 Ant 構建
輸入 ant 即可,他會先下載構建需要的包,然后構建項目。構建好了如何運行呢?這個請不要着急,往后看會講的。
4 使用 IDEA 構建
輸入命令 ant ide-intellij 即可構建 IDEA 的項目。官方還提供了 eclipse 和 netbean。
接下來,就會下載 IDEA 需要的包,並且會將提供的項目文件復制到 Tomcat 目錄下。之后就可以使用 IDEA 來打開了。
5 Bug
官方的代碼里面,build.properties.default 和 res\ide-support 下的版本對應不上,於是會出現下面的報錯。下面給出兩種解決方案。

解決方案一
添加依賴。
打開 Project Structure

添加依賴

解決方案二
修改 res\ide-support\idea\tomcat.iml 中對應的版本,然后重新構建就好了。

四,運行
Tomcat 的運行有兩種方式,一種是使用官方的腳本來運行,另一種是使用 org.apache.catalina.startup 中的 BootStrap 類。
方式一
首先使用 ant 構建好項目,然后進入 output\build 文件夾。
接着修改 conf\logging.properties 下的編碼,不然控制台要輸出亂碼了。

最后進入,bin\startup.bat 雙擊一下就可以運行了。進入 http://localhost:8080/ 就可以查看是否運行成功。
方式二
使用 org.apache.catalina.startup 中的 BootStrap 類。使用 IDEA 來啟動這個類。首先要配置好參數,我們把方式一中的命令行參數拷貝到 IDEA 的啟動參數里面即可。

不過 IDEA 的控制台輸出仍然會有亂碼,可以選擇使用英文來避免這個問題。
選擇org.apache.catalina.startup 中的 BootStrap 類作為啟動類,點擊啟動配置。

將以下參數加入到 VM 選項中。
-Djava.util.logging.config.file=D:\Code\tomcat\output\build\conf\logging.properties
-Djava.util.logging.manager=org.apache.juli.ClassLoaderLogManager
-Djdk.tls.ephemeralDHKeySize=2048
-Djava.protocol.handler.pkgs=org.apache.catalina.webresources
-Dcatalina.base=D:\Code\tomcat\output\build
-Dcatalina.home=D:\Code\tomcat\output\build
-Djava.io.tmpdir=D:\Code\tomcat\output\build\temp
-Dfile.encoding=UTF-8
-Duser.language=en
-Duser.region=US
點擊啟動!so easy。接下來就是一邊閱讀源碼,一邊調試看看了。

參考
[1] https://github.com/apache/tomcat
[2] How Tomcat Works 2
