寫的不錯的一個系列 轉之
本文是Tomcat源代碼閱讀系列的第一篇文章,在閱讀Tomcat源代碼之前,我們首先需要將Tomcat的源代碼在IDE裏面運行起來,這樣方便我們閱讀的過程中調試。本文總結一下在IDEA 或者 Eclipse中運行Tomcat源代碼環境的搭建過程,同時我們通過Maven來負責項目的構建。
在進行搭建之前,我們首先來說一下總體的思路。我們知道Tomcat運行的時候,一部分是源代碼編譯以後的可運行的Jar,另外一部分則是運行時的環境(也就是我們從官方下載下來的二進制分發包中的一系列的配置文件以及目錄結構,說的更直白點就是CATALINA_HOME環境變量指定的目錄),本文對於第一部分採用IntelliJ IDEA 運行tomcat-7.0.42 tag的源代碼,而對於第二部分運行環境,我們則直接採用tomcat-7.0.42的二進制分發包。明白了上述的思路以後,咋們就來一步步的搭建吧。
首先咋們來看看搭建完成以後的總體的目錄結構,然後再一步步的去分解搭建過程。筆者搭建完以後,最終的運行結構如下圖所示:
下面分別解釋一下上圖工程結構中涉及到的文件和目錄:
- .idea和tomcat-study.iml是IntelliJ IDEA的文件,如果你用Eclipse的話不會存在這兩個東東 。
catalina-home是從官方下載的7.0.42的二進制分發包解壓後的目錄
target是Maven編譯項目以後生成的文件夾,熟悉Maven的讀者應該很熟悉此目錄
tomcat-7.0.42-sourcecode是從Tomcat 官方倉庫 下載的tags的源代碼
pom.xml是Maven的配置文件,此工程中有兩個pom.xml,這裏運用了Maven聚合的特性。
瞭解了最終的結構以後,咋們就來一步步的搭建它吧。
第一步 創建項目目錄結構
本文假設我們將項目放在 ~/develop/java 目錄中。
create project structure
cd ~/develop/java
mkdir Tomcat
cd Tomcat
touch pom.xml
第二步 下載Tomcat 7.0.42二進制分發包
我們通過apache-tomcat-7.0.42的 官方地址 下載它。具體的過程如下:
download apache-tomcat-7.0.42 binary distribution
cd ~/develop/java/Tomcat
wget http://mirrors.hust.edu.cn/apache/tomcat/tomcat-7/v7.0.42/bin/apache-tomcat-7.0.42.tar.gz
tar -zxvf apache-tomcat-7.0.42.tar.gz
rm apache-tomcat-7.0.42.tar.gz
mv apache-tomcat-7.0.42 catalina-home
第三步 下載Tomcat 7.0.42 源代碼
接下來我們從Tomcat的 官方SVN倉庫 下載Tomcat 7.0.42源代碼,具體的步驟如下:
download Tomcat 7.0.42 source code
cd ~/develop/java/Tomcat
svn co http://svn.apache.org/repos/asf/tomcat/tc7.0.x/tags/TOMCAT_7_0_42/ tomcat-7.0.42-sourcecode
在這一步中,我們將7.0.42的源代碼遷入到了tomcat-7.0.42-sourcecode目錄中。
第四步 創建聚合模塊pom.xml
因爲我們通過maven來對項目進行構建,這就需要我們來創建一個pom.xml文件,具體過程如下:
create aggregation child project pom.xml
cd ~/develop/java/Tomcat/tomcat-7.0.42-sourcecode
touch pom.xml
用你喜歡的編輯器打開pom.xml然後用下面的內容替換它的內容:
pom.xml
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>org.apache.tomcat</groupId>
<artifactId>Tomcat7.0</artifactId>
<name>Tomcat7.0</name>
<version>7.0</version>
<build>
<finalName>Tomcat7.0</finalName>
<sourceDirectory>java</sourceDirectory>
<testSourceDirectory>test</testSourceDirectory>
<resources>
<resource>
<directory>java</directory>
</resource>
</resources>
<testResources>
<testResource>
<directory>test</directory>
</testResource>
</testResources>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>2.3</version>
<configuration>
<encoding>UTF-8</encoding>
<source>1.6</source>
<target>1.6</target>
</configuration>
</plugin>
</plugins>
</build>
<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.4</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>ant</groupId>
<artifactId>ant</artifactId>
<version>1.7.0</version>
</dependency>
<dependency>
<groupId>wsdl4j</groupId>
<artifactId>wsdl4j</artifactId>
<version>1.6.2</version>
</dependency>
<dependency>
<groupId>javax.xml</groupId>
<artifactId>jaxrpc</artifactId>
<version>1.1</version>
</dependency>
<dependency>
<groupId>org.eclipse.jdt.core.compiler</groupId>
<artifactId>ecj</artifactId>
<version>4.2.2</version>
</dependency>
</dependencies>
</project>
對於pom.xml文件我們需要注意以下幾點:
因爲下載代碼不符合Maven默認的目錄結構約定,因此需要修改 resources 和 testResources 爲 java 和 test ,而不是默認的 src/main/resource 和 src/test/resource ,修改 sourceDirectory 和 testSourceDirectory 爲, java 和 test ,而不是默認的 src/main/java 和 src/test/java .
因爲Tomcat源代碼的編譯需要wsdl4j,jaxrpc,ecj等jar包,因此需要增加相關的依賴。
第五步 創建項目的根pom.xml文件
這一步我麼在Tomcat目錄中創建pom.xml文件,這裏採用了Maven中聚合的概念.具體過程如下:
create root pom.xml
cd ~/develop/java/Tomcat
touch pom.xml
用你喜歡的編輯器打開剛創建的空的pom.xml文件,修改它的內容如下:
~/develop/java/Tomcat/pom.xml
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>net.imtiger</groupId>
<artifactId>tomcat-study</artifactId>
<name>Tomcat 7.0 Study</name>
<version>1.0</version>
<packaging>pom</packaging>
<modules>
<module>tomcat-7.0.42-sourcecode</module>
</modules>
</project>
第六步 用IntelliJ IDEA 打開項目根目錄的pom.xml
這一步需要注意,要用IDEA 打開項目根目錄的pom.xml文件(也就是~/develop/java/Tomcat/pom.xml)
第七步 運行Tomcat
終於到激動人心的時刻了,我們知道任何Java程序都會有一個 public static void main(String… args) 的入口,Tomcat本身是用Java寫的,因此它也不例外,對於Tomcat來說,入口類是 org.apache.catalina.startup.Bootstrap ,我們找到這個類,然後在IntelliJ IDEA中創建一個運行配置,其中最主要的就是VM options的配置了,在VM options裏面填寫如下的參數:
(重要)必須配置VM options
-Dcatalina.home=catalina-home -Dcatalina.base=catalina-home
-Djava.endorsed.dirs=catalina-home/endorsed -Djava.io.tmpdir=catalina-home/temp
-Djava.util.logging.manager=org.apache.juli.ClassLoaderLogManager
-Djava.util.logging.config.file=catalina-home/conf/logging.properties
配置好後,IntelliJ IDEA的配置界面如下:
點擊運行,即可看到Tomcat已經啓動了,日誌已經打到了IntelliJ IDEA的控制檯上了,這個時候可以啓動瀏覽器輸入 http://127.0.0.1:8080 看看是否啓動成功。
接下來,咋們在Bootstrap的main方法中,增加一句 System.out.println(“Have fun and Enjoy!”); ,然後運行一下,看看加入的信息是否被打入到了控制檯,在筆者的電腦上打印可以看到信息已經輸出如下信息:
上面就是Tomcat7.0.42源代碼在IntelliJ IDEA運行環境搭建的完整的過程。因爲筆者日常開發採用的是IntelliJ IDEA,所以本文就只寫了IntelliJ IDEA的搭建,但是本文采用了Maven來進行構建的,理論上來說其它IDE,比如Eclipse,只要支持Maven,則可以採用本文同樣的方法進行,用Eclipse開發的童鞋,按照本文的步驟理論上也是可以運行起來的。
最後,列出幾個筆者在搭建的過程中遇到的幾個小問題。
org.apache.catalina.connector.TestRequest 類的 prepareRequestBug54984 中有兩個特殊字符 äö ,在SVN 遷出的時候變爲了亂碼,導致Maven在編譯的時候編譯不過,大家可以複製 äö 替換亂碼的字符即可。
CompilationUnit 類中的 public boolean ignoreOptionalProblems() 方法被標記爲了@Override,但是其實現的接口 ICompilationUnit 屬於 org.eclipse.jdt.core.compiler:ecj ,而3.x版本的 ICompilationUnit 中沒有 ignoreOptionalProblems 方法,4.x的版本中才有,因此爲了編譯通過,本文采用了4.2.2版本。
另外本文最終搭建好的環境,我已經放在Github上了,不想搭建的童鞋可以直接clone一份使用。 Github倉庫地址