狠狠撸

狠狠撸Share a Scribd company logo
Tomcat 源码学习 1



2008 年 08 月 29 日 星期五 17:02

作为一位 Java 程序员,如果您没有接触过开源软件、项目或框架的话,恐怕有些不可思议。轰轰烈烈的开
会在其中扮演了中流砥柱的角色,业界巨擘 SUN,IBM, BEA 和 Oracle 等公司的积极参与,使得声势浩大的
量。2001 年 11 月,IBM 向 Apache 基金会捐献出 Visual Age for Java,这个看似穷途末路的产物经众多高
接击败了不开源的 JBuilder,让做编译器起家的 Borland 公司几乎关张大吉。Eclipse 这个产物如此经典,
习。在 Apache Harmony 的围追堵截下,Java 的发明者 Sun 公司一看势头不妙,于 2006 年宣布 Java 开源,随
码。今年 1 月,开源的死对头、冷酷自私的微软也不得不在 MS-RL 协议下公开.Net 的源代码。但是,在这如
又有多少贡献呢,我们开创了哪些框架、项目和产物,为开源界添砖加瓦呢?以笔者短浅的目光看来,我们
外经典开源项目一较高下的,少之又少矣!

作为一名中国的程序员,咱们能没有遗憾吗?为什么经典的 Apache Web Server 不是中国人写的;为什么 L
振臂一呼,应者云集;为什么 JBoss 能与巨无霸式的 Websphere 相抗衡;为什么 MySQL 能在 Oracle 和 SQL S
等问题,在遗憾之余,我想我们应该花点时间好好思考一下,中国的软件产业怎么了,中国的程序员又怎么

在笔者看来,我们的程序员对开源的理解是相当狭隘的。国学大师王国维曾说过,古往今来成大学问大事业
独上高楼,望尽天涯路”,这是第一重境界,迷惘也;“衣带渐宽终不悔,为伊消得人憔悴”,苦苦求索之
度,蓦然回首,那人却在灯火阑珊处”,经历多少次的失败和挫折后,终于参透真谛,领悟真理。我觉得开

首先,我们要敞开心胸,拥抱开源(Open to Open Source)。这重境界我们大家都能做到,拿来主义嘛,谁
去下载一个免费 MySQL;需要 IDE 时,去下载 Eclipse;需要版本控制工具时,就去下载 CVS;需要写搜索引
开发 J2EE Web 应用时,Struts/JSF 加 Hibernate/iBATIS 再加上 Spring 或许成为我们的首选架构。但是,
大家下载之后,看看文档介绍,安装、配置并能运行,就以为万事大吉,一切顺利。偶尔遇到一些问题,去

其次,我们要深入开源,了解开源(Dig into Open Source)。要达到这个层次,就有些难度了。我们不但
然”的最好办法就是下载源代码,仔细研读,揣摩并领会源代 码的精义,看看这些经过诸多高手修改的源
到哪些设计思想及设计模式,能复用其中哪些源代码,人家运用了哪些软件管 理思想把这些来自世界各地
何,软件配置管理又是怎样进行的……,等等等等,我们从源代码中学习的东西太多了。在阅读源代码时,
获更多。

再次,我们要融入开源,贡献开源(Get involved in Open Source)。当我们彻底理解该项目源代码后,我
思想,或结合您的实际需要,或结合您的新想法,或针对 Mail lists 上的问题,对该开源项目加以改进和
估。当然,如果您有好的想法,您完全可以创建自己的开源项 目,Apache 基金会中众多的开源项目不都是
建新开源项目时,切忌不要重新发明轮子。

笔者才疏学浅,想以 Apache Jakarta 项目包中的核心项目 Tomcat 为例,希望通过阅读源码,能从这个经典
事业起到抛砖引玉的作用。

下面我们就开始我们的 Tomcat 源码学习之旅。
1. 下载 Tomcat6.0 的源代码

首先,我们得下载 Tomcat6.0 的源代码。Tomcat 源代码的版本控制工具不是 CVS,而是 Subversion,如果您
http://subversion.tigris.org/servlets/ProjectDocumentList?folderID=91 下载并安装这个开源的版本
接导入 Tomcat 源代码,请从 http://subclipse.tigris.org/update_1.0.x 下载 Subversion 插件,即可导入
窗口中键入 svn export help,您将会看到:

C:Documents and Settingscarlwu>svn help export

export: 产生一个无版本控制的目录树副本。

用法: 1、export [-r REV] URL[@PEGREV] [PATH]

2、export [-r REV] PATH1[@PEGREV] [PATH2]

1、从 URL 指定的仓库,导出一个干净的目录树到 PATH。如果有指定

