Tomcat 源码阅读环境搭建(9.0.53)

1. 下载源码包

打开tomcat官网

I51v59[1].png

image-20211108113918132.png
image-20211108113947876.png

2. 解压之后,用 idea 打开文件夹

image-20211108114229791.png

tomcat是使用ant来进行管理的,为方便使用,引入maven来处理依赖

image-20211108114423745.png

image-20211108114847968.png

在生成的pom.xml文件中,粘贴以下代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>

<groupId>groupId</groupId>
<artifactId>apache-tomcat-9.0.53-src</artifactId>
<version>1.0-SNAPSHOT</version>

<properties>
<maven.compiler.source>8</maven.compiler.source>
<maven.compiler.target>8</maven.compiler.target>
</properties>
<dependencies>
<dependency>
<groupId>org.apache.tomcat</groupId>
<artifactId>catalina</artifactId>
<version>6.0.53</version>
</dependency>
<dependency>
<groupId>org.apache.ant</groupId>
<artifactId>ant</artifactId>
<version>1.10.11</version>
</dependency>
<dependency>
<groupId>biz.aQute.bnd</groupId>
<artifactId>biz.aQute.bnd.annotation</artifactId>
<version>6.0.0</version>
</dependency>
<dependency>
<groupId>org.eclipse.jdt</groupId>
<artifactId>org.eclipse.jdt.core</artifactId>
<version>3.26.0</version>
</dependency>
<dependency>
<groupId>javax</groupId>
<artifactId>javaee-api</artifactId>
<version>8.0.1</version>
</dependency>
<dependency>
<groupId>wsdl4j</groupId>
<artifactId>wsdl4j</artifactId>
<version>1.6.3</version>
</dependency>
</dependencies>
</project>

java文件上右键, 设置文件夹类型

image-20211108140710894.png

3. 启动tomcat

3.1 配置项目的JDK

image-20211108141027786.png

3.2 启动Bootstrap

tomcat的启动类是 Bootstrap.java, 找到这个类,点击运行

image-20211108141254070.png

解决乱码问题

找到org.apache.tomcat.util.res.StringManager

image-20211108141357561.png

getString(String key)方法中,return str; 之前,即整个文件的第149行,添加以下代码:

1
2
3
4
5
try{
str = new String(str.getBytes(StandardCharsets.ISO_8859_1), StandardCharsets.UTF_8);
}catch (Exception e){
e.printStackTrace();
}

还有org.apache.jasper.compiler.Localizer类,getMessage(String errCode)方法替换为以下代码。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
public static String getMessage(String errCode) {
String errMsg = errCode;
try {
if (bundle != null) {
errMsg = bundle.getString(errCode);
}
} catch (MissingResourceException e) {
}
try{
errMsg = new String(errMsg.getBytes(StandardCharsets.ISO_8859_1), StandardCharsets.UTF_8);
}catch (Exception e){
e.printStackTrace();
}
return errMsg;
}

再次启动,乱码问题已解决。

image-20211108141831778.png

解决启动过程中控制台的报错

刚刚启动时,发现控制台有报错,截图如下。

image-20211108142023232.png

百度后,了解到是webapps下的examples文件夹的问题,删掉即可。

image-20211108142213216.png

删掉后再次启动,控制台就没有报错信息了。

image-20211108142256229.png

解决访问默认页面的报错

访问默认的页面localhost:8080时,页面显示如下:

image-20211108153136299.png

同时,控制台打印如下:

image-20211108150034814.png

debugValidator.java的 527 行。

image-20211108152331457.png

这里获取到的DefaultFactorynull, 找一下DefaultFactory是什么时候放进去的,全局搜索

image-20211108152535561.png

image-20211108152607132.png

复制这一段代码,到Bootstrap类中。

image-20211108152814651.png

再次启动Bootstrap类,访问localhost:8080, 出现以下界面:

image-20211108153001551.png

至此,tomcat 9.0.53源码阅读调试环境,搭建完毕。