一,前言
這篇部落格寫於 12 月 12 日,從 github[1] 上 fork 了一份 tomcat 的原始碼,clone 到了本地。最近想把 tomcat 的原始碼分析一下,寒假的時候有完整的時間就造個輪子。
看原始碼,總不能幹看,邊看邊改,驗證想法。所以這個系列從構建 tomcat 開始。首先要宣告的是,以前沒有完整看過一個專案的經歷,tomcat 是第一次嘗試看的原始碼。因此,這個系列可能存在描述不正確的問題,希望讀者能幫忙指正。最後,感謝您的閱讀!
這篇部落格主要內容是,在 Windows 上,使用 Intellj-IDEA 編譯執行 Tomcat。
二,問題
讀原始碼,要帶著問題去閱讀。有一些是自己想的,有一些是 How Tomcat Works[2] 的目錄,還有一些來自於別人的部落格[3]。
- 一個 Http 請求和響應,是如何轉變成 Servlet 的請求和相應的?
- Servlet 是如何抽象 Http 請求的?
- Tomcat 如何管理 tcp 連線?
- Tomcat 如何管理輸入輸出流?
- Tomcat 的生命週期,如何啟動的?如何執行?
- Session 如何管理?
- 如何載入類?
- Tomcat 如何管理 servlet 容器,如何連線?
問題就暫且提出這些。不知道這個 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 的控制檯輸出仍然會有亂碼,可以選擇使用英文來避免這個問題。
-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