• 概述
  • 下载Tomcat源码包
  • 导入工程,使用pom.xml组织文件
  • 注释Tomcat测试代码
  • 设置Tomcat版本
  • 配置JVM参数
  • 添加初始化JSP解析器代码

概述

  • Tomcat作为一款非常经典的web容器,经久不衰,就算现在的SpringMVC,SpringBoot框架也是默认内嵌Tomcat;Tomcat内部有很多经典的设计思想与性能优化方案值得我们去借鉴学习,对于我们平时编码有极大的帮助作用;
  • 今天,我们来开始Tomcat学习之旅。这篇文章主要是让大家可以正常把Tomcat加载到我们常用的IDE中去,当然这个步骤也是非常考验人解决问题的能力的,也是评估我们后续是否可以正常阅读源码的关键门槛;废话不多说,这就开始。

下载Tomcat源码包

  • 一般来说,学一个东西首选就应该想到去官网,毕竟官网是最权威的地方,对一开始少走弯路有很大帮助作用;当然,很多这种组件都是国外的,大部分也都没专门提供中文的版本,因此我个人觉得学好英文并且可以流畅阅读英文官方文档也是技术人的关键技能之一(后面有空可以说说作为技术人如何学好英文),毕竟技术是全球技术人一起推动一起进步;不过如果你要说,现在各种翻译工具已经做的非常好了,可以翻译专业术语,那也可以当做退而求其次的一种办法了;
  • 我们可以访问Tomcat官网:https://tomcat.apache.org/;
  • 在官网左侧的download选项卡中选择需要的版本,这边我们下载Tomcat8为例;
  • 如下图,下载对应的Source Code;

2020-07-30_07-57-52.png

导入工程,使用Pom.xml组织文件

  • 将下载的源码包解压,并使用idea打开项目,在根目录下创建pom.xml文件,用来管理依赖;
  • pom.xml文件内容:
<?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>Tomcat8.0</artifactId>
    <name>Tomcat8.0</name>
    <version>8.0</version>

    <build>
        <finalName>Tomcat8.0</finalName>
        <sourceDirectory>java</sourceDirectory>
        <testSourceDirectory>test</testSourceDirectory>
        <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>2.3</version>
                <configuration>
                    <encoding>UTF-8</encoding>
                    <source>1.8</source>
                    <target>1.8</target>
                </configuration>
            </plugin>
        </plugins>
    </build>

    <dependencies>
        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>4.12</version>
            <scope>test</scope>
        </dependency>
        <dependency>
            <groupId>org.easymock</groupId>
            <artifactId>easymock</artifactId>
            <version>3.4</version>
        </dependency>
        <dependency>
            <groupId>ant</groupId>
            <artifactId>ant</artifactId>
            <version>1.7.0</version>
        </dependency>
        <dependency>
            <groupId>wsdl4j</groupId>
            <artifactId>wsdl4j</artifactId>
            <version>1.6.2</version>
        </dependency>
        <dependency>
            <groupId>javax.xml</groupId>
            <artifactId>jaxrpc</artifactId>
            <version>1.1</version>
        </dependency>
        <dependency>
            <groupId>org.eclipse.jdt.core.compiler</groupId>
            <artifactId>ecj</artifactId>
            <version>4.5.1</version>
        </dependency>
    </dependencies>
</project>
  • 在idea的maven工具中使用刚才创建的pom.xml添加maven项目;
2020-07-30_08-03-50.png

注释Tomcat测试代码

  • 到目前为止我们试着来启动一下Tomcat,对了,Tomcat的启动类在这个包下:.\apache-tomcat-8.5.57-src\java\org\apache\catalina\startup\Bootstrap.java;
  • 一启动发现,报错了:
2020-07-30_08-15-10.png
  • 我们打开错误提示中的TestCookieFilter这个类,发现只是一个Test类,测试代码与Tomcat本身的启动没有太大关系,因此我们就注释了它;
2020-07-30_08-17-39.png

设置Tomcat版本

  • 我们再次尝试启动Tomcat,发现又报了一个错:

2020-07-30_08-20-11.png
  • 它说我们的.\apache-tomcat-8.5.57-src\modules\jdbc-pool\resources\MANIFEST.MF文件下的Bundle-Version属性的值不符合我们的正则表达式;
  • 打开这个文件,Bundle-Version属性当前的值是:@VERSION@,我们把它改成8;
2020-07-30_08-10-15.png

配置JVM参数

  • 再次尝试启动Tomcat,发现又报了一个错:

2020-07-30_08-35-05.png
  • 这个错误就不是特别显然了;不过后来发现,使用catalina.sh脚本启动Tomcat其实是没有问题的,于是,就从脚本文件入手,寻找一些蛛丝马迹;
2020-07-30_08-29-20.png
  • 发现很多启动参数,Tomcat在启动的时候,通过脚本文件启动的Tomcat主函数,但是会带很多参数过去;因此我们也同样设置一下参数:
2020-07-30_08-32-15.png
  • 参数具体内容如下:目录记得替换成自己的;
-Dcatalina.home=D:\system_data\idea_project\demo\apache-tomcat-8.5.57-src
-Dcatalina.base=D:\system_data\idea_project\demo\apache-tomcat-8.5.57-src
-Djava.endorsed.dirs=D:\system_data\idea_project\demo\apache-tomcat-8.5.57-src\endorsed
-Djava.io.tmpdir=D:\system_data\idea_project\demo\apache-tomcat-8.5.57-src\temp
-Djava.util.logging.manager=org.apache.juli.ClassLoaderLogManager
-Djava.util.logging.config.file=D:\system_data\idea_project\demo\apache-tomcat-8.5.57-src\conf\logging.properties
  • 配置完参数后,再次尝试启动Tomcat,发现,完美,成功启动;但是这时候如果你发现控制台有乱码,作为一个完美主义者的你,一定是不能接受的;这是因为Tomcat做了国际化,但是中文却使用的不是GBK也不是UTF-8,我尝试过在配置文件中配置成 GBK或者UTF-8,但是都没有起作用,最后我直接配置成了英文,这才不乱码了,具体参数如下:
-Duser.language=en
  • 然后打开localhost:8080,并没有看到我们熟悉的页面,而是一个500服务器错误的页面,继续解决吧;

添加初始化JSP解析器代码

  • 这个问题,我们需要在这个路径下的文件:.\apache-tomcat-8.5.57-src\java\org\apache\catalina\startup\ContextConfig.java 添加一句JSP解析器的初始化代码;
2020-07-30_08-41-39.png
context.addServletContainerInitializer(new JasperInitializer(), null);
  • 重启Tomcat,打开localhost:8080,终于看到了我们熟悉的页面:
2020-07-30_08-42-54.png
  • 至此,Tomcat加载源码到启动的过程就算完成了,可以去分析Tomcat各个组件原理了!

注意:本文归作者所有,未经作者允许,不得转载

Logo

权威|前沿|技术|干货|国内首个API全生命周期开发者社区

更多推荐