【Tomcat 原始碼系列】原始碼構建 Tomcat

楷哥發表於2020-12-12

一,前言

這篇部落格寫於 12 月 12 日,從 github[1] 上 fork 了一份 tomcat 的原始碼,clone 到了本地。最近想把 tomcat 的原始碼分析一下,寒假的時候有完整的時間就造個輪子。

看原始碼,總不能幹看,邊看邊改,驗證想法。所以這個系列從構建 tomcat 開始。首先要宣告的是,以前沒有完整看過一個專案的經歷,tomcat 是第一次嘗試看的原始碼。因此,這個系列可能存在描述不正確的問題,希望讀者能幫忙指正。最後,感謝您的閱讀!

這篇部落格主要內容是,在 Windows 上,使用 Intellj-IDEA 編譯執行 Tomcat。

二,問題

讀原始碼,要帶著問題去閱讀。有一些是自己想的,有一些是 How Tomcat Works[2] 的目錄,還有一些來自於別人的部落格[3]。

  1. 一個 Http 請求和響應,是如何轉變成 Servlet 的請求和相應的?
  2. Servlet 是如何抽象 Http 請求的?
  3. Tomcat 如何管理 tcp 連線?
  4. Tomcat 如何管理輸入輸出流?
  5. Tomcat 的生命週期,如何啟動的?如何執行?
  6. Session 如何管理?
  7. 如何載入類?
  8. Tomcat 如何管理 servlet 容器,如何連線?

問題就暫且提出這些。不知道這個 Tomcat 原始碼閱讀系列是否能夠完成呢(/▽\)。不管怎樣,先搭個環境,用自己喜歡的 IDE(IntelliJ IDEA) 來閱讀、除錯原始碼。

三,步驟

  1. 下載原始碼,這裡在 github 上下載
  2. 選擇正確的 JDK 版本,官方使用的是 JDK 8
  3. 下載 Ant 工具,Tomcat 使用 Ant 來構建
  4. 配置依賴包的下載位置
  5. 使用 Ant 構建
  6. 使用 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.defaultres\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

[3] http://www.iocoder.cn/Tomcat/Tomcat-collection/

[4] https://tomcat.apache.org/tomcat-10.0-doc/building.html

相關文章