使用IDEA+Ant搭建Tomcat源码阅读环境

一、为什么要阅读Tomcat源码?
Tomcat是一个开源的轻量级且使用非常广泛的Web容器,SpringBoot内置集成了Embedded Tomcat。阅读并学习Tomcat源码主要出于两个目标:(1)熟悉Tomcat整体架构、Web容器实现原理以及请求处理流程;(2)学习如何在SpringBoot应用中配置tomcat参数。
二、Tomcat源码阅读环境搭建流程
1、下载并安装JDK与Ant
由于Tomcat源码使用Ant构建,因此需要安装Ant,省掉将源码项目转为Maven项目的工作量。下载Ant链接https://dlcdn.apache.org//ant/binaries/apache-ant-1.10.12-bin.zip。配置ANT_HOME并使用ant -version验证是否安装成功。
2、下载Tomcat源码并解压至指定文件夹下
下载链接:https://downloads.apache.org/tomcat/tomcat-9/v9.0.65/src/apache-tomcat-9.0.65-src.zip.asc。
3、使用IDEA打开源码并构建源码
(1)首先确保IDEA已启用Ant插件,打开源码后将项目转为Ant项目。
(2)复制build.properties.default文件为build.properties,打开并修改base.path=/Users/colinlee/IdeaProjects/source/tomcat/tomcat-build-libs(PS:请修改为自己的路径),修改build.xml,注释掉报错的property,仅保留build.properties。
<!--<property file="${user.home}/build.properties"/>-->
<property file="build.properties"/>
<!--<property file="build.properties.release"/>-->
<!--<property file="build.properties.default"/>-->
(3)使用“download-compile”的Target将Tomcat的依赖包下载至tomcat-build-libs下。(PS:ant依赖需要单独下载,下载链接:https://repo1.maven.org/maven2/org/apache/ant/ant/1.10.12/ant-1.10.12.jar。在tomcat-build-libs下创建文件夹ant-1.10.12,并将下载好的ant-1.10.12.jar复制或剪切至文件夹ant-1.10.12下。)
(4)使用“deploy”的Target编译项目到${user.dir}/output下。我的是 /Users/colinlee/IdeaProjects/source/tomcat/apache-tomcat-9.0.65-src/output。
4、配置项目
(1)设置Project的JDK
(2)设置Modules。在Sources下将java目录设置为源码目录,在Paths下设置源码编译输出目录为/Users/colinlee/IdeaProjects/source/tomcat/apache-tomcat-9.0.65-src/output/classes。
(3)设置Libraries。在Libraries下点击“+”号选择Java,弹框选择文件夹tomcat-build-libs下的所有文件夹,以添加需要的所有依赖。
5、启动项目
点击Edit Configurations,添加一个Application来运行。如下图所示,Main Class为org.apache.catalina.startup.Bootstrap。
VM options需要指定catalina.home和catalina.base。个人理解,catalina.home指的是Tomcat根目录或者说安装目录(即bin目录所在的目录,类似JAVA_HOME);catalina.base指的是webapp目录所在的目录。⚠️另外这里如果不指定catalina.home的话会警告提示找不到lib目录。
-Dcatalina.home=/Users/colinlee/IdeaProjects/source/tomcat/apache-tomcat-9.0.65-src/output/build
-Dcatalina.base=/Users/colinlee/IdeaProjects/source/tomcat/apache-tomcat-9.0.65-src/output/build
配置好后运行Bootstrap,开启阅读源码之旅。
三、最后!附上一张请求处理流程图
如有不正确之处,欢迎在下方评论指出!