【Tomcat 源码系列】源码构建 Tomcat
一,前言
这篇博客写于 12 月 12 日,从 github[1] 上 fork 了一份 tomcat 的源代码,clone 到了本地。最近想把 tomcat 的源代码分析一下,寒假的时候有完整的时间就造个轮子。
看源码,总不能干看,边看边改,验证想法。所以这个系列从构建 tomcat 开始。首先要声明的是,以前没有完整看过一个项目的经历,tomcat 是第一次尝试看的源码。因此,这个系列可能存在描述不正确的问题,希望读者能帮忙指正。最后,感谢您的阅读!
这篇博客主要内容是,在 Windows 上,使用 Intellj-IDEA 编译运行 Tomcat。
二,问题
读源代码,要带着问题去阅读。有一些是自己想的,有一些是 How Tomcat Works[2] 的目录,还有一些来自于别人的博客[3]。
- 一个 Http 请求和响应,是如何转变成 Servlet 的请求和相应的?
- Servlet 是如何抽象 Http 请求的?
- Tomcat 如何管理 tcp 连接?
- Tomcat 如何管理输入输出流?
- Tomcat 的生命周期,如何启动的?如何运行?
- Session 如何管理?
- 如何加载类?
- Tomcat 如何管理 servlet 容器,如何连接?
问题就暂且提出这些。不知道这个 Tomcat 源码阅读系列是否能够完成呢(/▽\)。不管怎样,先搭个环境,用自己喜欢的 IDE(IntelliJ IDEA) 来阅读、调试源码。
三,步骤
- 下载源代码,这里在 github 上下载
- 选择正确的 JDK 版本,官方使用的是 JDK 8
- 下载 Ant 工具,Tomcat 使用 Ant 来构建
- 配置依赖包的下载位置
- 使用 Ant 构建
- 使用 Ant 创建 IDE 工程,IDE 支持 Intellij-IDEA,NetBean,Eclipse
获取源代码,安装对应的 JDK 版本,下面就不解释了。下面主要讲讲如何使用 Ant 工具来开发,在写这篇博客之前,其实我自己也没有想到构建 Tomcat 是很简单的事情。官方还很贴心的考虑到了,开发者可能会使用 IDE 来开发,于是给开发者配置好了环境。使用对应的 Ant 任务就可以有对应 IDE 的工程文件了。下面的步骤,具体可以看官方的构建步骤。
1 安装 Ant
直接去这里下载 Ant 的包,然后配置环境变量。
添加一个新的环境变量:
变量名:ANT_HOME
变量值:C:\Program Files\apache-ant-1.9.15
增加如下到 Path 中。
变量值:%ANT_HOME%\bin
在 cmd 当中输入 ant,如果可以找到命令,那么说明成功了。
2 配置下载位置
进入下载好的 Tomcat 目录中,我这里 tomcat 的根目录是 D:\Code\tomcat。
新建一个文件 build.properties,复制以下的内容。指定依赖包的保存地址。
# ----- Default Base Path for Dependent Packages -----
# Replace this path with the directory path where dependencies binaries
# should be downloaded
base.path=D:\\Code\\tomcat\\lib
3 使用 Ant 构建
输入 ant 即可,他会先下载构建需要的包,然后构建项目。
4 使用 IDEA 构建
输入命令 ant ide-intellij 即可构建 IDEA 的项目。官方还提供了 eclipse 和 netbean。
接下来,就会下载 IDEA 需要的包,并且会将提供的项目文件复制到 Tomcat 目录下。之后就可以使用 IDEA 来打开了。
5 Bug
官方的代码里面,build.properties.default 和 res\ide-support 下的版本对应不上,于是会出现下面的报错。下面给出两种解决方案。

解决方案一
添加依赖。
打开 Project Structure

添加依赖

解决方案二
修改 res\ide-support\idea\tomcat.iml 中对应的版本,然后重新构建就好了。

四,运行
Tomcat 的运行有两种方式,一种是使用官方的脚本来运行,另一种是使用 org.apache.catalina.startup 中的 BootStrap 类。
方式一
首先使用 ant 构建好项目,然后进入 output\build 文件夹。
接着修改 conf\logging.properties 下的编码,不然控制台要输出乱码了。

最后进入,bin\startup.bat 双击一下就可以运行了。进入 http://localhost:8080/ 就可以查看是否运行成功。
方式二
使用 org.apache.catalina.startup 中的 BootStrap 类。使用 IDEA 来启动这个类。首先要配置好参数,我们把方式一中的命令行参数拷贝到 IDEA 的启动参数里面即可。

不过 IDEA 的控制台输出仍然会有乱码,可以选择使用英文来避免这个问题。
-Djava.util.logging.config.file=D:\Code\tomcat\output\build\conf\logging.properties
-Djava.util.logging.manager=org.apache.juli.ClassLoaderLogManager
-Djdk.tls.ephemeralDHKeySize=2048
-Djava.protocol.handler.pkgs=org.apache.catalina.webresources
-Dcatalina.base=D:\Code\tomcat\output\build
-Dcatalina.home=D:\Code\tomcat\output\build
-Djava.io.tmpdir=D:\Code\tomcat\output\build\temp
-Dfile.encoding=UTF-8
-Duser.language=en
-Duser.region=US
点击启动!so easy。接下来就是一边阅读源码,一边调试看看了。

