最近不是特别忙,空闲之余就开始倒腾Tomcat源码了,之前也陆陆续续看过一点,翻过 《How tomcat works》这本书。这次想趁着有时间,系统性的好好分析下Tomcat的源码。
分析源码的第一步自己是先搭建debug环境,我之前选择的是先下载Tomcat源码,然后通过Tomcat文档里面写的方法,使用ant构建,发现中间需要用很长的时间,中间经常提示构建失败(比如下载依赖的jar包失败等)。想到之前在开发环境的时候,经常使用idea的远程debug来调试测试环境的代码。显然我们本地的tomcat和测试环境的tomcat都一样,在idea或eclipse中都是Remote debug。笔者的环境是 windows, 使用linux的小伙伴稍微做调整即可(比如windows使用 catalina.bat, linux 使用 catalina.sh)
一、启动 Tomcat
首先下载Tomcat的可运行包,我这里下载的是 8.0.24 的版本,然后启动tomcat,当然我们需要debug,可以参考idea/eclipse模式,先把jvm挂起,等待远程debug的连接。
setenv.bat
tomcat的作者也想到了我们会debug tomcat, 在catalina.bat中也提供了强大的支持。
在bin目录下新建 setenv.bat
注意一定要是这个名字,因为在 catalina.sh 中是写死了这个名字的。然后输入以下内容:
set JPDA_SUSPEND=y
很简单,就是设置一个变量。然后在bin目录下启动tomcat debug环境:
catalina.bat jpda start
然后就看见 jvm 挂起,等待我们的远程 debug了。可以看到控制台提示:
Listening for transport dt_socket at address: 8000
感兴趣的小伙伴可以去阅读一下 catalina.bat 这个脚本,其实就是利用了jvm debug参数。这里推荐不去直接修改 catalina.bat 文件。
-agentlib:jdwp=transport=%JPDA_TRANSPORT%,address=%JPDA_ADDRESS%,server=y,suspend=%JPDA_SUSPEND%
suspend 参数默认为 n, 即开启debug但是默认在启动的时候,如果没有debug 连接,不挂起 jvm, 我们设置了 y, 即挂起jvm, 因为我们想看整个 tomcat的启动过程。(idea/eclipse的debug也是这个原理)
二、IDE remote debug
配置源码
Remote debug 最重要的是需要有源代码,那么Tomcat的源码我们用什么方式导入最好呢,这里想到了 Maven, tomcat 发行了 embed 版本的jar, 里面包含了tomcat的源码,所以利用 maven 项目可以很方便的关联debug源码。
在idea/eclipse中新建一个maven项目,然后引入以下依赖:
<dependencies>
<dependency>
<groupId>org.apache.tomcat.embed</groupId>
<artifactId>tomcat-embed-core</artifactId>
<version>8.0.24</version>
</dependency>
<dependency>
<groupId>org.apache.tomcat.embed</groupId>
<artifactId>tomcat-embed-logging-juli</artifactId>
<version>8.0.24</version>
</dependency>
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>javax.servlet-api</artifactId>
<version>3.1.0</version>
</dependency>
</dependencies>
配置remote debug
我这边使用的是 idea , 使用eclipse的小伙伴如果不知道怎么配置remote debug自行搜索一下哈:
- edit configurations
- 左上角 + 号,然后选择 remote
- 填写调试的地址和端口,默认是 localhost 8080
配置如图:
点击保存。 因为我们需要了解整个tomcat的启动过程,所以先找到 Main 函数入口,在catalina.bat 中我们知道,这个Main函数入口是在 Bootstrap 类中。所以我们找到这个类的Main方法然后在第一行打一个断点:
然后点击工具栏的 debug按钮,啊哈~ 断点进来啦。