1、源碼下載:http://archive.apache.org/dist/tomcat/tomcat-9/v9.0.33/src/
2、創建空項目:apache-tomcat
3、進入項目文件夾apache-tomcat解壓源碼包apache-tomcat-9.0.33-src.zip得到apache-tomcat-9.0.33-src文件夾
4、進入apache-tomcat-9.0.33-src文件夾,並創建一個目錄,命名為home,並將conf、webapps目錄移入home 目錄中
5、在apache-tomcat-9.0.33-src文件夾下創建pom.xml文件,內容如下:

1 <?xml version="1.0" encoding="UTF-8"?> 2 <project xmlns="http://maven.apache.org/POM/4.0.0" 3 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 4 xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> 5 6 <modelVersion>4.0.0</modelVersion> 7 <groupId>org.apache.tomcat</groupId> 8 <artifactId>apache‐tomcat‐9.0.33‐src</artifactId> 9 <name>Tomcat9.0</name> 10 <version>9.0</version> 11 12 <build> 13 <finalName>Tomcat9.0</finalName> 14 <sourceDirectory>java</sourceDirectory> 15 <!-- <testSourceDirectory>test</testSourceDirectory>--> 16 <resources> 17 <resource> 18 <directory>java</directory> 19 </resource> 20 </resources> 21 22 <!-- <testResources> 23 <testResource> 24 <directory>test</directory> 25 </testResource> 26 </testResources>--> 27 <plugins> 28 <plugin> 29 <groupId>org.apache.maven.plugins</groupId> 30 <artifactId>maven-compiler-plugin</artifactId> 31 <version>3.5.1</version> 32 <configuration> 33 <encoding>UTF‐8</encoding> 34 <source>1.8</source> 35 <target>1.8</target> 36 </configuration> 37 </plugin> 38 </plugins> 39 </build> 40 <dependencies> 41 <dependency> 42 <groupId>junit</groupId> 43 <artifactId>junit</artifactId> 44 <version>4.12</version> 45 <scope>test</scope> 46 </dependency> 47 <dependency> 48 <groupId>org.easymock</groupId> 49 <artifactId>easymock</artifactId> 50 <version>3.4</version> 51 </dependency> 52 <dependency> 53 <groupId>ant</groupId> 54 <artifactId>ant</artifactId> 55 <version>1.7.0</version> 56 </dependency> 57 <dependency> 58 <groupId>wsdl4j</groupId> 59 <artifactId>wsdl4j</artifactId> 60 <version>1.6.2</version> 61 </dependency> 62 <dependency> 63 <groupId>javax.xml</groupId> 64 <artifactId>jaxrpc</artifactId> 65 <version>1.1</version> 66 </dependency> 67 <dependency> 68 <groupId>org.eclipse.jdt.core.compiler</groupId> 69 <artifactId>ecj</artifactId> 70 <version>4.5.1</version> 71 </dependency> 72 </dependencies> 73 </project>
6.進入IDEA導入找到之前創建項目的目錄 點擊apache-tomcat-9.0.33-src目錄下的pom.xml文件,進行導入
7.找到啟動類Bootstrap,在 java/org/apache/catalina/startup下
8.配置啟動類 Edit Configurations 進行配置啟動類 並設置VM參數
1. 選擇 + Application
2. 啟動類名設置
3. Main class選擇 一直選擇到Bootstrap類
4. VM options設置 (更改以下1、3、4為你本機項目文件的位置)
-Dcatalina.home=F:/IDEA_WorkSpace/apache-tomcat/apache-tomcat-9.0.33-src/home
-Dcatalina.base=F:/IDEA_WorkSpace/apache-tomcat/apache-tomcat-9.0.33-src/home
-Djava.util.logging.manager=org.apache.juli.ClassLoaderLogManager
-Djava.util.logging.config.file=F:/IDEA_WorkSpace/apache-tomcat/apache-tomcat-9.0.33-src/home/conf/logging.properties
9、編譯項目,可能會報錯
Error:(320, 45) java: 找不到符號
符號: 變量 VERSION_9 、10、11、12
位置: 類 org.eclipse.jdt.internal.compiler.impl.CompilerOptions
統一將錯誤改為VERSION_1_8即可 (或者改為你項目的JDK版本 )
10、啟動時為何控制台會有亂碼:
原因:一般是中文編碼不匹配導致;經跟蹤,發現是ResourceBundle讀取org\apache\catalina\startup\LocalStrings_zh_CN.properties文件時沒有用utf8解碼導致;
解決:修改org.apache.tomcat.util.res.StringManager類中的getString函數;
由
if (bundle != null) {
str = bundle.getString(key);
}
改為
if (bundle != null) {
str = new String(bundle.getString(key).getBytes(“ISO-8859-1”), “UTF-8”);
}
再次運行,控制台無亂碼.
11.訪問頁面,但是報500錯誤
原因:是我們直接啟動org.apache.catalina.startup.Bootstrap的時候沒有加載JasperInitializer,從而無法編譯JSP。
解決辦法是在tomcat的源碼ContextConfig中的configureStart函數中手動將JSP解析器初始化.
解決:找到 java/org/apache/catalina/startup下 ContextConfig 這個類
在configureStart()方法的webConfig(); (代碼775行)下面加上
context.addServletContainerInitializer(new JasperInitializer(), null);
12.再次訪問 ,成功