1. 需要准备好下面这些工具

JDK 1.6+

Maven 2或3

TortoiseSVN 1.7+ (从1.7开始”.svn”目录集中放在一处了,不再每个目录下都放一份)

Eclipse 3.5+

这4个工具不在这里描述怎么配置了,如果你是有两三年开发经验的Java开发人员,正常来讲都一直在用了。

另外,分析tomcat源代码不需要对这4个工具做什么特殊配置。

2. 下载Tomcat的源代码

Apache旗下的开源项目基本上都放在这: http://svn.apache.org/repos/asf

里面包含了tomcat、struts、hadoop、hbase等流行的开源项目的源代码,

可以直接用浏览器打开这个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.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. <groupId>org.apache.tomcat</groupId>
  5. <artifactId>Tomcat7.0</artifactId>
  6. <name>Tomcat7.0</name>
  7. <version>7.0</version>
  8. <build>
  9. <finalName>Tomcat7.0</finalName>
  10. <sourceDirectory>trunk/java</sourceDirectory>
  11. <testSourceDirectory>trunk/test</testSourceDirectory>
  12. <resources>
  13. <resource>
  14. <directory>trunk/java</directory>
  15. </resource>
  16. </resources>
  17. <testResources>
  18. <testResource>
  19. <directory>trunk/test</directory>
  20. </testResource>
  21. </testResources>
  22. <plugins>
  23. <plugin>
  24. <groupId>org.apache.maven.plugins</groupId>
  25. <artifactId>maven-compiler-plugin</artifactId>
  26. <version>2.3</version>
  27. <configuration>
  28. <source>1.6</source>
  29. <target>1.6</target>
  30. </configuration>
  31. </plugin>
  32. </plugins>
  33. </build>
  34. <dependencies>
  35. <dependency>
  36. <groupId>junit</groupId>
  37. <artifactId>junit</artifactId>
  38. <version>4.4</version>
  39. <scope>test</scope>
  40. </dependency>
  41. <dependency>
  42. <groupId>org.eclipse.jdt.core.compiler</groupId>
  43. <artifactId>ecj</artifactId>
  44. <version>3.7.2</version>
  45. </dependency>
  46. <dependency>
  47. <groupId>ant</groupId>
  48. <artifactId>ant</artifactId>
  49. <version>1.7.0</version>
  50. </dependency>
  51. <dependency>
  52. <groupId>wsdl4j</groupId>
  53. <artifactId>wsdl4j</artifactId>
  54. <version>1.6.2</version>
  55. </dependency>
  56. <dependency>
  57. <groupId>javax.xml</groupId>
  58. <artifactId>jaxrpc</artifactId>
  59. <version>1.1</version>
  60. </dependency>
  61. </dependencies>
  62. </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的核心架构:

 

