在之前的《servlet与tomcat运行示例》一文中,给大家带来如何在tomcat中部署servlet应用的相关步骤,本文将就上文为基础,开始tomcat源码分析之旅,我将详细的分析tomcat的启动过程及运行原理。本文将是最基础的一节课,也就是本地编译好tomcat源码,为后面的分析做基础!
我们去tomcat官网下载最新的tomcat源码包,目前最新的版本为9.0.26,我们下载其source源码包tar.gz版本,如下图:
解压源码包apache-tomcat-9.0.26-src.tar.gz之后得到的内容为:
因为要使用maven的方式导入tomcat项目,故需要添加相应的maven依赖,此处添加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>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>
使用idea开发工具,以maven的方式导入tomcat工程,导入之后工程结构如下:
运行org.apache.catalina.startup
包下的bootstrap类的main方法
此时,我们发现了一些错误,下面我们来解决这些错误。
我们可以去webapps/examples/web_inf/classes/trailers
目录下找到该类,我们将这个类复制一份到test下:
拷贝完成之后的情况如下:
同样,我们去将home\webapps\examples\web-inf\classes\util\cookiefilter.java
文件拷贝到 test\util
目录下:
在解决上述3.1和3.2的问题之后,又出现了下图所示的问题:
/library/apachetomcat/source/test/apache-tomcat-9.0.26-src
,故而添加参数内容为:-dcatalina.home=/library/apachetomcat/source/test/apache-tomcat-9.0.26-src
, 如下图所示:在解决上述3.3问题之后,再次启动bootstrap类的main方法,程序出现以下错误信息:
在解决上述问题之后,启动bootstrap类的main方法,程序正常启动,此时我们在浏览器访问127.0.0.1:8080
, 程序出现以下错误信息:
context.addservletcontainerinitializer(new jasperinitializer(), null);
添加之后,再次启动main方法,浏览器输入127.0.0.1:8080得到的结果为tomcat的界面:
启动的日志中含有很多的乱码,虽然对程序整体并不影响,但是在之后查看日志时,还是影响比较大的,先看下日志乱码的情况:
-duser.language=en -duser.region=us -dfile.encoding=utf-8
再次运行main方法,程序日志正常显示:
至此,我们已经将tomcat的源码导入到idea的工具中,也解决了一些问题,之后,我们将利用这份源码来分析tomcat的启动及运行原理。
如对本文有疑问, 点击进行留言回复!!
[杭电多校2020]第一场 1004 Distinct Sub-palindromes
Swift -- 将本地生成的UIImage进行持久化保存(存到文件中fileManager.createFile)
网友评论