Tomcat7调试运行环境搭建与源代码分析入门
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文件在附件中)
- <project xmlns=“http://maven.apache.org/POM/4.0.0″ xmlns:xsi=“http://www.w3.org/2001/XMLSchema-instance”
- xsi:schemaLocation=“http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd”>
- <modelVersion>4.0.0</modelVersion>
- <groupId>org.apache.tomcat</groupId>
- <artifactId>Tomcat7.0</artifactId>
- <name>Tomcat7.0</name>
- <version>7.0</version>
- <build>
- <finalName>Tomcat7.0</finalName>
- <sourceDirectory>trunk/java</sourceDirectory>
- <testSourceDirectory>trunk/test</testSourceDirectory>
- <resources>
- <resource>
- <directory>trunk/java</directory>
- </resource>
- </resources>
- <testResources>
- <testResource>
- <directory>trunk/test</directory>
- </testResource>
- </testResources>
- <plugins>
- <plugin>
- <groupId>org.apache.maven.plugins</groupId>
- <artifactId>maven-compiler-plugin</artifactId>
- <version>2.3</version>
- <configuration>
- <source>1.6</source>
- <target>1.6</target>
- </configuration>
- </plugin>
- </plugins>
- </build>
- <dependencies>
- <dependency>
- <groupId>junit</groupId>
- <artifactId>junit</artifactId>
- <version>4.4</version>
- <scope>test</scope>
- </dependency>
- <dependency>
- <groupId>org.eclipse.jdt.core.compiler</groupId>
- <artifactId>ecj</artifactId>
- <version>3.7.2</version>
- </dependency>
- <dependency>
- <groupId>ant</groupId>
- <artifactId>ant</artifactId>
- <version>1.7.0</version>
- </dependency>
- <dependency>
- <groupId>wsdl4j</groupId>
- <artifactId>wsdl4j</artifactId>
- <version>1.6.2</version>
- </dependency>
- <dependency>
- <groupId>javax.xml</groupId>
- <artifactId>jaxrpc</artifactId>
- <version>1.1</version>
- </dependency>
- </dependencies>
- </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中显示:
- 2012-6-10 14:25:31 org.apache.catalina.startup.Catalina start
- 信息: Server startup in 359 ms
除上面这种方式外,这里还有一个Eclipse的launch脚本(start-tomcat7.launch (注: 在附件中)),
- <?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。
下图是Tomcat在Eclipse中的项目布局:
最后,打开你的浏览器,输入 http://127.0.0.1:8080/examples/ 看看例子吧。
6. 简单的源代码阅读指南:
- 包名 用途
- =================================================
- javax servlet/jsp/el相关的api
- org.apache.catalina tomcat自身架构
- org.apache.coyote http、ajp协议实现相关的类
- org.apache.el 实现el规范
- org.apache.jasper 实现jsp规范、编译jsp文件
- org.apache.juli tomcat的日志系统
- org.apache.naming jndi实现
- 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调试运行环境搭建与源代码分析入门的更多相关文章
- 【转载】linux环境下tcpdump源代码分析
linux环境下tcpdump源代码分析 原文时间 2013-10-11 13:13:02 CSDN博客 原文链接 http://blog.csdn.net/han_dawei/article/d ...
- linux环境下tcpdump源代码分析
Linux 环境下tcpdump 源代码分析 韩大卫@吉林师范大学 tcpdump.c 是tcpdump 工具的main.c, 本文旨对tcpdump的框架有简单了解,只展示linux平台使用的一部分 ...
- 自动化测试 Appium之Python运行环境搭建 Part2
Appium之Python运行环境搭建 Part2 by:授客 QQ:1033553122 实践环境 参见 Appium之Python运行环境搭建 Part1 环境部署 1.安装Android SDK ...
- java运行环境搭建
java运行环境搭建 1.安装jdk下载和安装 1). java是Sun公司的产品,由于Sun公司被Oracle公司收购,因此jdk可以在Oracle的官网下载.网址:https://www.orac ...
- Hadoop基础教程-运行环境搭建
一.Hadoop是什么 一个分布式系统基础架构,由Apache基金会所开发.用户可以在不了解分布式底层细节的情况下,开发分布式程序.充分利用集群的威力进行高速运算和存储. Hadoop实现了一个分布式 ...
- Win2012 R2 IIS8.5+PHP(FastCGI)+MySQL运行环境搭建教程
这篇文章主要介绍了Win2012 R2 IIS8.5+PHP(FastCGI)+MySQL运行环境搭建教程,需要的朋友可以参考下 准备篇 一.环境说明: 操作系统:Windows Server 201 ...
- C / C++ 运行环境搭建教程
C / C++ 运行环境搭建教程 一.实验环境 本机操作系统:Windows 7 64位 虚拟机:VMware Workstation 12 pro 虚拟机操作系统:Linux CentOS 7 二. ...
- 02_Java运行环境搭建
1.Java运行环境搭建,对于初学者来说,主要下载安装jdk即可,windows操作系统再配合记事本,即可进行java程序开发.后续的学习以及工作中需要使用IDE工具进行开发,常用IDE工具是ecli ...
- PHP学习(2)——运行环境搭建
学习PHP首先要搞定PHP的运行环境.PHP的运行环境包括:PHP语言解析器本身以及Apache服务器.MySQL数据库等.因为只是学习嘛,尽快的搭建起来运行环境就好,到后期慢慢懂得多了再去想规范化搭 ...
随机推荐
- RS导出Excel交叉表角对应的列占用多列问题
在Cognos报表展示的时候,很多用户为了计算会把数据报表导出成excel然后再做统计,于是乎我做的一张报表导出成Excel的时候就出现了这样的问题 从上图可以看出交叉表角对应的列 ‘一级手术’和‘二 ...
- UNIX网络编程读书笔记:原始套接口
概述 应用程序可以绕过传输层而直接使用IPv4和IPv6,这称为原始套接口(raw socket).http://www.cnblogs.com/nufangrensheng/p/3583435.ht ...
- Unity3d中使用log4net
原地址:http://www.cnblogs.com/koalaylj/archive/2012/09/04/2670629.html 最近在用unity3d开发Android上的游戏,一直Debug ...
- Entity Framework Code First关系映射约定【l转发】
本篇随笔目录: 1.外键列名默认约定 2.一对多关系 3.一对一关系 4.多对多关系 5.一对多自反关系 6.多对多自反关系 在关系数据库中,不同表之间往往不是全部都单独存在,而是相互存在关联的.两个 ...
- ubuntu——Kconfig、.config、Makefile的关系
原文地址:http://blog.csdn.net/estate66/article/details/5886816 ,本人对此文有改进. 当我们编写完一个驱动后,我们要把它以模块形式编译或者直接编译 ...
- HTML 事件属性(如:onsubmit)
学习啥都需要一个基础 基础很重要: HTML 4 的新特性之一是可以使 HTML 事件触发浏览器中的行为,比方说当用户点击某个 HTML 元素时启动一段 JavaScript. 在现代浏览器中都内置有 ...
- 【Redis】redis开机自启动、设置守护进程、密码设置、访问权限控制等安全设置(redis默认端口6379)
一.redis设置开机自启动:centOS: 1.修改redis.conf中daemonize为yes,确保守护进程开启,也就是在后台可以运行. (守护进程:孤儿进程:独立于终端而存在的进程,不会因为 ...
- ref与out区别(ref有进有出,而out只出不进)
ref与out区别(ref有进有出,而out只出不进) C#基础:ref和out的区别 ref和out的区别在C# 中,既可以通过值也可以通过引用传递参数.通过引用传递参数允许函数成员更改参数的值 ...
- 函数适配器bind2nd 、mem_fun_ref 源码分析、函数适配器应用举例
一.适配器 三种类型的适配器: 容器适配器:用来扩展7种基本容器,利用基本容器扩展形成了栈.队列和优先级队列 迭代器适配器:(反向迭代器.插入迭代器.IO流迭代器) 函数适配器:函数适配器能够将仿函数 ...
- quartz cron表达式在线生成
近期使用了quartz定时器,有感于起cron表达式有点复杂.且无法实时推断定时时间是否正确,因此写了个在线表达式及依据表达式获得前10次运行时间. 訪问地址例如以下:http://cron.g2ro ...