`

Tomcat源码学习(一)

阅读更多

 

 

转自:http://hi.baidu.com/hateeyes/blog/item/7f44942a20ad8f9d023bf66d.html

下面我们就开始我们的
Tomcat源码学习之旅。

1. 下载
Tomcat6.0的源代码

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

C:\Documents and Settings\carlwu>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 给我们提供了非常友好的帮助,并且是中文的,看来中国程序员对这个开源项目有所贡献。接下来,请在 MS-DOS 下键入:

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

这个命令的意思是把 Tomcat6.0 的源代码从 Subversion 库中导入到本机的 D:\carl_wu\tomcat\src\ 目录,命令运行后,您稍等几分钟,就会看到 Tomcat 的源代码顺利导入到目标目录。下面是源代码的目录机构,从这个目录结构中,我们可以看出该项目的开发者使用的 IDE Eclipse ,因为我们看到了熟悉的 .project .classpath 文件。如果您打算开发一个 Stand alone Java 应用程序,不妨借鉴一下 Tomcat 的目录结构,把脚本文件放在 bin 目录,将 xml properties 配置文件放在 conf 目录中,把 Java 源码文件放在 java 或者 src 目录中,资源文件比如说图片文件, ini 文件及其它的一些静态资源文件可以放在 res 目录,测试源代码可以放在 test 目录中。这是一个典型的 Java 应用程序的目录机构,笔者以前曾接触到一个来自美国的产品,其源代码目录结构和 Tomcat 及其相像。






2. 编译并运行

代码下载后,我们接下来就是要编译并运行 Tomcat 。一提编译,我们不禁会想到可爱的 Ant 。不错, Tomcat 正是以 Ant 作为编译工具,如果您还没有安装,请从 http://ant.apache.org/bindownload.cgi 处下载并安装它。然后,请从 Tomcat 的源代码文件找到 build.properties.default 文件,并将该文件复制到 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 download 命令,如下图所示:





一分钟未到, Ant 就告诉我们一个错误并提示我们编译失败,具体错误信息如下:

downloadzip:

[get] Getting: http://sunsite.informatik.rwth-aachen.de/eclipse/downloads/drops/R-3.2-200606291905/eclipse-JDT-3.2.zip
[get] To: D:\carl_wu\tomcat\share\file.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-3.2.zip to D:\carl_wu\tomcat\share\file.zip

BUILD FAILED

D:\carl_wu\tomcat\src\build.xml:554: The following error occurred while executing this line:

D:\carl_wu\tomcat\src\build.xml:514: Can't get http://sunsite.informatik.rwth-aachen.de/eclipse/downloads/drops/R-3.2-200606291905/eclipse-JDT-3.2.zip to D:\carl_wu\tomcat\share\file.zip

Total time: 41 seconds

这个编译错误非常简单,就是找不到 http://sunsite.informatik.rwth-aachen.de/eclipse/downloads/drops/R-3.2-200606291905/eclipse-JDT-3.2.zip 文件。有人可能会想, Tomcat 的编译和 Eclipse JDT 有什么关系?其实不然, Tomcat 是在 Eclipse 下开发的,所以需要 Eclipse JDT Java Development tooling )插件来编译 Tomat 源代码。既然找不到,我们只好自己动手,上 Google 一搜,马上发现这个文件的有效下载地址为: http://mirror.calvin.edu/eclipse/downloads/drops/R-3.2-200606291905/eclipse-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-JDT-3.2.zip 大约有 19M ,下载需要一段时间。我们可乘此机会去泡杯茶弄点咖啡什么的,等我们品茶回来,发现敬业的蚂蚁 Ant 告诉我们编译成功,虽然编译器给出几个警告。这时我们可发现刚才创建的 base.path 目录( D:\carl_wu\tomcat\share )中已经下载了 6 个依赖项目,它们都是 Tomcat 编译所必须的。

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


3. 导入源代码到 Eclipse

3.1 请打开 Eclipse ,新建一个 Java 项目,然后点击“ Next ”按钮,请选择“ Create project from existing source ”, 并在 Directory 文本框内填入我们刚才下载的 Tomcat 源代码目录( i.e. D:\carl_wu\tomcat\src) ,然后点击“ Next ”直至结束。




3.2 我们将会看到 Eclipse 拒绝编译,这是因为 Eclipse 找不到该项目指定的库文件。请右击该项目,在弹出菜单中选择“ Properties à Libraries ”,然后删除两个以 TOMCAT_LIBS 开头的两个库文件,只保留一个 JRE 库文件,然后点击“ OK ”按钮,这时 Eclipse 开始编译 Tomcat 源代码,但是发现一堆错误,这是因为我们没有为该项目添加编译所必须的 Jar 包。

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

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 下载的 eclipse\plugins 子目录中拷贝)

3.4 当我们准备好这些 jar 文件后,将这些文件拷贝到某一目录(比如说 D:\carl_wu\tomcat\tomcat_lib 目录),然后在 Eclipse 中新建一个 User Libraries ,我们将这个新建的 User Libraries 命名为 TOMCAT_LIBS ,并把这些文件加到 TOMCAT_LIBS 。然后将我们新建的 TOMCAT_LIBS 添加到 Tomcat6 项目。另外,别忘了把 JUnit 库也加到 Tomcat6 项目。这时 Eclipse 开始重新编译,编译过程顺利通过,所有错误均消失,此时 Tomcat6 项目的目录结构如下:

还有,请把 test 目录也加入到源代码中,方法是在 Eclipse 中右击 ”test” 目录,然后在弹出菜单中选择“ Build path” à ”Use as Source Folder ”,之后我们会看到 test 目录上就多了个源代码的符号,如上图所示。

3.5 Eclipse 中运行 Tomcat 。请找到 Tomcat 的启动主类 org.apache.catalina.startup.Bootstrap ,右击这个类,在弹出菜单中选择“ Run As…” à ”Open Run Dialog…” ,然后在弹出的“ Run ”窗口中填入程序运行参数“ start” JVM 运行参数 catalina.home ,如下面窗口所示:


然后点击“ Run ”按钮,我们将会看到 Tomcat 正常启动。恭喜,咱们的 Tomcat 源码已经成功导入 Eclipse ,这时,可视化的 UML 分析工具及 Debug 工具就能派上用场了。
3.5 调试 Tomcat ,请打开 org.apache.jasper.compiler.Compiler 类的源代码,在 generateJava() 方法的第一行打一个断点,然后在 Eclipse 的调试状态下运行 Tomcat ,等 Tomcat 运行后,打开我们的浏览器,在地址栏中输入 http://localhost:8080/examples/jsp/jsp2/el/basic-comparisons.jsp 并回车,然后我们可观察到 Eclipse 此时切换至调试视图:


上面的小实验表明我们可以在 Eclipse 中通过 Debugger 观察 Tomcat 的内部运行机理。另外补充一点,上面的 generateJava 方法是将 jsp 动态编译至 java class ,这个方法只是在第一次请求或者 Jsp 源码发生变化时执行,如果您再次在浏览器中发送同样的请求,您将看不到上图的 Debug 界面,因为该方法不再执行。

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

分享到:
评论

相关推荐

    Tomcat源码学习:一个最简单的“Tomcat”

    【标题】"Tomcat源码学习:一个最简单的‘Tomcat’",这篇博客主要探讨的是如何通过学习Tomcat的源代码来理解这个流行的开源Java Servlet容器的工作原理。Tomcat是Apache软件基金会的一个项目,它是Java Web应用...

    tomcat源码学习之环境搭建

    在深入探讨Tomcat源码学习之前,我们首先要...总之,Tomcat源码学习是一个深入理解Java Web服务原理和最佳实践的过程。通过这个过程,你不仅可以提升自己的编程技能,还能更好地解决实际问题,提升服务器性能和稳定性。

    tomcat源码+文档pdf+源码解析

    源码解析部分则是对Tomcat源码的深度剖析,涵盖了关键类和方法的作用、设计模式的运用以及性能优化技巧。这有助于开发者理解Tomcat内部的工作流程,例如,如何处理HTTP请求的生命周期,以及线程池是如何调度和管理的...

    tomcat源码学习

    【标题】"Tomcat源码学习"涉及到的是对Apache Tomcat服务器内部运行机制的深入理解。Tomcat是一款广泛使用的开源Java Servlet容器,它实现了Java EE的Web应用规范,特别是Servlet和JSP。源码学习是提升技术水平、...

    tomcat源码

    通过阅读和分析Tomcat源码,我们可以学习到以下知识点: 1. **Servlet生命周期**:Tomcat如何加载、初始化、服务、销毁Servlet,以及ServletConfig和ServletContext的角色。 2. **线程池管理**:Tomcat如何使用...

    tomcat 源码分析系列文档

    7. "tomcat源码分析之一架构.pdf":可能涵盖了Tomcat的整体架构,包括Catalina、 Coyote、Jasper等主要模块的功能和相互关系。 8. "HTTP协议详解.pdf":作为基础,此文档提供了HTTP协议的详细讲解,帮助读者理解...

    tomcat源码导入myeclipse

    【标题】"Tomcat源码导入MyEclipse"是一个针对Java开发者的重要实践操作,它涉及到两个关键组件:Tomcat服务器和MyEclipse集成开发环境。Tomcat是Apache软件基金会的一个开源项目,它作为Servlet和JavaServer Pages...

    tomcat5 源码学习,深度剖析tomcat一书的指定tomcat版本

    tomcat5 源码学习,深度剖析tomcat一书的指定tomcat版本,随着tomcat版本的升级,内容发生 了变化,但为了读懂书籍,还是得使用老版本得源码,欢迎大家下载,官网下载会出现下载不了的情况,我主页有tomcat4-tomcat9...

    Tomcat源码学习(一) 源码编译和导入Eclipse

    【Tomcat源码学习(一) 源码编译和导入Eclipse】 在深入学习Tomcat源码之前,首先需要获取源码并将其配置到开发环境中,这通常涉及到源码下载、编译以及在集成开发环境(IDE)中导入项目。本篇文章将指导初学者完成...

    tomcat8 源码学习,欢迎大家下载,官网下载会出现下载不了的情况

    【标题】:Tomcat8源码学习 在Java Web开发领域,Tomcat是一个非常重要的应用服务器,它作为开源的...对于想要从事中间件开发或者希望提高Java Web性能优化能力的程序员来说,Tomcat源码学习是一条必不可少的道路。

    tomcat 源码 学习

    通过阅读相关网络博客,如《(转)Tomcat源码学习(一) - flm_llx的日志 - 网易博客》和《Tomcat源码学习(二) - Carl -- IT博客-中国最具人气的IT博客-赛迪网IT人家园》,你可以获取更多具体细节和实战经验。...

    tomcat源码阅读(一)——环境搭建

    本篇将聚焦于"Tomcat源码阅读(一)——环境搭建",探讨如何搭建一个适合源码学习的开发环境。 首先,我们需要了解Tomcat是什么。Tomcat是一款开源的Java Servlet容器,由Apache软件基金会维护,实现了Java EE中的...

    eclipse运行tomcat源码:修改源码:重新编译:重新打包

    文件描述: 1.tomcat源码文件 2.tomcat程序文件 ...5.一个tomcat源码在eclipse上运行的java工程 作用: 1.用于学习tomcat源码和了解tomcat运行机制 2.学习如何修改tomcat源码后如何重新编译,打包。

    tomcat9 源码学习

    源码学习对于理解Tomcat的工作原理、优化性能以及自定义功能至关重要。以下是一些在学习Tomcat9源码时会涉及的关键知识点: 1. **架构概述**:Tomcat由多个组件构成,如Catalina(核心Servlet容器)、 Coyote...

    tomcat源码资源包

    【标题】"Tomcat源码资源包"是一个包含Apache Tomcat服务器源代码的压缩文件,旨在帮助开发者深入了解Tomcat的...因此,深入研究像"Tomcat源码资源包"这样的资料,对于Java Web开发者来说是一项非常有价值的学习任务。

    tomcat7源码

    源码分析是提升开发者对服务器内部运作机制理解的重要途径,尤其对于Tomcat这样的核心组件,源码的学习能够帮助我们更深入地理解Web应用的部署、运行以及性能优化。 首先,我们要了解Tomcat的架构。Tomcat7基于...

    tomcat8源码

    Apache Tomcat 8.5.23 源码分析 Apache Tomcat 是一个开源的、免费的Web服务器和Servlet容器,它实现了Java Servlet和JavaServer Pages(JSP)规范,...因此,对Tomcat源码的学习对于Java Web开发者来说是至关重要的。

    tomcat源码学习并添加注释学习

    【标题】:“Tomcat源码学习并添加注释学习” 【描述】:“Tomcat作为一款广泛应用的开源Web服务器和Servlet容器,是Java EE应用开发者的必备工具。通过深入学习Tomcat的源码,我们可以理解其内部工作原理,提高对...

Global site tag (gtag.js) - Google Analytics