REV 的话,内容即为该版本的,否则就是 HEAD 版本。如果 PATH

被省略的话,URL 的最后部份会被用来当成本地的目录名称。

2、在工作副本中,从指定的 PATH1 导出一个干净的目录树到 PATH2。如果

有指定 REV 的话,会从指定的版本导出,否则从工作副本导出。如果

PATH2 被省略的话,PATH1 的最后部份会被用来当成本地的目录名称。

如果没有指定 REV 的话,所有的本地修改都保留,但是未纳入版本控制

的文件不会被复制。



如果指定了 PEGREV ,将从指定的版本本开始查找。

有效选项:。。。。。。

我们看到 Subversion 给我们提供了非常友好的帮助,并且是中文的,看来中国程序员对这个开源项目有所

svn export http://svn.apache.org/repos/asf/tomcat/tc6.0.x/tags/TOMCAT_6_0_0/ D:carl_wutomcatsrc

这个命令的意思是把 Tomcat6.0 的源代码从 Subversion 库中导入到本机的 D:carl_wutomcatsrc目录,
Tomcat 的源代码顺利导入到目标目录。下面是源代码的目录机构,从这个目录结构中,我们可以看出该项目
看到了熟悉的.project 及.classpath 文件。如果您打算开发一个 Stand alone 的 Java 应用程序,不妨借鉴
bin 目录,将 xml 和 properties 配置文件放在 conf 目录中,把 Java 源码文件放在 java 或者 src 目录中,资
一些静态资源文件可以放在 res 目录,测试源代码可以放在 test 目录中。这是一个典型的 Java 应用程序的
的产物,其源代码目录结构和 Tomcat 及其相像。
2. 编译并运行

代码下载后,我们接下来就是要编译并运行 Tomcat。一提编译,我们不禁会想到可爱的 Ant。不错,Tomca
安装,请从 http://ant.apache.org/bindownload.cgi 处下载并安装它。然后,请从 Tomcat 的源代码文件找
该文件复制到 build.properties,然后打开 build.properties,找到下面这行:

base.path=/usr/share/java

将它改为:

base.path= D:/carl_wu/tomcat/share

在 Tomcat 编译过程中,Ant 会让我们下载一些必要的依赖项目,base.path 目录就是用来保存这些项目文件
的目录。修改完 base.path 后,我们回到 MS-DOS 窗口,切换到 Tomcat 源代码所在目录,然后运行 ant dow
一分钟未到,Ant 就告诉我们一个错误并提示我们编译失败,具体错误信息如下:

downloadzip:

[get] Getting: http://sunsite.informatik.rwth-aachen.de/eclipse/downloads/drops/R-3.2-200606291905/eclipse-JDT-3
[get] To: D:carl_wutomcatsharefile.zip
[get] Error opening connection java.io.FileNotFoundException: http://sunsite.informatik.rwth-
aachen.de:3080/eclipse/downloads/drops/R-3.2-200606291905/eclipse-JDT-3.2.zip

[get] Error opening connection java.io.FileNotFoundException: http://sunsite.informatik.rwth-
aachen.de:3080/eclipse/downloads/drops/R-3.2-200606291905/eclipse-JDT-3.2.zip

[get] Error opening connection java.io.FileNotFoundException: http://sunsite.informatik.rwth-
aachen.de:3080/eclipse/downloads/drops/R-3.2-200606291905/eclipse-JDT-3.2.zip

[get] Can't get http://sunsite.informatik.rwth-aachen.de/eclipse/downloads/drops/R-3.2-200606291905/eclipse-JDT-

BUILD FAILED

D:carl_wutomcatsrcbuild.xml:554: The following error occurred while executing this line:

D:carl_wutomcatsrcbuild.xml:514: Can't get http://sunsite.informatik.rwth-aachen.de/eclipse/downloads/drops/
D:carl_wutomcatsharefile.zip

Total time: 41 seconds

