原文地址:https://www.jianshu.com/p/df4db2b80c3a

参考: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的核心架构:

 
Tomcat7核心架构图
posted on 2019-06-22 14:49  一天不进步,就是退步  阅读(498)  评论(0编辑  收藏  举报