工具版本
JDK:1.8.0.211
Tomcat:8.5.50
IDEA:2019.3.5
1、Tomcat源码下载
1.1、源码压缩包
在tomcat官网 https://tomcat.apache.org
找到如下图位置,下载 zip 包,找地方解压即可,不过这种压缩包的方式并不灵活,我用的是第二种方式。
1.2、GitHub 源码
如下图,找到 GitHub 仓库,把 tomcat 源码仓库克隆到本地即可,这样如果需要别的版本也可以随时切换分支来实现。也可以直接访问 GitHub 仓库 https://github.com/apache/tomcat
2、IDEA 与 Maven 环境搭建
2.1 IDEA 打开 tomcat 源码
点击 Open 打开上一步克隆的 tomcat 仓库 或者 源码压缩包的解压目录(两者内容一样),我是用的 GitHub 仓库。
打开之后是在 main 分支上的,这里切换到 8.5.50 分支,tomcat 8.5.50 版本已经被打成标签了,所以这里先切到标签上,再创建一个新分支
2.2、 Maven 构建源码
tomcat 官方是用 ant 构建的源码,这个玩意儿太老了,不会用,所以是用 maven 构建
先创建 maven 的 pom 文件,内容如下
<?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>org.apache.tomcat</groupId>
<artifactId>my-tomcat</artifactId>
<version>8.5.50</version>
<dependencies>
<dependency>
<groupId>org.apache.ant</groupId>
<artifactId>ant</artifactId>
<version>1.10.4</version>
</dependency>
<dependency>
<groupId>wsdl4j</groupId>
<artifactId>wsdl4j</artifactId>
<version>1.6.2</version>
</dependency>
<dependency>
<groupId>javax.xml</groupId>
<artifactId>jaxrpc-api</artifactId>
<version>1.1</version>
</dependency>
<dependency>
<groupId>org.eclipse.jdt.core.compiler</groupId>
<artifactId>ecj</artifactId>
<version>4.5.1</version>
</dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.13</version>
</dependency>
</dependencies>
<build>
<finalName>apache-tomcat</finalName>
<sourceDirectory>java</sourceDirectory>
<resources>
<resource>
<directory>java</directory>
</resource>
</resources>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.8.1</version>
<configuration>
<source>1.8</source>
<target>1.8</target>
<encoding>UTF-8</encoding>
</configuration>
</plugin>
</plugins>
</build>
</project>
如下图,右键 pom.xml文件,添加为 maven 项目。
然后,编译一下
3、 源码运行
3.1 初始运行
找到 Bootstrap 类,运行 main 方法
如图所示,启动成功
3.2、解决乱码
上一步启动成功,但是控制台都是乱码,需要处理一下,这里修改两处地方
org.apache.jasper.compiler.Localizer#getMessage(java.lang.String) 这个方法添加下边代码
if (errMsg != null && errMsg.trim().length() > 0){
try {
errMsg = new String(errMsg.getBytes("ISO-8859-1"), "UTF-8");
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
}
}
修改如下图
org.apache.tomcat.util.res.StringManager#getString(java.lang.String) 这个方法添加下边代码
// 解决控制台国际化中文乱码
// 为什么会出现中文乱码呢?
// 因为在通过ResourceBundle进行国际化设置时, 资源文件必须是ISO-8859-1,
// 而Idea设置的编码格式是UTF-8, tomcat默认日志格式(logging.properties)也是UTF-8;
// ResourceBundle对于所有非西方语系的处理,都必须先将之转换为Java Unicode Escape格式。
// 转换方法是通过JDK自带的工具native2ascii, 在解析过程中由于格式不匹配导致了乱码
if (str != null && str.trim().length() > 0){
try {
str = new String(str.getBytes("ISO-8859-1"), "UTF-8");
} catch (Exception e) {
e.printStackTrace();
}
}
修改如下图
此时重新运行 main 方法,启动成功,如下图
3.3、解决 JSP 问题
上一步启动成功之后,在浏览器访问 http://localhost:8080/
可以看出是不能把类编译成 JSP,需要初始化一下 JSP 解释器
org.apache.catalina.startup.ContextConfig#configureStart 方法添加一行代码
context.addServletContainerInitializer(new JasperInitializer(), null);
修改如下图
重启服务,可以正常访问
好了,源码环境搭建成功,接下来就可以新建一个 web 项目,添加一些测试类,编译打包成 war 包复制到 webapps 目录下,愉快的打断点学习 tomcat 了!