### 1. 需要准备好下面这些工具JDK 1.6+Maven 2或3TortoiseSVN 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代码
<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中显示:
Java代码
2012-
6-
10 14:
25:
31 org.apache.catalina.startup.Catalina start
信息: 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代码
包名 用途=================================================javax servlet/jsp/el相关的apiorg.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。
本文来源于"阿里中间件团队播客",原文发表时间" 2012-06-12"
相关资源:敏捷开发V1.0.pptx