由于有时需要验证 Tomcat 的问题或者调试其内部代码,所以需要在本地 IDEA 搭建 Tomcat 的开发环境,在此简单记录。
整个过程根据官方的构建文档调整而来,参考:Apache Tomcat 8 (8.5.70) - Building Tomcat。
首先确认机器安装了 Java SE Development Kit 8 及 Apache Ant,我本地使用的版本是 JDK 1.8.0_291 及 Ant 1.10.8_1。
从 GitHub 上 clone Apache Tomcat 的源码:
1 | git clone https://github.com/apache/tomcat.git |
clone 完成后切换到 tomcat 工程目录并切换到指定的 tag,我使用 8.5.70
:
1 | cd tomcat |
先使用 ant 构建一次,把缺失的 jar 下载到本地:
1 | ant |
再使用 ant 生成 Intellij IDEA 所需的项目环境信息:
1 | ant ide-intellij |
部分输出如下:
1 | downloadfile: |
可以看到 Intellij IDEA 项目所需的 .idea
目录已经生成,此时我们使用 Intellij IDEA 打开该目录,根据文档配置以上两个 PATH VARIABLES,配置 PATH VARIABLES 的文档可以参考:Path variables | IntelliJ IDEA,在我的电脑上配置后的截图如下:
然后在 IDEA 中从类入口 org.apache.catalina.startup.Bootstrap#main
运行 Tomcat,随即发现编译报错:
1 | /Users/Poison/IdeaProjects/tomcat/test/util/TestCookieFilter.java:19:17 |
原因为 tag 为 8.5.70
的 ant target: ide-intellij
中使用的 JUnit 版本为 4.13
,而 Tomcat 实际使用的 JUnit 版本已经升级至 4.13.2
,且 TOMCAT_BUILD_LIBS
对应的目录下的 JUnit 版本也是 4.13.2,所以我们需要手动修改 IDEA 中使用的 JUnit 版本,在 .idea/tomtat.iml
中调整 JUnit 的版本:
1 | <orderEntry type="module-library"> |
将其中的 jar://$TOMCAT_BUILD_LIBS$/junit-4.13/junit-4.13.jar!/
替换为 jar://$TOMCAT_BUILD_LIBS$/junit-4.13.2/junit-4.13.2.jar!/
后重新运行 org.apache.catalina.startup.Bootstrap#main
,我的电脑的启动输出日志如下:
1 | Aug 26, 2021 5:26:33 PM org.apache.catalina.startup.ClassLoaderFactory validateFile |
看起来好像出错了,是 webapps/examples
目录引起的,查看该目录下的内容,原来是原生的 Java 类,没有进行编译,而之前我们执行的 ant
编译出的目录位于 output/build/webapps
,所以我们对源码进行简单的调整以处理本地环境使用的 webapps 目录不正确的问题:
1 | // 将 org.apache.catalina.core.StandardHost#getAppBaseFile 中的代码进行调整,调整前: |
调整完成后,启动不再报错,就可以 DEBUG 源码了。