1. 程式人生 > >tomcat原始碼下載並匯入eclipse

tomcat原始碼下載並匯入eclipse

1. 獲取原始碼

   方式一:從官網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

2. 將原始碼匯入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會導致構建失敗。

3.  在build path裡新增jar包,解決編譯問題

    匯入eclipse後,會發現工程tomcat7有一個紅色的驚歎號,這是因為依賴的jar包沒有新增到build path裡導致的編譯錯誤。參考部落格 http://jackycheng2007.iteye.com/blog/1477845 中的第三步。     遇到的另外問題,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

4. 執行