Tomcat 源码阅读环境搭建(9.0.53)
1. 下载源码包
打开tomcat官网

![I51v59[1].png](https://cdn.nlark.com/yuque/0/2021/png/12460206/1637144111523-dbce0bf9-d82e-4fd4-83e3-721f3b846b92.png#clientId=u82453ed0-17bb-4&from=ui&id=u3fa4eb7c&originHeight=460&originWidth=1170&originalType=binary&ratio=1&size=20050&status=done&style=none&taskId=u181800dc-c160-41db-a952-959fdd7147f)



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

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


在生成的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文件上右键, 设置文件夹类型

3. 启动tomcat
3.1 配置项目的JDK

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

解决乱码问题
找到org.apache.tomcat.util.res.StringManager类

在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; }
|
再次启动,乱码问题已解决。

解决启动过程中控制台的报错
刚刚启动时,发现控制台有报错,截图如下。

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

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

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

同时,控制台打印如下:

debug到Validator.java的 527 行。

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


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

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

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