天天看點

Java之——Eclipse導入Tomcat源碼

最近,很多朋友在問我如何将Tomcat源碼導入到eclipse,正好最近本人也正在研究Tomcat源碼,那麼就把這篇如何将Tomcat源碼導入到eclipse的文章整合後發出來供大家參考,網上也有很多類似的文章,但是大部分整理的不是很直覺,本文經過本人親測可行。供大家研究Tomcat源碼參考。

一、 擷取源代碼

   方式一:從官網http://tomcat.apache.org/download-70.cgi 直接下載下傳,官網提供了Binary 和 Source Code兩種下載下傳方式,要研究tomcat源代碼,選擇source code 方式下載下傳

   方式二:利用svn擷取源代碼,先安裝svn,再建立目錄tomcat7, 接着在目錄裡執行以下指令

svn co http://svn.apache.org/repos/asf/tomcat/tc7.0.x/tags/TOMCAT_7_0_35/ ./      

  tags目錄下有不同版本的tomcat 源碼,這裡下載下傳的版本是7.0.35

二. 将源碼導入eclipse

    tomcat的源碼是利用ant來建立和管理的。先安裝ant,再執行ant ide-eclipse,該指令執行成功後,會在tomcat7目錄下生産.project和.classpath兩個檔案,即成為eclipse工程了。這樣你就可以将tomcat源碼導入eclipse了。

     執行ant ide-eclipse時報錯:

BUILD FAILED build.xml:2361: The following error occurred while executing this line:
BUILD FAILED build.xml:2449: Compile failed; see the compiler error output for details.      

檢視編譯的錯誤日志為:

build-tomcat-dbcp:
     [copy] Copying 64 files to E:\usr\share\java\tomcat7-deps\dbcp
     [move] Moving 64 files to E:\usr\share\java\tomcat7-deps\dbcp\src\java\org\apache\tomcat\dbcp
    [javac] Compiling 64 source files to E:\usr\share\java\tomcat7-deps\dbcp\classes
    [javac] warning: [options] bootstrap class path not set in conjunction with -source 1.6
    [javac] E:\usr\share\java\tomcat7-deps\dbcp\src\java\org\apache\tomcat\dbcp\dbcp\BasicDataSource.java:53: error: Bas
