前不久,公司的项目正在从基于OSGI的karaf框架切换到tomcat平台,借此机会,想研究一下tomcat源码,对应用底层的运行机制进一步理解,提升自己的能力。
Tomcat源码下载
点击左侧Download下面的最新版本 Tomcat 9,可以看到tomcat分为Binary Distributions与Source Code Distributions两种发行方式,这里选择Source Code Distributions源码发行版。
下载,解压。
jdk、maven安装以及本地环境变量的配置,网上很多。
Tomcat源码导入
当然是使用最好用的IDEA了。tomcat使用的Ant软件构件工具,我们使用更熟悉的maven工具。maven工程必须要有一个pom.xml,这是定义项目所依赖的jar包。
tomcat依赖哪些jar包呢?其实这个pom.xml网上也有很多,但是里面定义的依赖的jar版本号有可能与你下载的tomcat版本不匹配。
build.properties.default这个文件是tomcat源码中的,这里面定义了你所下载的tomcat版本所对应的依赖的jar包版本。你可以与pom文件中的jar版本作比较,替换成此文件中的版本号。
tomcat 9的最新版本中,我在对比的时候,发现有个jar的版本比较高,并且在maven的远程仓库中找不到此版本的jar包。
下面是build.properties.default中定义的jdt的version是4.13,此版本的jar并不在maven的远程仓库中。1
2
3
4
5
6
7
8
9
10jdt.version=4.13
jdt.release=R-4.13-201909161045/
jdt.checksum.enabled=true
jdt.checksum.algorithm=SHA-512
jdt.checksum.value=d608e4b7fc9b061e327ad5c39112c032e310a48c57ddd01c9349f2be8f5ce4d3d0c3862b6b5cc105220a06a6dd62c477de654b9fbe6f4c8a3d3de816e5de19f7
jdt.home=${base.path}/ecj-${jdt.version}
jdt.jar=${jdt.home}/ecj-${jdt.version}.jar
# The download will be moved to the archive area eventually. We are taking care of that in advance.
jdt.loc.1=http://archive.eclipse.org/eclipse/downloads/drops4/${jdt.release}/ecj-${jdt.version}.jar
jdt.loc.2=http://download.eclipse.org/eclipse/downloads/drops4/${jdt.release}/ecj-${jdt.version}.jar
所以当我们定义下面的依赖时,找不到此jar包。1
2
3
4
5<dependency>
<groupId>org.eclipse.jdt.core.compiler</groupId>
<artifactId>ecj</artifactId>
<version>4.13</version>
</dependency>
我尝试过去build.properties.default定义的jdt的地址把4.13版本的jar下载下来,放到我的本地仓库中,但是没生效,原因网上有很多,这里不做追究。之后发现公司所用的tomcat的版本是tomcat7,于是,重新下载tomcat7的源码,按照上面所说的maven方式,搞定pom.xml,之后将此maven工程导入到IDEA中。
找到Bootstrap.java,运行。
总结
相信你在上面的过程中会有很多问题,但是你已经开始了,这不就是一个最大的进步么。当你一步步去解决问题,难道不是会有更多的收获么?问题总会水落石出,万事开头难,贵在坚持。