Tomcat源码阅读环境搭建

最近正在学习Tomcat架构,感觉自己懂了,其实只是感觉。学习这东西到底还是得自己动手去试试。

本篇文章就是记录一下我搭建Tomcat源码阅读环境的过程,和其中踩的坑。

info:本文为《Tomcat源码架构笔记》的配套文章。

下载Tomcat源码包

首先访问Tomcat官网,在左侧侧边栏中选择需要的Tomcat版本,来进入下载页面。

选择需要下载的Tomcat版本选择需要下载的Tomcat版本

这里我选择Tomcat8.5这里我选择Tomcat8.5

这里我选择下载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>

移动部分目录

创建资源文件夹source创建资源文件夹source

将conf(配置文件目录)和webapps目录移动到此处将conf(配置文件目录)和webapps目录移动到此处


导入项目到IDEA中

导入项目到IDEA中导入项目到IDEA中

等待maven自动下载依赖。

maven自动下载的依赖包maven自动下载的依赖包


配置Tomcat启动参数

Tomcat软件模式Tomcat源代码模式
Tomcat软件(jar形式)Tomcat源代码(导入开发环境运行)
conf配置conf配置(需要手工指定文件位置)
webappswebapps(需要手工指定文件位置)

新建一个运行/调试配置新建一个运行/调试配置

配置主类为Bootstrap配置主类为Bootstrap

配置虚拟机参数(点击箭头可以展开)配置虚拟机参数(点击箭头可以展开)

# 使用时请去掉注释

# 指定安装路径
-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);

添加初始化jsp引擎语句,防止启动Tomcat时出现500错误添加初始化jsp引擎语句,防止启动Tomcat时出现500错误


注释测试单元代码

如果出现下面的错误,可以考虑此步骤

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

添加启动参数,设置地区语言为en添加启动参数,设置地区语言为en

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_-]+)?)?)?

修改Bundle-Version为8修改Bundle-Version为8


启动

启动成功启动成功

添加新评论

* 已开启反垃圾保护,《隐私政策》