Tomcat 源码系列:源码构建 Tomcat
前言
这篇博客写于 12 月 12 日,从 github[1] 上 fork 了一份 tomcat 的源代码,clone 到了本地。最近想把 tomcat 的源代码分析一下,寒假的时候有完整的时间就造个轮子。
看源码,总不能干看,边看边改,验证想法。所以这个系列从构建 tomcat 开始。首先要声明的是,以前没有完整看过一个项目的经历,tomcat 是第一次尝试看的源码。因此,这个系列可能存在描述不正确的问题,希望读者能帮忙指正。最后,感谢您的阅读!
这篇博客主要内容是,在 Windows 上,使用 Intellj-IDEA 编译运行 Tomcat。
问题
读源代码,要带着问题去阅读。有一些是自己想的,有一些是 How Tomcat Works[2] 的目录,还有一些来自于别人的博客[3]。这个部分可能会时不时更新一下,因为在搬砖的时候,可能突然对某个问题产生了兴趣,遂记录下来。一开始只写了 8 点,不知道以后这个列表会更新出多少点呢。
- 一个 Http 请求和响应,是如何转变成 Servlet 的请求和相应的?
- Servlet 是如何抽象 Http 请求的?
- Tomcat 如何管理 tcp 连接?
- Tomcat 如何管理输入输出流?
- Tomcat 的生命周期,如何启动的?如何运行?
- Session 如何管理?
- 如何加载类?
- Tomcat 如何管理 servlet 容器,如何连接?
- 不同的浏览器连接上应用,如何判断是不同的客户端呢?是 Tomcat 负责判断的吗?
- JSP 页面如何转为 java 代码,输出 html 文件?
问题就暂且提出这些。不知道这个 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 的工程文件了。下面的步骤,具体可以看官方的构建步骤。
安装 Ant
直接去这里下载 Ant 的包,然后配置环境变量。
添加一个新的环境变量:
变量名:ANT_HOME
变量值:C:\Program Files\apache-ant-1.9.15
增加如下到 Path
中。
变量值:%ANT_HOME%\bin
在 cmd 当中输入 ant
,如果可以找到命令,那么说明成功了。
配置下载位置
进入下载好的 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
使用 Ant 构建
输入 ant
即可,他会先下载构建需要的包,然后构建项目。构建好了如何运行呢?这个请不要着急,往后看会讲的。
使用 IDEA 构建
输入命令 ant ide-intellij
即可构建 IDEA 的项目。官方还提供了 eclipse 和 netbean。
接下来,就会下载 IDEA 需要的包,并且会将提供的项目文件复制到 Tomcat 目录下。之后就可以使用 IDEA 来打开了。
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 的控制台输出仍然会有乱码,可以选择使用英文来避免这个问题。
选择org.apache.catalina.startup
中的 BootStrap 类作为启动类,点击启动配置。
将以下参数加入到 VM 选项中。
-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