参考:http://tomcat.apache.org/tomcat-9.0-doc/building.html
1.下载JDK8
安装JDK8
编译Tomcat9需要安装JDK8
下载地址:http://www.oracle.com/technetwork/java/javase/downloads/index.html
设置环境变量:
JAVA_HOME
D:\dev\Java\jdk1.8.0_72
PATH新增:%JAVA_HOME%\bin
2.安装Ant1.9.5或者更高版本
下载地址:http://ant.apache.org/bindownload.cgi
解压到D:\dev\ant
设置环境变量:
ANT_HOME
D:\dev\ant\apache-ant-1.9.6
PATH新增:%ANT_HOME%\bin
3.获取Tomcat9的源码
地址:http://archive.apache.org/dist/tomcat/tomcat-9/
下载是windows版的源码即zip版的源码:apache-tomcat-9.0.0.M17-src.zip
然后将其解压到一个目录下(D:\dev\workspace),即源码所在目录是:D:\dev\workspace\apache-tomcat-9.0.0.M17-src。
4.配置下载区域
编译Tomcat要下载大量的依赖库。强烈推荐为这些库配置下载区域。
进入tomcat源码的目录,
即D:\dev\workspace\apache-tomcat-9.0.0.M17-src,
将其中的build.properties.default文件重命名为build.properties,
并修改base.path为:
base.path=D:/dev/workspace/apache-tomcat-9.0.0.M17-src/../lib-tomcat9
5.编译Tomcat
${tomcat.source}表示tomcat源码所在目录。
cd ${tomcat.source}
ant
即
cd D:\dev\workspace\apache-tomcat-9.0.0.M17-src
ant
运行这条命令将要下载编译Tomcat所需要的库文件到base.path指定的目录中。
一旦编译成功,一个可用的Tomcat将会被产生在${tomcat.source}/output/build目录中,且能够被脚本启动和关闭。
6.使用Eclipse编译
(1)生成Eclipse项目
Ant的target 提供一种便捷下载所有二进制依赖关系,和在源代码树的根目录下创建Eclipse项目及classpath文件。
cd ${tomcat.source}
ant ide-eclipse
即:
cd D:\dev\eclipse\workspace\tomcat
ant ide-eclipse
(2)增加Classpath变量
启动Eclipse,打开Preferences对话框,选择Java->Build Path->Classpath Variables,增加两个Classpath Variables:
TOMCAT_LIBS_BASE:
D:/dev/workspace/apache-tomcat-9.0.0.M3-src/../lib-tomcat9
(路径和在build.properties中的base.path设置一样,即存放的是已经下载的二进制依赖)
ANT_HOME:
D:\dev\ant\apache-ant-1.9.6
(Ant的根目录)
(3)配置JRE:
打开Preferences对话框,
选择Java->Installed JREs->Add。选择JRE Home:D:\dev\Java\jdk1.8.0_72;
选择Java -> Compiler,设置Compiler compliance level 等于当前JDK的版本(1.8),默认一般是最新版本。
单击OK,设置完成。
(4)导入Tomcat源码到Eclipse中
File->Import->General->Existing Projects into Workspace->选择Tomcat源码的根目录,单击完成即可导入。
导入完成之后,项目自动完成编译。
(5)启动
在Eclipse中找到org.apache.catalina.startup.Bootstrap,使用它作为主类,选中右击“Run As->Run configurations”,然后双击”Java Aplication”就会出来一个新的”Bootstrap”:
进行如下设置:
Name:Bootstrap start
Project:apache-tomcat-9.0.0.M17-src
Main class(Search而来):org.apache.catalina.startup.Bootstrap
Program arguments:start
VM arguments:-Dcatalina.home="D:\dev\workspace\apache-tomcat-9.0.0.M17-src\output\build"
单击Apply,即可保存设置
接着单击Run,Tomcat即可启动。
打开浏览器,输入http://127.0.0.1:8080/examples/ 看看例子。
(6)停止
与(5)同样的方法设置Bootstrap stop,不同之处在于Program arguments:stop
(7)调试Tomcat源码的方法
选中org.apache.catalina.startup.Bootstrap,单击右键Debug As->Debug configurations
7.简单的源代码阅读指南
包名 | 用途 |
---|---|
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的核心架构: