1. Tomcat源码下载
http://tomcat.apache.org/download-90.cgi
2. IDEA导入源码
导入后入下图:
2.1 导入架包
Tomcat源码下下来后会少了几个架包,代码是会报错的:ant-1.6.5.jar、easymock-3.4.jar、jaxrpc-api-1.1.jar、ecj-4.6.1.jar、wsdl4j-1.6.2.jar、objenesis-2.2.jar、hamcrest-core-1.3.jar,可以手动下载这些架包,也可以通过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>org.apache.tomcat</groupId> <artifactId>tomcat9</artifactId> <name>tomcat9</name> <version>9.0</version> <build> <finalName>apache-tomcat-9.0.0.M26-src</finalName> <sourceDirectory>java</sourceDirectory> <!--<testSourceDirectory>test</testSourceDirectory> test 下的有些文件报错,因此将test文件夹去掉了--> <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.5.1</version> <configuration> <encoding>UTF-8</encoding> <source>1.8</source> <target>1.8</target> </configuration> </plugin> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-jar-plugin</artifactId> <version>2.6</version> </plugin> </plugins> </build> <dependencies> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>4.11</version> <scope>test</scope> </dependency> <dependency> <groupId>ant</groupId> <artifactId>ant</artifactId> <version>1.6.5</version> </dependency> <dependency> <groupId>org.easymock</groupId> <artifactId>easymock</artifactId> <version>3.4</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.6.1</version> </dependency> </dependencies> </project>
2.2 引入tomcat其他模块的架包:
从其他安装版本的tomcat里拷贝lib文件夹放到tomcat的根目录。
2.3 删除webapps里没有用的应用
2.4 删除其他module
3. 运行启动
源码启动Tomcat,是启动Bootstrap的main方法,其实startup.bat或者startup.sh也是启动Bootstrap的main方法。
3.1 配置Bootstrap
VM options配置如下:
-Dcatalina.home=D:\MyJob\Project\Maven\apache-tomcat-9.0.0.M26-src
-Dcatalina.base=D:\MyJob\Project\Maven\apache-tomcat-9.0.0.M26-src
-Djava.endorsed.dirs=D:\MyJob\Project\Maven\apache-tomcat-9.0.0.M26-src\endorsed
-Djava.io.tmpdir=D:\MyJob\Project\Maven\apache-tomcat-9.0.0.M26-src\temp
-Djava.util.logging.manager=org.apache.juli.ClassLoaderLogManager
-Djava.util.logging.config.file=D:\MyJob\Project\Maven\apache-tomcat-9.0.0.M26-src\conf\logging.properties
3.2 启动Bootstrap
出现Server startup in 3040 ms,就是启动成功
3.3 浏览器访问tomcat
http://locathost:8080如下图,表示启动成功:
4. 问题和解决方法
可能会碰到一下一些问题,没关系,碰到问题一个个解决。
4.1 问题一:module cycles:
报错如下:
原因:是在引入源码的时候没有去掉一些没有用到的module导致module循环引用了。
解决:Analyze->Analyze module Denpendencies如下图:
可以看到apache-tomcat-9.0.0.M26-src里引用到WEB-INF这个module,WEB-INF里又引用了apache-tomcat-9.0.0.M26-src,只要删除WEB-INF这个module就行了。
打开Project Structure->Modules,删除WEB-INF,我一般是把除了apache-tomcat-9.0.0.M26-src的module都删了以免出现其他问题,暂时其他都用不到,如下图:
4.2 问题二:jdbc-pool模块配置MANIFEST.MF文件报错
报错如下:
解决:不知道为啥下载下来的文件就有问题,这块反正也没用到,就直接删了。
4.3 问题三:lib文件夹缺失
解决:增加lib目录,从安装版的tomcat文件夹里考一份lib过来(里边的架包要一起考来)。
4.4 问题四:Tomcat启动失败
问题:examples应用下找不到监听的类
原因:看了下目录,classes里居然都是java类,没有编译
解决:这个应用没啥用,直接删了只留下ROOT文件夹就好。