Tomcat源码阅读(一):IDEA导入tomcat9

    技术2022-07-11  119

    下载地址:https://mirror.bit.edu.cn/apache/tomcat/tomcat-9/v9.0.36/src/apache-tomcat-9.0.36-src.tar.gz

    解压后,创建home文件夹,将webapps以及conf目录移至home目录下。

    使用idea打开,并在根目录下创建pom.xml文件(tomcat原来是使用ant构建的,现改为maven构建)

    <?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>tomcat</artifactId> <name>tomcat</name> <version>9.0.19</version> <dependencies> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>4.12</version> <scope>test</scope> </dependency> <dependency> <groupId>org.apache.ant</groupId> <artifactId>ant</artifactId> <version>1.10.5</version> </dependency> <dependency> <groupId>wsdl4j</groupId> <artifactId>wsdl4j</artifactId> <version>1.6.3</version> </dependency> <dependency> <groupId>org.apache.geronimo.specs</groupId> <artifactId>geronimo-jaxrpc_1.1_spec</artifactId> <version>2.1</version> </dependency> <dependency> <groupId>org.eclipse.jdt</groupId> <artifactId>ecj</artifactId> <version>3.22.0</version> </dependency> <dependency> <groupId>org.easymock</groupId> <artifactId>easymock</artifactId> <version>4.0.2</version> <scope>test</scope> </dependency> </dependencies> <build> <plugins> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-compiler-plugin</artifactId> <configuration> <source>1.8</source> <target>1.8</target> <encoding>UTF-8</encoding> </configuration> </plugin> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-resources-plugin</artifactId> <configuration> <encoding>UTF-8</encoding> </configuration> </plugin> </plugins> </build> </project>

     

    进入模块设置,分别设置源码和测试代码。

    找到org.apache.catalina.startup.Bootstrap类,运行该类的main方法。

    提示如上图所示两个报错,将/home/webapps/examples/WEB-INF/class/trailers复制到test目录下。

    将/home/webapps/examples/WEB-INF/class/util/CookieFilter.java复制到test/util包下。

    设置VM Option参数-Dcatalina.home=~/project/apache-tomcat-9.0.36-src/home(指向刚创建的home目录)。如下图所示:

    重新编译运行,出现如下图所示报错:

    删除home/webapps/examples目录,估计是依赖冲突导致的(tomcat类加载机制会对应用的类和通用类分别使用不同的类加载器加载)。

    再次运行,运行成功,但是访问http://localhost:8080报错,如下图所示:

    找到org.apache.catalina.startup.ContextConfig#configureStart该方法,在该方法中添加如下代码

    context.addServletContainerInitializer(new JasperInitializer(), null);

    再次运行访问成功

    Processed: 0.009, SQL: 9