### 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:Tomcat7trunk (你可以换别的目录)

然后再从这下载一个二进制分发包(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工程项目,比如没有srcmainjava这样的目录,

所以要调整一下sourceDirectory和testSourceDirectory,下面是一个完整的pom文件,

直接放到D:Tomcat7目录即可(pom.xml与之前的launch、trunk目录并列)

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

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中显示:

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

除上面这种方式外,这里还有一个Eclipse的launch脚本(start-tomcat7.launch (注: 在附件中)),

Xml代码

<?xml version=“1.0” encoding=“UTF-8” standalone=“no”?>

<launchConfiguration type=“org.eclipse.jdt.launching.localJavaApplication”> <listAttribute key=“org.eclipse.debug.core.MAPPED_RESOURCE_PATHS”> <listEntry value=“/Tomcat7.0/trunk/java/org/apache/catalina/startup/Bootstrap.java”/> </listAttribute> <listAttribute key=“org.eclipse.debug.core.MAPPED_RESOURCE_TYPES”> <listEntry value=“1”/> </listAttribute> <stringAttribute key=“org.eclipse.jdt.launching.MAIN_TYPE” value=“org.apache.catalina.startup.Bootstrap”/> <stringAttribute key=“org.eclipse.jdt.launching.PROGRAM_ARGUMENTS” value=“start”/> <stringAttribute key=“org.eclipse.jdt.launching.PROJECT_ATTR” value=“Tomcat7.0”/> <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”/> </launchConfiguration>

可以放到D:Tomcat7目录,然后flush一下Eclipse,在Eclipse中右击这个文件,点Run As启动Tomcat,点Debug As可以调试Tomcat。

最后,打开你的浏览器,输入 http://127.0.0.1:8080/examples/ 看看例子吧。

6. 简单的源代码阅读指南:

Java代码
  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。

本文来源于"阿里中间件团队播客",原文发表时间" 2012-06-12"

Tomcat7调试运行环境搭建与源代码分析入门相关推荐

  1. 大数据技术之Hadoop(入门)概述、运行环境搭建、运行模式

    文章目录 1 Hadoop 概述 1.1 Hadoop 是什么 1.2 Hadoop 优势 1.3 Hadoop 组成(面试重点) 1.3.1 HDFS 架构概述 1.3.2 YARN 架构概述 1. ...

  2. 大数据之Hadoop3.x 运行环境搭建(手把手搭建集群)

    文章目录 写在开头 安装包准备 一.Hadoop运行环境搭建(开发重点) 1.1 模板虚拟机环境准备 1.2 克隆虚拟机 1.3 在hadoop102安装JDK 1.4 在hadoop102安装Had ...

  3. Hadoop入门(上):大数据特点、大数据前景、大数据组织结构、Hadoop组成、Hadoop版本介绍、Hadoop运行环境搭建、CentOS6安装JDK、安装Hadoop、Hadoop目录结构

    资料来源于尚硅谷 本篇文章目录 第1章·大数据概论 1.1.大数据概念. 1.2.大数据特点(4V) 1.3.大数据应用场景 1.4.大数据发展前景 1.5·大数据部门业务流程分析. 1.6·大数据部 ...

  4. 2012 iis php mysql_Win2012 R2 IIS8.5+PHP(FastCGI)+MySQL运行环境搭建wordpress博客教程

    Win2012 R2 IIS8.5+PHP(FastCGI)+MySQL运行环境搭建教程 一.环境说明: 操作系统:Windows Server2012 R2 PHP版本:php 5.5.8 MySQ ...

  5. 【Android 逆向】修改运行中的 Android 进程的内存数据 ( 运行环境搭建 Android 模拟器安装 | 拷贝 Android 平台可执行文件和动态库到 /data/system )

    文章目录 一.运行环境搭建 Android 模拟器安装 二.拷贝 Android 平台可执行文件和动态库到 /data/system 目录下 一.运行环境搭建 Android 模拟器安装 使用低版本的 ...

  6. win2012 r2 iis php,Win2012 R2 IIS8.5+PHP(FastCGI)+MySQL运行环境搭建wordpress博客教程

    运行环境搭建教程 一.环境说明: 操作系统:Windows Server2012 R2 PHP版本:php 5.5.8 MySQL版本:MySQL5.6.15 二.相关软件下载: 1.PHP下载地址: ...

  7. 虹科Automation softPLC | 虹科KPA MoDK运行环境与搭建步骤(2)——MoDK运行环境搭建

    本系列文章旨在帮助读者对虹科KPA Automation体系进行一个简要的理解,并且能使用MoDK进行快速的上手操作,包括:虹科KPA Automation.虹科KPA MoDK简介,虹科KPA Mo ...

  8. 基于RK3308的ROS运行环境搭建和交叉编译

    基于RK3308的ROS运行环境搭建和交叉编译 固件编译环境 准备工作 软件包安装 交叉编译工具链介绍 下载 SDK SDK 目录结构 全自动编译脚本 烧写镜像文件 第一步,编译固件(ubuntu18 ...

  9. Zephyr物联网操作系统之运行环境搭建(一)

    对于zephyr这个实时嵌入式操作系统,可以先在x86架构上搭建运行环境,学习相关知识.之后,根据实际需求,再将操作系统移植到不同架构的MCU上. 一.环境搭建 准备工作:安装ubuntu操作系统 虚 ...

最新文章

  1. php中自己写的类放哪里,class类 - ThinkPHP 3.2.3,我有一个class,应该放在哪里?
  2. MailScanner相关规则设置
  3. Android 编译命令
  4. 跨链Cosmos(5)ABCI 接口
  5. Anaconda安装(ubuntu 14.04.03 LTS 64bit)
  6. 算法题存档20200627(树)
  7. python手机端编程环境_Python + Appium 环境搭建
  8. linux ----Inode的结构图
  9. linux启动mqtt_MQTT--linux安装部署(CentOS)
  10. 程序员如何变身IT讲师
  11. python操作系统接口错误_Python-接口自动化(四) - 许小猪 - 博客园
  12. ML-Agents案例之金字塔
  13. 【numpy】TypeError: only size-1 arrays can be converted to Python scalars
  14. 编译器处理虚函数的原理
  15. python del用法_python中del函数的用法详解
  16. 合工大路强java第四次作业第2题
  17. SDL是什么,能干什么,为什么我们要学习它?
  18. win10关闭自动更新(针对已经关闭windows update项,但系统仍自动更新的问题)
  19. windows server 2012 RD服务器
  20. EverBox开发笔记-4-如何使用Core Data

热门文章

  1. str.endswith可以传入集合数据类型,而不仅仅是字符串
  2. dict格式转字符串两种方法的区别
  3. re.search中与正则表达式*结合使用的注意事项
  4. 成功在两台电脑上安装了spark集群,mark下
  5. linux下socket上限,[100分]高分求关于linux socket上限解决方案
  6. Leetcode987 二叉树的垂序遍历
  7. 2016年6月份学习总结,读书《向着光亮那方》
  8. HTML5 基础知识(二)
  9. el-input中设置onkeypress事件是否匹配正则表达式显示输入内容的格式
  10. 从实例一步一步入门学习SpringCloud的Eureka、Ribbon、Feign、熔断器、Zuul的简单使用(附代码下载)