参考
[1] https://github.com/apache/tomcat
[2] How Tomcat Works 2
[3] http://www.iocoder.cn/Tomcat/Tomcat-collection/
[4] https://tomcat.apache.org/tomcat-10.0-doc/building.html
【Tomcat 源码系列】源码构建 Tomcat的更多相关文章
- 【转】Tomcat源代码阅读系列
在IntelliJ IDEA 和 Eclipse运行tomcat 7源代码(Tomcat源代码阅读系列之一) Tomcat总体结构(Tomcat源代码阅读系列之二) Tomcat启动过程(Tomcat ...
- 【Tomcat 源码系列】认识 Tomcat
一,前言 说一句大实话,"平时一直在用 Tomcat,但是我从来没有用过 Tomcat". "平时一直在用 Tomcat",是因为搬砖用的 SpringBoot ...
- 【Tomcat 源码系列】Tomcat 整体结构
一,前言 在开始看源码细节之前,首先要想好要看的问题.想好问题之后,我们该如何寻找要看的代码呢? 其实,这就好像去爬山的时候,突然想去上厕所,如果有一副地图,那么我们可以很快就找到厕所的位置.带着问题 ...
- Tomcat处理HTTP请求源码分析(下)
转载:http://www.infoq.com/cn/articles/zh-tomcat-http-request-2 很多开源应用服务器都是集成tomcat作为web container的,而且对 ...
- tomcat集群实现源码级别剖析
随着互联网快速发展,各种各样供外部访问的系统越来越多且访问量越来越大,以前Web容器可以包揽接收-逻辑处理-响应整个请求生命周期的工作,现在为了构建让更多用户访问更强大的系统,人们通过不断地业务解耦. ...
- Tomcat处理HTTP请求源码分析(上)
Tomcat处理HTTP请求源码分析(上) 作者 张华 发布于 2011年12月8日 | 8 讨论 分享到: 微博 微信 Facebook Twitter 有道云笔记 邮件分享 稍后阅读 我的阅读清单 ...
- 探秘Tomcat(一)——Myeclipse中导入Tomcat源码
前言:有的时候自己不知道自己是井底之蛙,这并没有什么可怕的,因为你只要蜷缩在方寸之间的井里,无数次的生活轨迹无非最终归结还是一个圆形:但是可怕的是有一天你不得不从井里跳出来生活,需要重新审视井以外的生 ...
- 学习tomcat(一)----用IDEA调试tomcat源码
一直在使用tomcat,但却不怎么熟悉tomcat的"运作流程",今天就 参照参考文章进行了代码搭建(代码的github在文末),并修改了一些操作.学习下tomcat的" ...
- Tomcat源码分析一:编译Tomcat源码
Tomcat源码分析一:编译Tomcat源码 1 内容介绍 在之前的<Servlet与Tomcat运行示例>一文中,给大家带来如何在Tomcat中部署Servlet应用的相关步骤,本文将就 ...
随机推荐
- 检查linux下服务器的带宽
设想:公司 A 有一个名为 bsdocfs 的存储服务器,并通过名为 beckham 的客户端节点装载 NFS.公司 A 确定他们需要从 bsdocfs得到更多的带宽,因为有大量的节点需要访问 bsd ...
- TensorFlow_笔记
Tensorflow 1.基本概念 TensorFlow是一个编程系统,使用图(graphs)来表示计算任务,图(graphs)中的节点称之为op(operation),一个op获得0个或多个Tens ...
- Guitar Pro使用技巧之乐段回放练习
Guitar Pro中的"回放"功能是我们在吉他练习中非常常用的一项功能.我们在吉他练习中碰到某一乐段比较练习比较困难时,我们就可以用鼠标在Guitar Pro上选中该乐段,然后进 ...
- 使用Camtasia来消除视频中的声音
大多数情况下,我们在录制电脑屏幕的时候都会把音频输出也一起录制下来,但也会有时候要后期进行重新配音,需要把事先一同录制的音频消除掉,今天小编来给大家说一说如何消除这种的视频声音. 首先打开Camtas ...
- P3694 邦邦的大合唱站队 题解
\( 数据范围暗示状压,爪巴. \\ 首先考虑状态量. \\ 我们设计一个关于乐队数量的状态 S, 代表排列好的乐队.\\ \) eg: if(Set_排列好的队列 = {1, 2, 5}) then ...
- SpringBoot整合Elasticsearch7
SpringBoot连接ElasticSearch有以下种方式, TransportClient,9300端口,在 7.x 中已经被弃用,据说在8.x 中将完全删除 restClient,9200端口 ...
- django中的积累
只要继承了model.Model, 就会生成一个新的表,但是,如果在Meta方法中添加abstract=True,就不会产生新的表,而是作为一个基类存放多个表共同拥有的方法和字段等 from djan ...
- 如何有效恢复误删的HDFS文件
HDFS是大数据领域比较知名的分布式存储系统,作为大数据相关从业人员,每天处理HDFS上的文件数据是常规操作.这就容易带来一个问题,实际操作中对重要数据文件的误删,那么如何恢复这些文件,就显得尤为重要 ...
- C++实现任意进制的相互转换
进制转换是计算机内部时时刻刻都在进行活动,本篇文章也是进制转换的算法介绍,不过不同的是我想利用ascll编码实现2到61之间任意进制的相互转换,更大进制的表示方法只不过是十六进制表示方法的延伸:用字母 ...
- 想了解表格问答,我们先看看TA的前世
摘要:表格问答是一种针对自然语言问题,根据表格内容给出答案的任务. 一.什么是表格问答 表1是一张综艺节目收视率报表,假如你需要了解市场份额在3%以上的综艺节目,你会选择采用什么样的方法? 首先,用肉 ...