最近由於需求須要修改Tomcat中的某些功能,無奈只能研究那部分源碼而後稍做修改。java
目前Tomcat最新版是8.0,下載了源碼包,編譯並導入Eclipse中研究比較方便。
web
1.1 先到Apache Tomcat 8.0官網下載最新版Source Code Distributions,解壓到某個目錄下,如D:\apache-tomcat-8.0.5-srcapache
1.2 使用ant編譯tomcat
(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了。dom
(2)編譯Tomcat 8.0eclipse
很是簡單,cmd進入到剛下載的源碼路徑下,用下面兩個命令便可編譯:jsp
ant download
ant
"ant download"命令會下載編譯Tomcat所需的依賴包。maven
這裏有兩個問題須要注意:
測試
熟悉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
因爲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.jar
test包裏須要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就能夠啓動了。