Tomcat7调试运行环境搭建与源代码分析入门的更多相关文章

  1. 【转载】linux环境下tcpdump源代码分析

    linux环境下tcpdump源代码分析 原文时间 2013-10-11 13:13:02  CSDN博客 原文链接  http://blog.csdn.net/han_dawei/article/d ...

  2. linux环境下tcpdump源代码分析

    Linux 环境下tcpdump 源代码分析 韩大卫@吉林师范大学 tcpdump.c 是tcpdump 工具的main.c, 本文旨对tcpdump的框架有简单了解,只展示linux平台使用的一部分 ...

  3. 自动化测试 Appium之Python运行环境搭建 Part2

    Appium之Python运行环境搭建 Part2 by:授客 QQ:1033553122 实践环境 参见 Appium之Python运行环境搭建 Part1 环境部署 1.安装Android SDK ...

  4. java运行环境搭建

    java运行环境搭建 1.安装jdk下载和安装 1). java是Sun公司的产品,由于Sun公司被Oracle公司收购,因此jdk可以在Oracle的官网下载.网址:https://www.orac ...

  5. Hadoop基础教程-运行环境搭建

    一.Hadoop是什么 一个分布式系统基础架构,由Apache基金会所开发.用户可以在不了解分布式底层细节的情况下,开发分布式程序.充分利用集群的威力进行高速运算和存储. Hadoop实现了一个分布式 ...

  6. Win2012 R2 IIS8.5+PHP(FastCGI)+MySQL运行环境搭建教程

    这篇文章主要介绍了Win2012 R2 IIS8.5+PHP(FastCGI)+MySQL运行环境搭建教程,需要的朋友可以参考下 准备篇 一.环境说明: 操作系统:Windows Server 201 ...

  7. C / C++ 运行环境搭建教程

    C / C++ 运行环境搭建教程 一.实验环境 本机操作系统:Windows 7 64位 虚拟机:VMware Workstation 12 pro 虚拟机操作系统:Linux CentOS 7 二. ...

  8. 02_Java运行环境搭建

    1.Java运行环境搭建,对于初学者来说,主要下载安装jdk即可,windows操作系统再配合记事本,即可进行java程序开发.后续的学习以及工作中需要使用IDE工具进行开发,常用IDE工具是ecli ...

  9. PHP学习(2)——运行环境搭建

    学习PHP首先要搞定PHP的运行环境.PHP的运行环境包括:PHP语言解析器本身以及Apache服务器.MySQL数据库等.因为只是学习嘛,尽快的搭建起来运行环境就好,到后期慢慢懂得多了再去想规范化搭 ...

随机推荐

  1. 北京SAP-AGS CoE support consultant intern 面试总结

    7月4号去大连SAP面试.通过的话直接去北京SAP參加实习(有幸已通过). SAP一直是我理想的公司,大二的时候曾试图參加SAP大连vt项目,当时下了非常大决心,假设通过了就先留在大连,可惜英语群面就 ...

  2. ASP服务器I I S出现authentication mode=Windows错误解决办法

    网上下载的asp.net源码出现 <authentication mode="Windows"/>错误信息 属性 说明 mode 必选的属性. 指定应用程序的默认身份验 ...

  3. xcode 模拟器,文档,离线安装

    一:xcode上的模拟器,文档,在下载时,通过apple.com下载的速度太慢了,所以我们下载之后,做一下备份,离线安装还原就行了! 二:模拟器安装 目录:/Users/<user name&g ...

  4. KineticJS教程(5)

    KineticJS教程(5) 作者: ysm  5.事件响应 5.1.图形的事件响应 图形对象对事件的响应处理可以使用 on() 方法绑定事件类型和相应方法. On() 方法需要一个事件类型参数和相应 ...

  5. 【转】TCP(协议号6)的方方面面

    转:http://blog.sina.com.cn/s/blog_6002b97001018fxh.html 第一:TCP连接的建立(也就是所谓的三次握手)过程. 第一次握手:建立连接时,客户端发送s ...

  6. NGUI所见即所得之深入剖析UIPanel,UIWidget,UIDrawCall底层原理

    NGUI所见即所得之深入剖析UIPanel,UIWidget,UIDrawCall底层原理 By D.S.Qiu 尊重他人的劳动,支持原创,转载请注明出处:http.dsqiu.iteye.com 之 ...

  7. ant design pro (三)路由和菜单

    一.概述 参看地址:https://pro.ant.design/docs/router-and-nav-cn 二.原文摘要 路由和菜单是组织起一个应用的关键骨架,我们的脚手架提供了一些基本的工具及模 ...

  8. 〖C语言〗C语言一个函数传递无限制多参数(不确定参数函数)的方法

    /* * ===================================================================================== * * Filen ...

  9. android TextView异常换行层次不齐的问题

    关于TextView异常换行,参差不齐问题分析:每行的开头的第一个字符如果是字母,数字,标点符号以及特殊字符 可能是由于都是半角字符,所以需要转化成全角字符 解决方法是: public String ...

  10. 解析_theme_build_registry()和_theme_process_registry()

    Drupal使用_theme_build_registry()和_theme_process_registry()两个函数构建theme registry.theme registry是theme h ...