本文主要記錄了在idea下構建tomcat源碼環境過程。
1. 獲取源碼
首先我們要獲取tomcat源碼,tomcat項目在github上的地址爲apache/tomcat,由於衆所周知的原因,網速會非常慢,直接checkout
,大概率不會成功,我一般的做法是把它導入到gitee
倉庫中,導入方法很簡單,在gitee上創建項目,然後選擇導入已有項目就行了:
我導入的tomcat倉庫爲https://gitee.com/funcy/tomcat.git
.
接着我們只需要把gitee
倉庫的代碼checkout
下來就行了。
2. 創建分支
導入到idea後,打開項目,項目長這樣:
剛checkout
下來的代碼位於master
分支,我比較喜歡基於tag
創建新分支,這裏我使用的tag是9.0.43
,操作命令如下:
# 切換到 9.0.43 的tag
git checkout 9.0.43
# 基於當前分支創建新分支,分支名爲 9.0.43.LEARN
git checkout -b 9.0.43.LEARN
# 將 9.0.43.LEARN 推送到遠程倉庫
git push -u origin 9.0.43.LEARN
當然,你也可以不創建分支,直接在master
上開搞。
3. 安裝ant
tomcat是基於ant
構建的,我們需要先安裝ant工具,下載鏈接ant下載,下載最新版本就對了。
ant
直接下載就 能使用了,不過同maven
一樣,它也要配置環境變量,關於這個過程就不多說了,我的環境變量配置如下:
export ANT_HOME=/Library/Apache/apache-ant-1.9.15
PATH=$PATH:$ANT_HOME/bin
記住這個ANT_HOME
,後面會用到。
配置完成後,運行ant -version
命令,結果如下:
$ ant -version
Apache Ant(TM) version 1.9.15 compiled on May 10 2020
如此就表明ant
安卓成功了。
4. 配置idea環境
接下來我們就正式開始idea的環境了。
4.1 find action
找到help
-action
:
在彈出的窗口中,輸入ant
:
選擇第一個,點擊,就打了ant的側邊欄
點擊“+”,選擇tomcat
下的build.xml
文件:
添加後,ant
窗口就這樣了:
可以看到,tomcat
的構建類目出現了。點擊構建
按鈕,發現會報錯:
沒有指定jdk,那就指定下吧:
我們選擇jdk 1.8
:
設置後的效果如下:
這裏有個編譯文件的輸出目錄,我們也要設置下,我設置的是output
。
再次編譯,還是失敗了:
經過一番探索,發現是缺少了配置文件,找到build.properties.default
,將其複製爲build.properties
:
再次編譯,沒有報錯,output
目錄下也有內容了:
看着好像是編譯成功了。
再一看看java代碼:
它們並沒有被idea識別,解決方法也簡單,直接marker as Source Root
:
代碼正常了,不過也報錯了:
剛開始我以爲是緩存問題,重啓了幾次,還是報錯,試試command+B
編譯,報錯更多:
看來是缺少了一些jar包了,經過一番探索,發現了項目中配置的ant``jar
包存放的默認位置如下:base.path=${user.home}/tomcat-build-libs
這個user.home
就是自己的home目錄
了,在linux
上可以簡寫爲~
。
找到對應的目錄,發現下面確實有些jar包:
然後我就直接選中,全部添加到項目中:
這樣還是不行,發現jar包是要一個一個添加才能生效,那這得加到什麼時候。。。
又經過了一番探索,發現在項目的tomcat/res/ide-support/idea/tomcat.iml
文件中已經爲我們提供了jar的依賴配置方式:
看名稱就知道了,tomcat/res/ide-support
就是保存來ide
的項目文件的,啥都別說了,直接替換把tomcat.iml
替換了。
替換完成後,重啓下idea,然後idea會讓你配置下ANT_HOME
與TOMCAT_BUILD_LIBS
路徑:
配置下就行了,ANT_HOME
就是上面設置的目錄,TOMCAT_BUILD_LIBS
就是前面提到的${user.home}/tomcat-build-libs
了。
配置完成了,重啓下idea,External Libraries
顯示如圖:
包都進來了,再次command+B
編譯,結果如下:
竟然沒有沒有junit依賴包!!!
又是一番探索,在build.properties
文件中找到了它的版本:
然後我就去maven
倉庫下載jar包,放到TOMCAT_BUILD_LIBS
的目錄下:
然後添加進項目,再次編譯,又報錯了:
搜索下easyMock
,在build.properties
找到了相關配置:
然後,發現除了easyMock
,還有cglib
、objenesis
等,難道這些也要一個個導入嗎?
機智如我,敏銳地意識到,這些都是test
包下的代碼,然後就做了一個明智的決定:
直接把test
目錄的標記給去掉,這樣idea就不會去編譯這個目錄下的代碼了。
command+B
編譯,終於不報錯了!前面引入的 junit
也可以幹掉了。
編譯成功後,就可以寫我們自己的測試類了。
5. 編寫自己的tomcat示例
待續...
6. 總結
本文是tomcat源碼編譯踩坑記,最後再總結下整個流程:
- 安裝
ant
構建工具 checkout
tomcat
源碼到idea中,創建自己的分支(也可不必,直接在master
上開搞),接下來的操作都是在idea中進行- 在
idea
中設置tomcat
項目的jdk
版本,設置構建輸出目錄爲output
- 複製
build.properties.default
,將其命名爲build.properties
- 打開
ant
側邊欄,添加tomcat/build.xml
文件,點擊構建
按鈕,構建成功 - 將
tomcat/.idea/tomact.iml
替換爲tomcat/res/ide-support/idea/tomcat.iml
- 重啓
idea
,設置ANT_HOME
與TOMCAT_BUILD_LIBS
兩個目錄 - 選中
tomcat/test
目錄,右鍵,執行Mark Directory as
-Unmark as Test Source Root
操作 command+B
構建,構建成功- 接下來就可以編寫自己的測試示例了