icDataSource is not abstract and does not override abstract method getParentLogger() in CommonDataSource
    [javac] public class BasicDataSource implements DataSource {
    [javac]        ^
    [javac] E:\usr\share\java\tomcat7-deps\dbcp\src\java\org\apache\tomcat\dbcp\dbcp\DelegatingStatement.java:46: error:
 DelegatingStatement is not abstract and does not override abstract method isCloseOnCompletion() in Statement
    [javac] public class DelegatingStatement extends AbandonedTrace implements Statement {
    [javac]        ^
    [javac] E:\usr\share\java\tomcat7-deps\dbcp\src\java\org\apache\tomcat\dbcp\dbcp\DelegatingPreparedStatement.java:57
: error: DelegatingPreparedStatement is not abstract and does not override abstract method isCloseOnCompletion() in Stat
ement      

根據日志錯誤推測,依賴的dbcp相關的jar版本不對。本機安裝的jdk版本是1.7的,于是在本機又裝了一個1.6的jdk,并修改相關環境變量讓JAVA_HOME指向jdk 1.6目錄。再次執行ant ide-eclipse得到了

 BUILD SUCCESSFUL

Total time: 2 minutes 57 seconds

也注意到 build-tomcat-dbcp的建構日志更新為:

build-tomcat-dbcp:
     [copy] Copying 64 files to E:\usr\share\java\tomcat7-deps\dbcp
     [move] Moving 64 files to E:\usr\share\java\tomcat7-deps\dbcp\src\java\org\apache\tomcat\dbcp
    [javac] Compiling 64 source files to E:\usr\share\java\tomcat7-deps\dbcp\classes
    [javac] 注意:某些輸入檔案使用或覆寫了已過時的 API。
    [javac] 注意:要了解詳細資訊,請使用 -Xlint:deprecation 重新編譯。
    [javac] 注意:某些輸入檔案使用了未經檢查或不安全的操作。
    [javac] 注意:要了解詳細資訊,請使用 -Xlint:unchecked 重新編譯。
      [jar] Building jar: E:\usr\share\java\tomcat7-deps\dbcp\tomcat-dbcp.jar
      [jar] Building jar: E:\usr\share\java\tomcat7-deps\dbcp\tomcat-dbcp-src.jar      

是以,該問題可總結為:tomcat源碼依賴的jdk版本為1.6及其以下,使用jdk1.7會導緻建構失敗。

三.  在build path裡添加jar包,解決編譯問題

    導入eclipse後,會發現工程tomcat7有一個紅色的驚歎号,這是因為依賴的jar包沒有添加到build path裡導緻的編譯錯誤。具體的解決方案如下:

在eclipse裡面添加lib變量

導入項目以後你會發現有幾個錯誤導緻不能編譯,其實是缺少lib變量:

ANT_HOME, 指向ant的安裝目錄

TOMCAT_LIBS_BASE,指向依賴庫的位置,如果你還沒有在tomcat7下執行:

ant      

來build和deploy這個項目,就先執行它。

這樣它就會下載下傳需要的lib。

Java之——Eclipse導入Tomcat源碼

如果你不确定放到哪裡了,你可以搜尋ecj-3.7.2,把它的上級目錄指定給這個變量就好了。

添加好之後,eclipse會提示你重新build項目,當然要。之後就會沒有錯誤了。

遇到的另外問題,org.apache.naming.factory.webservices包下的兩個類ServiceProxy,ServiceRefFactory依然有錯,無法識别

import javax.xml.rpc.Service;
import javax.xml.rpc.ServiceException;
import javax.wsdl.Definition;
import javax.wsdl.Port;
import javax.wsdl.extensions.ExtensibilityElement;
import javax.wsdl.extensions.soap.SOAPAddress;
import javax.wsdl.factory.WSDLFactory;
import javax.wsdl.xml.WSDLReader;      

這些類。本機依然缺少jar包,百度了下發現缺少一個web service的開發工具包 axis-bin-1_4.zip。 下載下傳後,添加到build path裡解決。

題外話:ant沒有maven用起來友善,maven可以管理依賴的jar,會自動從maven倉庫裡下載下傳依賴,無需手動下載下傳jar和添加build path

四 運作

右擊這個tomcat-7.0.x項目,選擇run as / Java Application,它會自動搜尋項目中的所有main函數,你選擇org.apache.catalina.startup.Bootstrap的main函數就是。 選擇好了之後,你也許會看到有tomcat-start和tomcat-stop兩個啟動項讓你選擇,其實這個是tomcat為你準備好的launch檔案,在tomcat7\res\ide-support\eclipse下面有兩個launch檔案。也就是說你直接可以在run configuration裡面找到這兩個啟動配置,進而加以利用。在run configuration的配置裡面的Common tab裡面你還可以設定選中debug,進而你可以在debug菜單下顯示它了。

問題:為什麼這個函數的注釋寫僅僅為了測試

/** 
* Main method, used for testing only. 
* 
* @param args Command line arguments to be processed 
*/  
public static void main(String args[]) {      

啟動好以後你可以打開下面的網址:

http://localhost:8080/      

你會看到歡迎頁面,大功告成!你可以在main裡面設定斷點debug了。

五、配置更為詳細的log

看更為詳細的log有利于我們準确地跟蹤tomcat的執行過程。tomcat的日志架構允許我們配置第三方的log系統實作,比如log4j。預設情況下它使用java.util.logging.

需要兩步來實作更為詳細的log的配置

1)運作參數,加上

-Djava.util.logging.config.file=${project_loc:/tomcat-7.0.x}/conf/logging.properties      

2)修改log level的配置,把FINE,改成FINEST。并加入:

org.apache.catalina.level = FINEST