编译Tomcat9源码

参考: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核心架构图
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,547评论 6 477
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,399评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,428评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,599评论 1 274
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,612评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,577评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,941评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,603评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,852评论 1 297
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,605评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,693评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,375评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,955评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,936评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,172评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 43,970评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,414评论 2 342

推荐阅读更多精彩内容