最近因為需求需要修改Tomcat中的某些功能,無奈只能研究那部分源碼然後稍作修改。
目前Tomcat最新版是8.0,下載了源碼包,編譯並導入Eclipse中研究比較方便。
1. Tomcat8源碼編譯步驟1.1 先到Apache Tomcat 8.0官網下載最新版Source Code Distributions,解壓到某個目錄下,如D:\apache-tomcat-8.0.5-src
1.2 使用ant編譯
(1)安裝ant
如果機器上已經安裝了ant可以省略這一步,否則去ant官網下載最新版ant Binary Distributions,解壓到某個目錄下,如D:\Program Files\apache-ant-1.9.3,然後配置環境變量。要麼新建個ANT_HOME,值為ant路徑,然後在PATH中添加ant bin路徑為%ANT_HOME%/bin,要麼直接在PATH中添加ant bin路徑為D:\Program Files\apache-ant-1.9.3\bin。配置好後,在cmd下運行ant -version,如果顯示版本說明配置成功,我們就可以隨地使用ant了。
(2)編譯Tomcat 8.0
非常簡單,cmd進入到剛下載的源碼路徑下,用下面兩個命令即可編譯:
ant download
ant"ant download"命令會下載編譯Tomcat所需的依賴包。
這裡有兩個問題需要注意:
依賴包下載到什麼地方?在Linux或MacOX下,會默認下載到 “/usr/share/java” 目錄,當然該目錄普通用戶是沒有權限寫的;在Windows下,默認下載到 "某個磁盤:\usr\share\java" ,這的磁盤可能是C、D或其它,這一般取決於你把Tomcat源碼放在哪個盤了,比如我的放在D盤,默認就下載在 "D:\usr\share\java" 下。如果我想自己定義下載路徑怎麼辦?
如果用戶是通過代理上網的,那麼下載過程中就會出錯。怎麼解決?
熟悉ant的人應該知道怎麼解決,就是通過配置文件build.properties來設置。該配置文件在Tomcat源碼路徑下為 “build.properties.default” ,我們可以去掉.default後綴或直接新建一個build.properties都可以,當然我選擇了前者,將 “build.properties.default” 修改為 “build.properties” 打開, 修改裡面的base.path屬性值為我們希望的下載路徑並添加proxy代理配置,格式如下:
# ----- Proxy setup -----
# Uncomment if using a proxy server
proxy.host=proxy.domain
proxy.port=8080
proxy.use=on
# ----- Default Base Path for Dependent Packages -----
# Replace this path with the directory path where dependencies binaries
# should be downloaded
base.path=/home/me/some-place-to-download-to根據自己的需要進行設置,注意如果不需要某項設置需要用#注釋掉。
依賴包下載成功後(如果下載失敗可以多試幾次),執行ant即可編譯,編譯成功後當前路徑下回多出個output文件夾,就是我們的編譯結果。
附:
①如果你修改了部分源碼,需要重新編譯 ,直接進入到源碼路徑,執行ant命令即可。
②如果需要編譯servlet和jsp API文檔,進入到源碼路徑下執行如下命令:
ant -f dist.xml dist-javadoc③如果需要編譯extras擴展功能(commons-logging, webservices etc.),進入到源碼路徑下執行如下命令:
ant -f extras.xml④如果需要編譯成release版本,進入到源碼路徑下執行如下命令:
ant -f dist.xml release
2. 將Tomcat源碼導入到Eclipse中研究由於Tomcat不是Eclipse管理的項目,因此不能直接導入,需要新建一個Java項目,比如為Tomcat8,這時有兩種方法就源碼導入進來。
第一種:將所需要的源碼包java和test(Junit測試用例,可選)兩個文件夾直接拷貝到src下。
第二種:選擇File - > import -> File System,在From directory中選擇tomcat源碼包中的java和test兩個文件夾,在Into folder中選擇我們剛新建的Tomcat8項目,Finish,然後記得將這兩個文件夾標記為source code(怎麼標記?右鍵選擇者文件夾 -> Build Path -> Use as Source Folder)。
當然這樣過後就不是完事了,這時會發現整個項目很多紅叉,也就是缺少依賴包,在Build Path裡加上下面的幾個依賴包即可:
Java包需要下面四個jar包,注意版本可能不一樣:
ant.jar
jaxrpc.jar
org.eclipse.jdt.core_3.8.3.v20130121-145325.jar
wsdl4j-1.5.1.jartest包裡需要junit.jar,直接“Add Libraries...”選擇Junit即可:
junit.jar當然也可以在Eclipse中啟動Tomcat,方法如下:
找到類:org.apache.catalina.startup.Bootstrap.java,從名字上也可以看出是啟動類,如果你此時直接運行該類,會報如下錯誤:
Apr 02, 2014 3:27:38 PM org.apache.catalina.startup.ClassLoaderFactory validateFile
WARNING: Problem with directory [D:\workspace\Tomcat8\lib], exists: [false], isDirectory: [false], canRead: [false]
Apr 02, 2014 3:27:38 PM org.apache.catalina.startup.ClassLoaderFactory validateFile
WARNING: Problem with directory [D:\workspace\Tomcat8\lib], exists: [false], isDirectory: [false], canRead: [false]
Apr 02, 2014 3:27:40 PM org.apache.catalina.startup.Catalina load
WARNING: Can't load server.xml from D:\workspace\Tomcat8\conf\server.xml
Apr 02, 2014 3:27:40 PM org.apache.catalina.startup.Catalina load
WARNING: Can't load server.xml from D:\workspace\Tomcat8\conf\server.xml
Apr 02, 2014 3:27:40 PM org.apache.catalina.startup.Catalina start
SEVERE: Cannot start server. Server instance is not configured.說沒有配置服務器實例,從警告語句可以知道原因:當前項目路徑下沒有lib和conf這兩個文件夾,從而找不到服務器配置文件server.xml,當然也就不能實例化服務器了。
解決方法有兩個:
①將這兩個文件夾直接拷貝到項目工程下
那麼這兩個文件夾在哪?去Tomcat源碼路徑裡我們可以看到只有conf配置文件夾沒有lib文件夾,其實這也是我編譯Tomcat的原因:lib在編譯後的output文件夾中的build文件夾裡,conf這裡也有。當然你也可以直接從官網下載二進制包,裡面是編譯好的Tomcat,根路徑就有這兩個文件夾。將build下面的conf和lib文件夾直接拷貝到項目裡,再次運行,啟動成功。
Apr 02, 2014 3:37:58 PM org.apache.catalina.core.AprLifecycleListener init
INFO: The APR based Apache Tomcat Native library which allows optimal performance in production environments was not found on the java.library.path: D:\Program Files\Java\jre7\bin;C:\Windows\Sun\Java\bin;C:\Windows\system32;C:\Windows;C:\Windows\system32;C:\Windows;C:\Windows\System32\Wbem;C:\Windows\System32\WindowsPowerShell\v1.0\;D:\Program Files\TortoiseGit\bin;C:\Program Files (x86)\Windows Kits\8.1\Windows Performance Toolkit\;C:\Program Files\Microsoft SQL Server\110\Tools\Binn\;D:\Program Files\Gow\bin;D:\Program Files\Visual Leak Detector\bin\Win32;D:\Program Files\Visual Leak Detector\bin\Win64;D:\Program Files\Java\jdk1.7.0_51\\bin;D:\Program Files\apache-maven-3.2.1\bin;D:\Program Files\Git\cmd;.
Apr 02, 2014 3:38:00 PM org.apache.coyote.http11.Http11Protocol init
INFO: Initializing Coyote HTTP/1.1 on http-8080
Apr 02, 2014 3:38:00 PM org.apache.catalina.startup.Catalina load
INFO: Initialization processed in 2254 ms
Apr 02, 2014 3:38:00 PM org.apache.catalina.core.StandardService start
INFO: Starting service Catalina
Apr 02, 2014 3:38:00 PM org.apache.catalina.core.StandardEngine start
INFO: Starting Servlet Engine: Apache Tomcat/@VERSION@
Apr 02, 2014 3:38:00 PM org.apache.coyote.http11.Http11Protocol start
INFO: Starting Coyote HTTP/1.1 on http-8080
Apr 02, 2014 3:38:00 PM org.apache.jk.common.ChannelSocket init
INFO: JK: ajp13 listening on /0.0.0.0:8009
Apr 02, 2014 3:38:00 PM org.apache.jk.server.JkMain start
INFO: Jk running ID=0 time=0/29 config=null
Apr 02, 2014 3:38:00 PM org.apache.catalina.startup.Catalina start
INFO: Server startup in 386 ms②添加VM虛擬機運行參數
第二種方法就是添加VM參數,指定這兩個文件夾的具體路徑,用VM的-D參數指定catalina.home屬性值為具體的路徑,具體方法如下:
Run as -> Run Configuration... - > Arguments -> VM arguments中設置:
-Dcatalina.home="D:/apache-tomcat-8.0.5-src/output/build"
然後Run就可以啟動了
作者:cnblogs Alexia(minmin)