这个编译错误非常简单,就是找不到 http://sunsite.informatik.rwth-aachen.de/eclipse/downloads/drops/R-3.2-20
会想,Tomcat 的编译和 Eclipse 的 JDT 有什么关系?其实不然,Tomcat 是在 Eclipse 下开发的,所以需要 Eclipse 的 JDT(Java
既然找不到,我们只好自己动手,上 Google 一搜,马上发现这个文件的有效下载地址为:http://mirror.calvin.edu/eclipse/d
JDT-3.2.zip。我们打开刚才的 build.properties 文件,将其 34 行修改为:

jdt.loc= http://mirror.calvin.edu/eclipse/downloads/drops/R-3.2-200606291905/eclipse-JDT-3.2.zip

修改保存 build.properties 文件后,重新开始 ant download 任务。这次我们等的时间较长,因为 eclipse-J
我们可乘此机会去泡杯茶弄点咖啡什么的,等我们品茶回来,发现敬业的蚂蚁 Ant 告诉我们编译成功,虽然
创建的 base.path 目录(D:carl_wutomcatshare)中已经下载了 6 个依赖项目,它们都是 Tomcat 编译所

下面就开始真正的编译任务了,请在 MS-DOS 窗口内键入 ant 并回车,Ant 将在 2 分钟内编译 1000 多个源文件
利完成后,请打开 Tomcat 的源代码目录,会发现多了一个 output 目录,这是 Ant 的编译后的输出目录。请
目录,双击 startup.bat 文件,我们即可成功启动 Tomcat6.0,此时我们的编译工作就算顺利完成了。


3. 导入源代码到 Eclipse

3.1 请打开 Eclipse,新建一个 Java 项目,然后点击“Next”按钮,请选择“Create project from exist
入我们刚才下载的 Tomcat 源代码目录(i.e. D:carl_wutomcatsrc),然后点击“Next”直至结束。
3.2 我们将会看到 Eclipse 拒绝编译,这是因为 Eclipse 找不到该项目指定的库文件。请右击该项目,在弹
择“Properties”à“Libraries”,然后删除两个以 TOMCAT_LIBS 开头的两个库文件,只保留一个 JRE 库文
开始编译 Tomcat 源代码,但是发现一堆错误,这是因为我们没有为该项目添加编译所必须的 Jar 包。

3.3 准备好 Tomcat 项目所必须的 jar 文件,其实,刚才我们运行 ant download 任务时,已经下载过这些 j

ant.jar (请在 ant 安装目录的 lib 子目录中拷贝)

commons-collections-3.1.jar (从刚才 Ant 下载的 commons-collections-3.1 子目录中拷贝)

commons-dbcp-1.2.1.jar(从刚才 Ant 下载的 commons-dbcp-1.2.1 子目录中拷贝)

commons-logging-1.1.jar(如果您本机没有这个 jar 包,请从 http://commons.apache.org/downloads/download_logging.cgi

commons-pool-1.2.jar(从刚才 Ant 下载的 commons-pool-1.2 子目录中拷贝)

org.eclipse.jdt.core_3.2.0.v_671.jar(从刚才 Ant 下载的 eclipseplugins 子目录中拷贝)

3.4 当我们准备好这些 jar 文件后,将这些文件拷贝到某一目录(比如说 D:carl_wutomcattomcat_lib 目
Libraries,我们将这个新建的 User Libraries 命名为 TOMCAT_LIBS,并把这些文件加到 TOMCAT_LIBS。然后
项目。另外,别忘了把 JUnit 库也加到 Tomcat6 项目。这时 Eclipse 开始重新编译,编译过程顺利通过,所
构如下:
还有,请把 test 目录也加入到源代码中,方法是在 Eclipse 中右击”test”目录,然后在弹出菜单中选择“
Folder”,之后我们会看到 test 目录上就多了个源代码的符号,如上图所示。

3.5 在 Eclipse 中运行 Tomcat。请找到 Tomcat 的启动主类 org.apache.catalina.startup.Bootstrap,右击
As…”à”Open Run Dialog…”,然后在弹出的“Run”窗口中填入程序运行参数“start”和 JVM 运行参数
然后点击“Run”按钮,我们将会看到 Tomcat 正常启动。恭喜,咱们的 Tomcat 源码已经成功导入 Eclipse,
就能派上用场了。

3.5 调试 Tomcat,请打开 org.apache.jasper.compiler.Compiler 类的源代码,在 generateJava()方法的第
状态下运行 Tomcat,等 Tomcat 运行后,打开我们的浏览器,在地址栏中输入 http://localhost:8080/exam
并回车,然后我们可观察到 Eclipse 此时切换至调试视图:
上面的小实验表明我们可以在 Eclipse 中通过 Debugger 观察 Tomcat 的内部运行机理。另外补充一点,上面的 generateJava 方法
第一次请求或者 Jsp 源码发生变化时执行,如果您再次在浏览器中发送同样的请求,您将看不到上图的 Debug 界面,因为该方法

另外,还有一点很有意思。Tomcat6 以前版本的源代码分散在好几个子项目中,他们分别叫做 jakarta-ser
tomcat-catalina,jakarta-tomcat-connectors 和 jakarta-tomcat-jasper,我觉得 Tomcat 的开发者可能嫌
这些子项目都合并在一起了。但是,这种做法不利于我们阅读理解源代码。
Ad

Recommended

惭补惫别苍私服安装,惭补惫别苍使用教程
惭补惫别苍私服安装,惭补惫别苍使用教程
kangzj
?
鲍产耻苍迟耻安装厂痴狈总结
鲍产耻苍迟耻安装厂痴狈总结
wensheng wei
?
础辫补肠丑别+辫丑辫+尘测蝉辩濒在尝颈苍耻虫下的安装与配置
础辫补肠丑别+辫丑辫+尘测蝉辩濒在尝颈苍耻虫下的安装与配置
wensheng wei
?
The Most Important Algorithms
The Most Important Algorithms
wensheng wei
?
常用数据库的链接方法
常用数据库的链接方法
wensheng wei
?
罢飞颈迟迟别谤新手使用教程
罢飞颈迟迟别谤新手使用教程
wensheng wei
?
PHP-Debug-Manual-public
PHP-Debug-Manual-public
wensheng wei
?
管理员必备的20个 Linux系统监控工具
管理员必备的20个 Linux系统监控工具
wensheng wei
?
信息时代的组合数学
信息时代的组合数学
wensheng wei
?
Micaela Carter Presentation
Micaela Carter Presentation
micaelac329
?
尝颈苍耻虫安全配置终极指南
尝颈苍耻虫安全配置终极指南
wensheng wei
?
齿惭尝贬罢罢笔搁别辩耻别蝉迟的属性和方法介绍
齿惭尝贬罢罢笔搁别辩耻别蝉迟的属性和方法介绍
wensheng wei
?
【转】颁痴厂使用手册
【转】颁痴厂使用手册
wensheng wei
?
我的最小项目管理工具集
我的最小项目管理工具集
wensheng wei
?
数据库系统防黑客入侵技术综述
数据库系统防黑客入侵技术综述
wensheng wei
?
十张叫做幸福的图片
十张叫做幸福的图片
wensheng wei
?
部分笔贬笔问题总结摆转贴闭
部分笔贬笔问题总结摆转贴闭
wensheng wei
?
Ubuntu 下安装 svn 服务器
Ubuntu 下安装 svn 服务器
wensheng wei
?
惭痴颁详解:了解真正所谓的
惭痴颁详解:了解真正所谓的
wensheng wei
?
你会柔软地想起这个校园
你会柔软地想起这个校园
wensheng wei
?
几米语录(1)
几米语录(1)
wensheng wei
?
我的简历
我的简历
wensheng wei
?
Installation of Subversion on Ubuntu,...
Installation of Subversion on Ubuntu,...
wensheng wei
?
高级笔贬笔应用程序漏洞审核技术
高级笔贬笔应用程序漏洞审核技术
wensheng wei
?
存储过程编写经验和优化措施
存储过程编写经验和优化措施
wensheng wei
?
CentOS5 apache2 mysql5 php5 Zend
CentOS5 apache2 mysql5 php5 Zend
wensheng wei
?
Happiness is a Journey
Happiness is a Journey
wensheng wei
?
Java JNI 编程进阶
Java JNI 编程进阶
wensheng wei
?
Linux Shortcuts and Commands:
Linux Shortcuts and Commands:
wensheng wei
?
闯补惫补正则表达式详解
闯补惫补正则表达式详解
wensheng wei
?

More Related Content

Viewers also liked (11)

信息时代的组合数学
信息时代的组合数学
wensheng wei
?
Micaela Carter Presentation
Micaela Carter Presentation
micaelac329
?
尝颈苍耻虫安全配置终极指南
尝颈苍耻虫安全配置终极指南
wensheng wei
?
齿惭尝贬罢罢笔搁别辩耻别蝉迟的属性和方法介绍
齿惭尝贬罢罢笔搁别辩耻别蝉迟的属性和方法介绍
wensheng wei
?
【转】颁痴厂使用手册
【转】颁痴厂使用手册
wensheng wei
?
我的最小项目管理工具集
我的最小项目管理工具集
wensheng wei
?
数据库系统防黑客入侵技术综述
数据库系统防黑客入侵技术综述
wensheng wei
?
十张叫做幸福的图片
十张叫做幸福的图片
wensheng wei
?
部分笔贬笔问题总结摆转贴闭
部分笔贬笔问题总结摆转贴闭
wensheng wei
?
Ubuntu 下安装 svn 服务器
Ubuntu 下安装 svn 服务器
wensheng wei
?
惭痴颁详解:了解真正所谓的
惭痴颁详解:了解真正所谓的
wensheng wei
?
信息时代的组合数学
信息时代的组合数学
wensheng wei
?
Micaela Carter Presentation
Micaela Carter Presentation
micaelac329
?
尝颈苍耻虫安全配置终极指南
尝颈苍耻虫安全配置终极指南
wensheng wei
?
齿惭尝贬罢罢笔搁别辩耻别蝉迟的属性和方法介绍
齿惭尝贬罢罢笔搁别辩耻别蝉迟的属性和方法介绍
wensheng wei
?
【转】颁痴厂使用手册
【转】颁痴厂使用手册
wensheng wei
?
我的最小项目管理工具集
我的最小项目管理工具集
wensheng wei
?
数据库系统防黑客入侵技术综述
数据库系统防黑客入侵技术综述
wensheng wei
?
十张叫做幸福的图片
十张叫做幸福的图片
wensheng wei
?
部分笔贬笔问题总结摆转贴闭
部分笔贬笔问题总结摆转贴闭
wensheng wei
?
Ubuntu 下安装 svn 服务器
Ubuntu 下安装 svn 服务器
wensheng wei
?
惭痴颁详解:了解真正所谓的
惭痴颁详解:了解真正所谓的
wensheng wei
?

More from wensheng wei (20)

你会柔软地想起这个校园
你会柔软地想起这个校园
wensheng wei
?
几米语录(1)
几米语录(1)
wensheng wei
?
我的简历
我的简历
wensheng wei
?
Installation of Subversion on Ubuntu,...
Installation of Subversion on Ubuntu,...
wensheng wei
?
高级笔贬笔应用程序漏洞审核技术
高级笔贬笔应用程序漏洞审核技术
wensheng wei
?
存储过程编写经验和优化措施
存储过程编写经验和优化措施
wensheng wei
?
CentOS5 apache2 mysql5 php5 Zend
CentOS5 apache2 mysql5 php5 Zend
wensheng wei
?
Happiness is a Journey
Happiness is a Journey
wensheng wei
?
Java JNI 编程进阶
Java JNI 编程进阶
wensheng wei
?
Linux Shortcuts and Commands:
Linux Shortcuts and Commands:
wensheng wei
?
闯补惫补正则表达式详解
闯补惫补正则表达式详解
wensheng wei
?
Linux Security Quick Reference Guide
Linux Security Quick Reference Guide
wensheng wei
?
issue35 zh-CN
issue35 zh-CN
wensheng wei
?
Android模拟器SD Card映像文件使用方法
Android模拟器SD Card映像文件使用方法
wensheng wei
?
如何硬盘安装耻产耻苍迟耻8.10
如何硬盘安装耻产耻苍迟耻8.10
wensheng wei
?
ubunturef
ubunturef
wensheng wei
?
数据库设计方法、规范与技巧
数据库设计方法、规范与技巧
wensheng wei
?
揭秘全球最大网站贵补肠别产辞辞办背后的那些软件
揭秘全球最大网站贵补肠别产辞辞办背后的那些软件
wensheng wei
?
尘测蝉辩濒的字符串函数
尘测蝉辩濒的字符串函数
wensheng wei
?
你会柔软地想起这个校园
你会柔软地想起这个校园
wensheng wei
?
Installation of Subversion on Ubuntu,...
Installation of Subversion on Ubuntu,...
wensheng wei
?
高级笔贬笔应用程序漏洞审核技术
高级笔贬笔应用程序漏洞审核技术
wensheng wei
?
存储过程编写经验和优化措施
存储过程编写经验和优化措施
wensheng wei
?
CentOS5 apache2 mysql5 php5 Zend
CentOS5 apache2 mysql5 php5 Zend
wensheng wei
?
Happiness is a Journey
Happiness is a Journey
wensheng wei
?
Java JNI 编程进阶
Java JNI 编程进阶
wensheng wei
?
Linux Shortcuts and Commands:
Linux Shortcuts and Commands:
wensheng wei
?
闯补惫补正则表达式详解
闯补惫补正则表达式详解
wensheng wei
?
Linux Security Quick Reference Guide
Linux Security Quick Reference Guide
wensheng wei
?
Android模拟器SD Card映像文件使用方法
Android模拟器SD Card映像文件使用方法
wensheng wei
?
如何硬盘安装耻产耻苍迟耻8.10
如何硬盘安装耻产耻苍迟耻8.10
wensheng wei
?
数据库设计方法、规范与技巧
数据库设计方法、规范与技巧
wensheng wei
?
揭秘全球最大网站贵补肠别产辞辞办背后的那些软件
揭秘全球最大网站贵补肠别产辞辞办背后的那些软件
wensheng wei
?
尘测蝉辩濒的字符串函数
尘测蝉辩濒的字符串函数
wensheng wei
?
Ad

罢辞尘肠补迟源码学习1

  • 1. Tomcat 源码学习 1 2008 年 08 月 29 日 星期五 17:02 作为一位 Java 程序员,如果您没有接触过开源软件、项目或框架的话,恐怕有些不可思议。轰轰烈烈的开 会在其中扮演了中流砥柱的角色,业界巨擘 SUN,IBM, BEA 和 Oracle 等公司的积极参与,使得声势浩大的 量。2001 年 11 月,IBM 向 Apache 基金会捐献出 Visual Age for Java,这个看似穷途末路的产物经众多高 接击败了不开源的 JBuilder,让做编译器起家的 Borland 公司几乎关张大吉。Eclipse 这个产物如此经典, 习。在 Apache Harmony 的围追堵截下,Java 的发明者 Sun 公司一看势头不妙,于 2006 年宣布 Java 开源,随 码。今年 1 月,开源的死对头、冷酷自私的微软也不得不在 MS-RL 协议下公开.Net 的源代码。但是,在这如 又有多少贡献呢,我们开创了哪些框架、项目和产物,为开源界添砖加瓦呢?以笔者短浅的目光看来,我们 外经典开源项目一较高下的,少之又少矣! 作为一名中国的程序员,咱们能没有遗憾吗?为什么经典的 Apache Web Server 不是中国人写的;为什么 L 振臂一呼,应者云集;为什么 JBoss 能与巨无霸式的 Websphere 相抗衡;为什么 MySQL 能在 Oracle 和 SQL S 等问题,在遗憾之余,我想我们应该花点时间好好思考一下,中国的软件产业怎么了,中国的程序员又怎么 在笔者看来,我们的程序员对开源的理解是相当狭隘的。国学大师王国维曾说过,古往今来成大学问大事业 独上高楼,望尽天涯路”,这是第一重境界,迷惘也;“衣带渐宽终不悔,为伊消得人憔悴”,苦苦求索之 度,蓦然回首,那人却在灯火阑珊处”,经历多少次的失败和挫折后,终于参透真谛,领悟真理。我觉得开 首先,我们要敞开心胸,拥抱开源(Open to Open Source)。这重境界我们大家都能做到,拿来主义嘛,谁 去下载一个免费 MySQL;需要 IDE 时,去下载 Eclipse;需要版本控制工具时,就去下载 CVS;需要写搜索引 开发 J2EE Web 应用时,Struts/JSF 加 Hibernate/iBATIS 再加上 Spring 或许成为我们的首选架构。但是, 大家下载之后,看看文档介绍,安装、配置并能运行,就以为万事大吉,一切顺利。偶尔遇到一些问题,去 其次,我们要深入开源,了解开源(Dig into Open Source)。要达到这个层次,就有些难度了。我们不但 然”的最好办法就是下载源代码,仔细研读,揣摩并领会源代 码的精义,看看这些经过诸多高手修改的源 到哪些设计思想及设计模式,能复用其中哪些源代码,人家运用了哪些软件管 理思想把这些来自世界各地 何,软件配置管理又是怎样进行的……,等等等等,我们从源代码中学习的东西太多了。在阅读源代码时, 获更多。 再次,我们要融入开源,贡献开源(Get involved in Open Source)。当我们彻底理解该项目源代码后,我 思想,或结合您的实际需要,或结合您的新想法,或针对 Mail lists 上的问题,对该开源项目加以改进和 估。当然,如果您有好的想法,您完全可以创建自己的开源项 目,Apache 基金会中众多的开源项目不都是 建新开源项目时,切忌不要重新发明轮子。 笔者才疏学浅,想以 Apache Jakarta 项目包中的核心项目 Tomcat 为例,希望通过阅读源码,能从这个经典 事业起到抛砖引玉的作用。 下面我们就开始我们的 Tomcat 源码学习之旅。
  • 2. 1. 下载 Tomcat6.0 的源代码 首先,我们得下载 Tomcat6.0 的源代码。Tomcat 源代码的版本控制工具不是 CVS,而是 Subversion,如果您 http://subversion.tigris.org/servlets/ProjectDocumentList?folderID=91 下载并安装这个开源的版本 接导入 Tomcat 源代码,请从 http://subclipse.tigris.org/update_1.0.x 下载 Subversion 插件,即可导入 窗口中键入 svn export help,您将会看到: C:Documents and Settingscarlwu>svn help export export: 产生一个无版本控制的目录树副本。 用法: 1、export [-r REV] URL[@PEGREV] [PATH] 2、export [-r REV] PATH1[@PEGREV] [PATH2] 1、从 URL 指定的仓库,导出一个干净的目录树到 PATH。如果有指定 REV 的话,内容即为该版本的,否则就是 HEAD 版本。如果 PATH 被省略的话,URL 的最后部份会被用来当成本地的目录名称。 2、在工作副本中,从指定的 PATH1 导出一个干净的目录树到 PATH2。如果 有指定 REV 的话,会从指定的版本导出,否则从工作副本导出。如果 PATH2 被省略的话,PATH1 的最后部份会被用来当成本地的目录名称。 如果没有指定 REV 的话,所有的本地修改都保留,但是未纳入版本控制 的文件不会被复制。 如果指定了 PEGREV ,将从指定的版本本开始查找。 有效选项:。。。。。。 我们看到 Subversion 给我们提供了非常友好的帮助,并且是中文的,看来中国程序员对这个开源项目有所 svn export http://svn.apache.org/repos/asf/tomcat/tc6.0.x/tags/TOMCAT_6_0_0/ D:carl_wutomcatsrc 这个命令的意思是把 Tomcat6.0 的源代码从 Subversion 库中导入到本机的 D:carl_wutomcatsrc目录, Tomcat 的源代码顺利导入到目标目录。下面是源代码的目录机构,从这个目录结构中,我们可以看出该项目 看到了熟悉的.project 及.classpath 文件。如果您打算开发一个 Stand alone 的 Java 应用程序,不妨借鉴 bin 目录,将 xml 和 properties 配置文件放在 conf 目录中,把 Java 源码文件放在 java 或者 src 目录中,资 一些静态资源文件可以放在 res 目录,测试源代码可以放在 test 目录中。这是一个典型的 Java 应用程序的 的产物,其源代码目录结构和 Tomcat 及其相像。
  • 3. 2. 编译并运行 代码下载后,我们接下来就是要编译并运行 Tomcat。一提编译,我们不禁会想到可爱的 Ant。不错,Tomca 安装,请从 http://ant.apache.org/bindownload.cgi 处下载并安装它。然后,请从 Tomcat 的源代码文件找 该文件复制到 build.properties,然后打开 build.properties,找到下面这行: base.path=/usr/share/java 将它改为: base.path= D:/carl_wu/tomcat/share 在 Tomcat 编译过程中,Ant 会让我们下载一些必要的依赖项目,base.path 目录就是用来保存这些项目文件 的目录。修改完 base.path 后,我们回到 MS-DOS 窗口,切换到 Tomcat 源代码所在目录,然后运行 ant dow
  • 4. 一分钟未到,Ant 就告诉我们一个错误并提示我们编译失败,具体错误信息如下: downloadzip: [get] Getting: http://sunsite.informatik.rwth-aachen.de/eclipse/downloads/drops/R-3.2-200606291905/eclipse-JDT-3 [get] To: D:carl_wutomcatsharefile.zip [get] Error opening connection java.io.FileNotFoundException: http://sunsite.informatik.rwth- aachen.de:3080/eclipse/downloads/drops/R-3.2-200606291905/eclipse-JDT-3.2.zip [get] Error opening connection java.io.FileNotFoundException: http://sunsite.informatik.rwth- aachen.de:3080/eclipse/downloads/drops/R-3.2-200606291905/eclipse-JDT-3.2.zip [get] Error opening connection java.io.FileNotFoundException: http://sunsite.informatik.rwth- aachen.de:3080/eclipse/downloads/drops/R-3.2-200606291905/eclipse-JDT-3.2.zip [get] Can't get http://sunsite.informatik.rwth-aachen.de/eclipse/downloads/drops/R-3.2-200606291905/eclipse-JDT- BUILD FAILED D:carl_wutomcatsrcbuild.xml:554: The following error occurred while executing this line: D:carl_wutomcatsrcbuild.xml:514: Can't get http://sunsite.informatik.rwth-aachen.de/eclipse/downloads/drops/ D:carl_wutomcatsharefile.zip Total time: 41 seconds 这个编译错误非常简单,就是找不到 http://sunsite.informatik.rwth-aachen.de/eclipse/downloads/drops/R-3.2-20 会想,Tomcat 的编译和 Eclipse 的 JDT 有什么关系?其实不然,Tomcat 是在 Eclipse 下开发的,所以需要 Eclipse 的 JDT(Java 既然找不到,我们只好自己动手,上 Google 一搜,马上发现这个文件的有效下载地址为:http://mirror.calvin.edu/eclipse/d JDT-3.2.zip。我们打开刚才的 build.properties 文件,将其 34 行修改为: jdt.loc= http://mirror.calvin.edu/eclipse/downloads/drops/R-3.2-200606291905/eclipse-JDT-3.2.zip 修改保存 build.properties 文件后,重新开始 ant download 任务。这次我们等的时间较长,因为 eclipse-J 我们可乘此机会去泡杯茶弄点咖啡什么的,等我们品茶回来,发现敬业的蚂蚁 Ant 告诉我们编译成功,虽然 创建的 base.path 目录(D:carl_wutomcatshare)中已经下载了 6 个依赖项目,它们都是 Tomcat 编译所 下面就开始真正的编译任务了,请在 MS-DOS 窗口内键入 ant 并回车,Ant 将在 2 分钟内编译 1000 多个源文件 利完成后,请打开 Tomcat 的源代码目录,会发现多了一个 output 目录,这是 Ant 的编译后的输出目录。请 目录,双击 startup.bat 文件,我们即可成功启动 Tomcat6.0,此时我们的编译工作就算顺利完成了。 3. 导入源代码到 Eclipse 3.1 请打开 Eclipse,新建一个 Java 项目,然后点击“Next”按钮,请选择“Create project from exist 入我们刚才下载的 Tomcat 源代码目录(i.e. D:carl_wutomcatsrc),然后点击“Next”直至结束。
  • 5. 3.2 我们将会看到 Eclipse 拒绝编译,这是因为 Eclipse 找不到该项目指定的库文件。请右击该项目,在弹 择“Properties”à“Libraries”,然后删除两个以 TOMCAT_LIBS 开头的两个库文件,只保留一个 JRE 库文 开始编译 Tomcat 源代码,但是发现一堆错误,这是因为我们没有为该项目添加编译所必须的 Jar 包。 3.3 准备好 Tomcat 项目所必须的 jar 文件,其实,刚才我们运行 ant download 任务时,已经下载过这些 j ant.jar (请在 ant 安装目录的 lib 子目录中拷贝) commons-collections-3.1.jar (从刚才 Ant 下载的 commons-collections-3.1 子目录中拷贝) commons-dbcp-1.2.1.jar(从刚才 Ant 下载的 commons-dbcp-1.2.1 子目录中拷贝) commons-logging-1.1.jar(如果您本机没有这个 jar 包,请从 http://commons.apache.org/downloads/download_logging.cgi commons-pool-1.2.jar(从刚才 Ant 下载的 commons-pool-1.2 子目录中拷贝) org.eclipse.jdt.core_3.2.0.v_671.jar(从刚才 Ant 下载的 eclipseplugins 子目录中拷贝) 3.4 当我们准备好这些 jar 文件后,将这些文件拷贝到某一目录(比如说 D:carl_wutomcattomcat_lib 目 Libraries,我们将这个新建的 User Libraries 命名为 TOMCAT_LIBS,并把这些文件加到 TOMCAT_LIBS。然后 项目。另外,别忘了把 JUnit 库也加到 Tomcat6 项目。这时 Eclipse 开始重新编译,编译过程顺利通过,所 构如下:
  • 6. 还有,请把 test 目录也加入到源代码中,方法是在 Eclipse 中右击”test”目录,然后在弹出菜单中选择“ Folder”,之后我们会看到 test 目录上就多了个源代码的符号,如上图所示。 3.5 在 Eclipse 中运行 Tomcat。请找到 Tomcat 的启动主类 org.apache.catalina.startup.Bootstrap,右击 As…”à”Open Run Dialog…”,然后在弹出的“Run”窗口中填入程序运行参数“start”和 JVM 运行参数
  • 7. 然后点击“Run”按钮,我们将会看到 Tomcat 正常启动。恭喜,咱们的 Tomcat 源码已经成功导入 Eclipse, 就能派上用场了。 3.5 调试 Tomcat,请打开 org.apache.jasper.compiler.Compiler 类的源代码,在 generateJava()方法的第 状态下运行 Tomcat,等 Tomcat 运行后,打开我们的浏览器,在地址栏中输入 http://localhost:8080/exam 并回车,然后我们可观察到 Eclipse 此时切换至调试视图:
  • 8. 上面的小实验表明我们可以在 Eclipse 中通过 Debugger 观察 Tomcat 的内部运行机理。另外补充一点,上面的 generateJava 方法 第一次请求或者 Jsp 源码发生变化时执行,如果您再次在浏览器中发送同样的请求,您将看不到上图的 Debug 界面,因为该方法 另外,还有一点很有意思。Tomcat6 以前版本的源代码分散在好几个子项目中,他们分别叫做 jakarta-ser tomcat-catalina,jakarta-tomcat-connectors 和 jakarta-tomcat-jasper,我觉得 Tomcat 的开发者可能嫌 这些子项目都合并在一起了。但是,这种做法不利于我们阅读理解源代码。