Tomcat7調試運行環境搭建與源代碼分析入門

1. 須要準備好下面這些工具 java

JDK 1.6+ web

Maven 2或3 apache

TortoiseSVN 1.7+ (從1.7開始」.svn」目錄集中放在一處了,再也不每一個目錄下都放一份) api

Eclipse 3.5+ 瀏覽器

這4個工具不在這裏描述怎麼配置了,若是你是有兩三年開發經驗的Java開發人員,正常來說都一直在用了。 tomcat

另外,分析tomcat源代碼不須要對這4個工具作什麼特殊配置。 架構

2. 下載Tomcat的源代碼 app

Apache旗下的開源項目基本上都放在這: http://svn.apache.org/repos/asf eclipse

裏面包含了tomcat、struts、hadoop、hbase等流行的開源項目的源代碼, webapp

能夠直接用瀏覽器打開這個URL,或者用TortoiseSVN的Repository Browser打開它。

tomcat的svn是: http://svn.apache.org/repos/asf/tomcat, 以下圖所示:

目前tomcat有4個大分支:

5.5 : http://svn.apache.org/repos/asf/tomcat/tc5.5.x

6.0 : http://svn.apache.org/repos/asf/tomcat/tc6.0.x

7.0 : http://svn.apache.org/repos/asf/tomcat/tc7.0.x

8.0 : http://svn.apache.org/repos/asf/tomcat/trunk

5.5分支會在今年9月30號後中止維護,因此除非有歷史遺留系統,不推薦再去讀它的代碼,

6.0分支是比較成熟的,在生產環境用得比較多,

目前官方對這個分支進入維護、bugfix階段,不多有新功能添加進來了,

我我的也不推薦讀它的代碼,代碼相對7.0來說比較髒亂。

7.0分支完整實現了servlet 3.0規範,已陸續發佈了27個小版本,己經穩定了,可用於生產環境,

代碼比5.五、6.0分支幹淨整潔得多,這也是我強烈向你推薦的版本。

8.0分支主要關注web socket和spdy,正處於活躍開發階段,代碼變更比較頻繁,保持關注便可。

因此這篇文章講的是7.0分支,研究tomcat推薦直接提取svn的源代碼:

用TortoiseSVN checkout這個svn的代碼:http://svn.apache.org/repos/asf/tomcat/tc7.0.x/trunk

放到D:\Tomcat7\trunk (你能夠換別的目錄)

而後再從這下載一個二進制分發包(Binary Distributions)

http://labs.mop.com/apache-mirror/tomcat/tomcat-7/v7.0.27/bin/apache-tomcat-7.0.27.zip

解壓後放到D:\Tomcat7,順便把」apache-tomcat-7.0.27″重命名成launch吧,

用這個二進制分發包而不是從源代碼構建只是爲了節省時間,

直接用它conf目錄裏面的配置文件和webapps下的例子。

3. 把它變成maven工程

主要是添加幾個依賴(ecj、ant、jaxrpc等),不然的話導入eclipse後會有編譯錯誤,

另外,由於tomcat不是標準的maven工程項目,好比沒有src\main\java這樣的目錄,

因此要調整一下sourceDirectory和testSourceDirectory,下面是一個完整的pom文件,

直接放到D:\Tomcat7目錄便可(pom.xml與以前的launch、trunk目錄並列)

(注: pom.xml文件在附件中)

 
  1. <project xmlns=「http://maven.apache.org/POM/4.0.0″ xmlns:xsi=「http://www.w3.org/2001/XMLSchema-instance」    
  2.     xsi:schemaLocation=「http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd」>    
  3.     <modelVersion>4.0.0</modelVersion>    
  4.     
  5.     <groupId>org.apache.tomcat</groupId>    
  6.     <artifactId>Tomcat7.0</artifactId>    
  7.     <name>Tomcat7.0</name>    
  8.     <version>7.0</version>    
  9.     
  10.     <build>    
  11.         <finalName>Tomcat7.0</finalName>    
  12.         <sourceDirectory>trunk/java</sourceDirectory>    
  13.         <testSourceDirectory>trunk/test</testSourceDirectory>    
  14.         <resources>    
  15.             <resource>    
  16.                 <directory>trunk/java</directory>    
  17.             </resource>    
  18.         </resources>    
  19.         <testResources>    
  20.             <testResource>    
  21.                 <directory>trunk/test</directory>    
  22.             </testResource>    
  23.         </testResources>    
  24.         <plugins>    
  25.             <plugin>    
  26.                 <groupId>org.apache.maven.plugins</groupId>    
  27.                 <artifactId>maven-compiler-plugin</artifactId>    
  28.                 <version>2.3</version>    
  29.                 <configuration>    
  30.                     <source>1.6</source>    
  31.                     <target>1.6</target>    
  32.                 </configuration>    
  33.             </plugin>    
  34.         </plugins>    
  35.     </build>    
  36.     
  37.     <dependencies>    
  38.         <dependency>    
  39.             <groupId>junit</groupId>    
  40.             <artifactId>junit</artifactId>    
  41.             <version>4.4</version>    
  42.             <scope>test</scope>    
  43.         </dependency>    
  44.         <dependency>    
  45.             <groupId>org.eclipse.jdt.core.compiler</groupId>    
  46.             <artifactId>ecj</artifactId>    
  47.             <version>3.7.2</version>    
  48.         </dependency>    
  49.         <dependency>    
  50.             <groupId>ant</groupId>    
  51.             <artifactId>ant</artifactId>    
  52.             <version>1.7.0</version>    
  53.         </dependency>    
  54.         <dependency>    
  55.             <groupId>wsdl4j</groupId>    
  56.             <artifactId>wsdl4j</artifactId>    
  57.             <version>1.6.2</version>    
  58.         </dependency>    
  59.         <dependency>    
  60.             <groupId>javax.xml</groupId>    
  61.             <artifactId>jaxrpc</artifactId>    
  62.             <version>1.1</version>    
  63.         </dependency>    
  64.     </dependencies>    
  65.     
  66. </project>    

