Tomcat 7.0.42 原始碼執行環境搭建

預流發表於2018-01-28

《Tomcat 7 原始碼分析》系列文章是我 2013 年到 2015 年間寫在 ITeye 上的相關部落格彙總,從後臺的訪客記錄看一直到現在還有很多人在讀,也是訪問量最多的系列,本來計劃要寫 8 點:

1. 容器啟動,從server到listener、jndi、service到connetor、engine到host到context到wrapper一系列物件的組裝,包括Digester的使用、JMX註冊、JDK5中的新的執行緒池啟動方式等。

2. 一個socket連線如何轉化成request的。

3. 一條請求響應鏈在容器中流轉的經過。

4. 容器的自定義classloader機制。

5. session如何實現,特別是叢集環境中的session粘滯和session複製的實現。

6. nio處理方式的實現。

7. servlet3新規範中websocket的實現。

8. 容器的關閉機制。

結果只寫了 1、2、3、8 ,後面有空將再把這個系列寫完。我最近也把部落格的首發地改到了掘金,為了保持這個系列的完整性,先把以前寫過的轉過來吧。

--------------------------------------------------------------------

以前看過 Tomcat 5 的一部分原始碼,當時只看了個大概的啟動分析,後來看了《How Tomcat Works》這本書,講的還行。但出版的較早,所以是基於 Tomcat 4 的程式碼分析,Tomcat 已經 release 到 7 (2013年的時候)了,很多後來新增的特性與新的實現方式那本書裡面沒有涉及。下半年業餘時間的主要任務就是完成 Tomcat 7 各個我感興趣的點的系列文章。

先說下我的原始碼分析的環境搭建吧,用的是 eclipse Juno Service Release 1,然後在 tomcat官網下了 tomcat7.0.42的原始碼 ,這兩樣準備好之後便是搭建能夠執行原始碼的除錯環境了。

1. 在 eclipse 中新建一個 java 專案,專案取名 tc7.0.42


JRE 選擇 1.6 的


其他設定預設


2. 將下載的 tomcat 原始碼包解壓開,並拷貝到 Eclipse 裡新建的專案根目錄下


注意,我這裡將原始碼解壓開後的 bin 目錄重新命名成 script 之後才拷貝的,因為新建的 Java 專案中預設編譯後的檔案存放目錄是 bin ,這樣做防止編譯後的檔案覆蓋原來拷貝過去的內容。



3. 將專案中預設的 src 目錄刪掉,java 和 test 作為源目錄




4. 此時會發現專案中缺少一些類,需要手動將依賴的 jar 包新增進來,所以新建了一個 depend-lib 目錄


5. 實際上缺少的這些 jar 包 eclipse 安裝目錄裡面都有,直接拷貝過來就可以了。

在 eclipse 安裝目錄的 plugins 目錄下,搜尋 "ant.jar"


搜尋 "javax.wsdl" ,選版本較高的那個 jar 包


搜尋 "jaxrpc" 


搜尋 "jdt.core" 選最大的那個 jar 包


6. 把這些 jar 包加入到編譯路徑裡


7. 此時發現 test 目錄下還有錯誤,實際上是因為 test 裡面用到了 junit 的一些註解,所以需要將 junit4 引進來

右擊專案,點選 Build Path ,選擇 Add Libraries


選擇 junit


下一步,junit 版本選擇 JUnit 4


自此整個專案應該可以編譯了。

8. 接下來執行專案根目錄下的 build.xml ,執行預設的 ant 任務,看看專案構建的有沒有問題。




控制檯輸出 "BUILD SUCCESSFUL" 表示編譯構建成功。


9. 此時重新整理整個專案,會發現多出一個 output 目錄


10. 為了讓應用跑起來,可以檢查一下 output\build\conf 下是否已經有配置檔案,這些檔案實際是從專案根路徑 conf 目錄下拷貝過來的。

11. 找到 BootStarp.java 檔案,Debug 前加入預設的 catalina home 路徑作為啟動引數。

BootStarp.java 檔案右鍵選擇 Debug As -> Debug Configurations


路徑設定為 output 下 build 的絕對路徑。比如我自己的機器設定的值是 -Dcatalina.home="E:\workspace\study\tc7.0.42\output\build" 


這樣就可以在檔案中加入斷點 Debug 原始碼分析了。


相關文章