Tomcat源码阅读环境搭建
warning:
这篇文章距离上次修改已过1745天,其中的内容可能已经有所变动。
最近正在学习Tomcat架构,感觉自己懂了,其实只是感觉。学习这东西到底还是得自己动手去试试。
本篇文章就是记录一下我搭建Tomcat源码阅读环境的过程,和其中踩的坑。
info:本文为《Tomcat源码架构笔记》的配套文章。
下载Tomcat源码包
首先访问Tomcat官网,在左侧侧边栏中选择需要的Tomcat版本,来进入下载页面。


这里我选择下载Tomcat8.5 源码和二进制文件,方便对照观察。

为源码添加pom.xml
在源码中新建maven工程的配置文件pom.xml,其内容如下。
相关的maven包信息可以到这里找到:https://mvnrepository.com/
<?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>apache-tomcat- 8.5.55-src</artifactId>
<name>Tomcat8.5</name>
<version>8.5</version>
<build>
<!--指定源目录-->
<finalName>Tomcat8.5</finalName>
<sourceDirectory>java</sourceDirectory>
<resources>
<resource>
<directory>java</directory>
</resource>
</resources>
<testResources>
<testResource>
<directory>test</directory>
</testResource>
</testResources>
<plugins>
<!--引用编译插件,指定编译级别和编码-->
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.1</version>
<configuration>
<encoding>UTF-8</encoding>
<source>1.8</source>
<target>1.8</target>
</configuration>
</plugin>
</plugins>
</build>
<dependencies>
<!--远程过车调用工具包-->
<dependency>
<groupId>javax.xml</groupId>
<artifactId>jaxrpc</artifactId>
<version>1.1</version>
</dependency>
<!--soap协议处理工具包-->
<dependency>
<groupId>javax.xml.soap</groupId>
<artifactId>javax.xml.soap-api</artifactId>
<version>1.4.0</version>
</dependency>
<!--解析webService的wsdl工具-->
<dependency>
<groupId>wsdl4j</groupId>
<artifactId>wsdl4j</artifactId>
<version>1.6.2</version>
</dependency>
<!--eclipse java编译器-->
<dependency>
<groupId>org.eclipse.jdt.core.compiler</groupId>
<artifactId>ecj</artifactId>
<version>4.5.1</version>
</dependency>
<!--ant管理工具-->
<dependency>
<groupId>ant</groupId>
<artifactId>ant</artifactId>
<version>1.7.0</version>
</dependency>
<!--easymock辅助单元测试-->
<dependency>
<groupId>org.easymock</groupId>
<artifactId>easymock</artifactId>
<version>3.4</version>
</dependency>
<!--添加单元测试框架-->
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
<scope>test</scope>
</dependency>
</dependencies>
</project>
移动部分目录


导入项目到IDEA中

等待maven自动下载依赖。

配置Tomcat启动参数
Tomcat软件模式 | Tomcat源代码模式 |
---|---|
Tomcat软件(jar形式) | Tomcat源代码(导入开发环境运行) |
conf配置 | conf配置(需要手工指定文件位置) |
webapps | webapps(需要手工指定文件位置) |



# 使用时请去掉注释
# 指定安装路径
-Dcatalina.home=/home/ding/tool/apache-tomcat-8.5.55-src/source/
# 指定工作路径
-Dcatalina.base=/home/ding/tool/apache-tomcat-8.5.55-src/source/
-Djava.util.logging.manager=org.apache.juli.ClassLoaderLogManager
# 指定日志配置文件路径
-Djava.util.logging.config.file=/home/ding/tool/apache-tomcat-8.5.55-src/source/conf/logging.properties

添加初始化jsp引擎语句
//初始化jsp引擎
context.addServletContainerInitializer(new JasperInitializer(),null);

注释测试单元代码
如果出现下面的错误,可以考虑此步骤
Error:(29, 36) java: 找不到符号
符号: 变量 CookieFilter
位置: 类 util.TestCookieFilter
Error:(35, 40) java: 找不到符号
符号: 变量 CookieFilter
位置: 类 util.TestCookieFilter
Error:(42, 17) java: 找不到符号
符号: 变量 CookieFilter
位置: 类 util.TestCookieFilter

关于控制台的乱码问题
添加启动参数,设置地区语言为en
-Dfile.encoding=UTF-8
-Duser.language=en
-Duser.region=US

info:进入StringManager sm变量发现,local为zh_cn时,启用的属性文件本身的编码就是乱码。
本部分参考:
@zhoutaoping1992 的《记一次tomcat源码启动控制台中文乱码问题调试过程》
@一天不进步,就是退步的《编译Tomcat9源码及tomcat乱码问题解决》
其他一些错误
错误:osgi: [apache-tomcat-8.5.55-src] Invalid value for Bundle-Version, @VERSION@ does not match [0-9]{1,9}(\.[0-9]{1,9}(\.[0-9]{1,9}(\.[0-9A-Za-z_-]+)?)?)?

启动
