我们去Tomcat官网下载最新的Tomcat源码包,目前最新的版本为9.0.26,我们下载其source源码包tar.gz版本,如下图:

2.2 解压源码包apache-tomcat-9.0.26-src.tar.gz

解压源码包apache-tomcat-9.0.26-src.tar.gz之后得到的内容为:

jspthrewexception一文深刻懂得Tomcat道理阿里高等技巧专家带你玩转Tomcat AJAX

2.3 解压后的文件夹中添加pom.xml

由于要利用Maven的办法导入Tomcat项目,故须要添加相应的maven依赖,此处添加pom.xml文件,该文件内容如下:

&lt;?xml version=\公众1.0\"大众 encoding=\"大众UTF-8\"大众?&gt;<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>com.github.sources</groupId> <artifactId>source-tomcat</artifactId> <version>9.0.26</version> <name>source-tomcat</name> <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.5.1</version> </dependency> <dependency> <groupId>org.apache.ant</groupId> <artifactId>ant</artifactId> <version>1.10.1</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</groupId> <artifactId>org.eclipse.jdt.core</artifactId> <version>3.18.0</version> </dependency> <dependency> <groupId>org.eclipse.jdt.core.compiler</groupId> <artifactId>ecj</artifactId> <version>4.6.1</version> </dependency> </dependencies> <build> <finalName>Tomcat9.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>3.6.1</version> <configuration> <encoding>UTF-8</encoding> <source>1.8</source> <target>1.8</target> </configuration> </plugin> </plugins> </build></project>

2.4 IDEA导入tomcat源码工程

利用IDEA开拓工具,以Maven的办法导入tomcat工程,导入之后工程构造如下:

2.5 启动Tomcat工程

运行org.apache.catalina.startup包下的Bootstrap类的main方法

此时,我们创造了一些缺点,下面我们来办理这些缺点。

3 非常问题办理

3.1 trailers.ResponseTrailers不存在

我们可以去webapps/examples/WEB_INF/classes/trailers 目录下找到该类,我们将这个类复制一份到test下:

拷贝完成之后的情形如下:

3.2 CookieFilter不存在

同样,我们去将home\webapps\examples\WEB-INF\classes\util\CookieFilter.java 文件拷贝到 test\util 目录下:

3.3 FileNotFoundException: /Library/ApacheTomcat/source/test/source-tomcat/conf/server.xml (No such file or directory)

在办理上述3.1和3.2的问题之后,又涌现了下图所示的问题:

办理方案: 在启动的配置中,添加VM options的参数,添加项目路径,本机为/Library/ApacheTomcat/source/test/apache-tomcat-9.0.26-src,故而添加参数内容为: -Dcatalina.home=/Library/ApacheTomcat/source/test/apache-tomcat-9.0.26-src, 如下图所示:

3.4 java.lang.ClassNotFoundException: listeners.ContextListener

在办理上述3.3问题之后,再次启动Bootstrap类的main方法,程序涌现以下缺点信息:

办理方案: 删除 webapps 下的 examples 文件夹!
程序再次运行不报此缺点!

3.5 Servlet.service() for servlet [jsp] in context with path [] threw exception [org.apache.jasper.JasperException: Unable to compile class for JSP] with root cause

在办理上述问题之后,启动Bootstrap类的main方法,程序正常启动,此时我们在浏览器访问127.0.0.1:8080, 程序涌现以下缺点信息:

办理方案:编辑 org.apache.catalina.startup.ContextConfig 文件的 configureStart() 方法,添加初始化 JSP 解析器的代码

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

添加之后,再次启动main方法,浏览器输入127.0.0.1:8080得到的结果为Tomcat的界面:

3.6 日志乱码

启动的日志中含有很多的乱码,虽然对程序整体并不影响,但是在之后查看日志时,还是影响比较大的,先看下日志乱码的情形:

办理方案: 修正vm options 内容,将环境设置为美国-英文,设置内容如下:

-Duser.language=en -Duser.region=US -Dfile.encoding=UTF-8

再次运行main方法,程序日志正常显示:

至此,我们已经将Tomcat的源码导入到IDEA的工具中,也办理了一些问题,之后,我们将利用这份源码来剖析Tomcat的启动及运行事理。