【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应用的相关步骤,本文将就 ...
随机推荐
- 测试_QTP使用实例
1. QTP简介 1.1QTP功能与特点 QTP是QuickTest Professional的简称,是一种自动化软件测试工具.在软件的测试过程中,QTP主要来用来通过已有的测试脚本执行重复的手动测试 ...
- Python_faker (伪装者)创建假数据
faker (伪装者)创建假数据 工作中,有时候我们需要伪造一些假数据,如何使用 Python 伪造这些看起来一点也不假的假数据呢? Python 有一个包叫 Faker,使用它可以轻易地伪造姓名.地 ...
- [JLOI2011]飞行路线 题解
[JLOI2011]飞行路线 题解 题目TP门 题目描述 Alice和Bob现在要乘飞机旅行,他们选择了一家相对便宜的航空公司.该航空公司一共在n个城市设有业务,设这些城市分别标记为0到n-1,一共有 ...
- H264Nalu头部解析
一 NALU头部解析 F: forbidden_zero_bit. 在 H.264 规范中规定了这一位必须为 0. NRI: nal_ref_idc. 取00~11,似乎指示这个NALU的重要性,如0 ...
- 免费|申请谷歌云服务器|msf安装
apt-get install -y wget 参考链接 知乎-免费|申请谷歌云服务器 知乎-免费|申请谷歌云服务器 cnblogs-debian.ubuntu安装metasploit通用方法 谷歌云 ...
- 图创图书管理SQL注入漏洞
payload root@kali:~# sqlmap -u http://2*0.*6.***.3:8080/opac/recommend/recommendBookList/list --data ...
- python-网络安全编程第九天(json模块、zoomeye采集)
前言 其实这篇应该是昨天必须完成的但是昨天emmmmm 学习进度有点慢 今天早上起来早点完成了这些的学习 昨天计划学习内容还差一道CTFemmm 不管了 先写一下今天的计划 开始锻炼身体去. pyth ...
- 轻松学编曲,论FL Studio的钢琴卷帘功能
在编曲软件FL Studio中有一个会被经常用到的功能,叫钢琴卷帘,可以用来扒谱.编曲.制作音乐等,并且操作简单,即使不懂乐理也能一样使用.今天,就来带大家认识一下钢琴卷帘. 还没有安装FL Stud ...
- 用OCR文字识别工具来审阅和处理PDF内容
"工作的时候要同时打开好几个软件真的是太不方便了."很多公司白领都有这样的困扰.他们抱怨着进行文字识别过后又要打开文档编辑器来进行编辑.PDF是办公文档常用的格式, ABBYY F ...
- Word1-提取图片文字
1.OneNote # 将图片以图片格式粘贴在OneNote中-右键选择"复制图片中的文本"-粘贴"只保留文本"即可 这种方式识别率较高!!! 2.手机QQ图片 ...