4. 導入Eclipse

在命令行窗口中進入D:\Tomcat7目錄,執行 mvn eclipse:eclipse 就能夠轉成eclipse工程項目了,

而後打開eclipse,點」File->Import->General->Existing Projects into Workspace」,

最後打開D:\Tomcat7就能看到Tomcat7.0這個項目了。

(若是eclipse裝了m2e插件不用執行mvn eclipse:eclipse的,能夠直接導入maven工程)

5. 在Eclipse中讓Tomcat跑起來

在Eclipse中打開org.apache.catalina.startup.Bootstrap類,

在編輯區右擊,點」Run As->Run configurations」,而後雙擊」Java Aplication」就會出來一個新的」Bootstrap」,

選中它,在右邊點擊」Arguments」那一欄,把下面的內容copy到」VM arguments」中:

-Dcatalina.home=launch -Dcatalina.base=launch -Djava.endorsed.dirs=launch/endorsed -Djava.io.tmpdir=launch/temp -Djava.util.logging.manager=org.apache.juli.ClassLoaderLogManager -Djava.util.logging.config.file=launch/conf/logging.properties

以下圖:

而後點run按鈕,就能夠啓動tomcat了,啓動成功會在Eclipse的console中顯示:

 
  1. 2012-6-10 14:25:31 org.apache.catalina.startup.Catalina start    
  2. 信息: Server startup in 359 ms 

除上面這種方式外,這裏還有一個Eclipse的launch腳本(start-tomcat7.launch (注: 在附件中)),

 
  1. <?xml version=「1.0″ encoding=「UTF-8″ standalone=「no」?>    
  2. <launchConfiguration type=「org.eclipse.jdt.launching.localJavaApplication」>    
  3. <listAttribute key=「org.eclipse.debug.core.MAPPED_RESOURCE_PATHS」>    
  4. <listEntry value=「/Tomcat7.0/trunk/java/org/apache/catalina/startup/Bootstrap.java」/>    
  5. </listAttribute>    
  6. <listAttribute key=「org.eclipse.debug.core.MAPPED_RESOURCE_TYPES」>    
  7. <listEntry value=「1″/>    
  8. </listAttribute>    
  9. <stringAttribute key=「org.eclipse.jdt.launching.MAIN_TYPE」 value=「org.apache.catalina.startup.Bootstrap」/>    
  10. <stringAttribute key=「org.eclipse.jdt.launching.PROGRAM_ARGUMENTS」 value=「start」/>    
  11. <stringAttribute key=「org.eclipse.jdt.launching.PROJECT_ATTR」 value=「Tomcat7.0″/>    
  12. <stringAttribute key=「org.eclipse.jdt.launching.VM_ARGUMENTS」 value=「-Dcatalina.home=launch -Dcatalina.base=launch -Djava.endorsed.dirs=launch/endorsed -Djava.io.tmpdir=launch/temp -Djava.util.logging.manager=org.apache.juli.ClassLoaderLogManager -Djava.util.logging.config.file=launch/conf/logging.properties」/>    
  13. </launchConfiguration>    

能夠放到D:\Tomcat7目錄,而後flush一下Eclipse,在Eclipse中右擊這個文件,點Run As啓動Tomcat,點Debug As能夠調試Tomcat。

下圖是Tomcat在Eclipse中的項目佈局:

最後,打開你的瀏覽器,輸入 http://127.0.0.1:8080/examples/ 看看例子吧。

6. 簡單的源代碼閱讀指南:

 
  1. 包名                    用途    
  2. =================================================    
  3. javax                 servlet/jsp/el相關的api    
  4. org.apache.catalina   tomcat自身架構    
  5. org.apache.coyote     http、ajp協議實現相關的類    
  6. org.apache.el         實現el規範    
  7. org.apache.jasper     實現jsp規範、編譯jsp文件    
  8. org.apache.juli       tomcat的日誌系統    
  9. org.apache.naming     jndi實現    
  10. org.apache.tomcat     tomcat的工具包、net、digester xml解析器   

閱讀順序:

能夠從org.apache.catalina.startup.Bootstrap這個類開始看起,

而後到org.apache.catalina.startup.Catalina,

在Catalina類中會觸發conf/server.xml文件的解析,

這時要看org.apache.tomcat.util.digester中的類,

解析的過程當中會用到org.apache.catalina.startup包中的不少RuleSet類,

server.xml文件解析完後,會生成org.apache.catalina.core包中的各類StandardXXX類的實例,

好比StandardServer、StandardService、StandardEngine等等,

這些Standard組件都是有生命週期的,接着會調用他們的init、start等方法,

會觸發下面這些組件進入init、start狀態

org.apache.catalina.connector.Connector

org.apache.coyote.http11.Http11Protocol

org.apache.tomcat.util.net.JIoEndpoint

在JIoEndpoint(或NioEndpoint、AprEndpoint)中會監聽8080這樣的端口,

有請求進來了,就進行相關的io操做,接着轉到org.apache.coyote包中的相應類進行協議解析,

生成org.apache.catalina.connector.Request和org.apache.catalina.connector.Response實例,

而後轉到各類Valve、應用Filter,最後到達應用的Servlet/JSP。

下圖描述了Tomcat7的核心架構:

相關文章
相關標籤/搜索