【Tomcat9原始碼分析】原始碼下載、編譯與除錯
一、環境
以下是我編譯Tomcat所採用的環境
- OS X Yosemite Version 10.10.5
- Intellij IDEA 2017.1
- Java version 1.8.0_65
- Apache Maven 3.3.9
- Tomcat 9.0.0.M21
(1)JDK1.8
Tomcat9至少需要jdk1.8版本,網上有很多java安裝的教程。
(2)Tomcat原始碼
訪問Tomcat下載地址,最底部的tar包或zip包原始碼
(3)Maven3.0+
Tomcat預設是採用ant來編譯的,若你想用官方的方法編譯tomcat,可訪問官網how to build tomcat。筆者之前一直用maven作為管理工具,所以上網找了些資料,自己整理了用maven編譯tomcat的方法。
二、準備pom.xml檔案
解壓tomcat原始碼到/yourpath/tomcat9
,如下圖
在/yourpath/tomcat9
目錄下新增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>cn.linxdcn</groupId>
<artifactId>Tomcat9.0</artifactId>
<name>Tomcat9</name>
<version>9.0</version>
<build>
<finalName>Tomcat9</finalName>
<sourceDirectory >java</sourceDirectory>
<resources>
<resource>
<directory>java</directory>
</resource>
</resources>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>2.3</version>
<configuration>
<encoding>UTF-8</encoding>
<source>1.8</source>
<target>1.8</target>
</configuration>
</plugin>
</plugins>
</build>
<dependencies>
<dependency>
<groupId>org.apache.ant</groupId>
<artifactId>ant</artifactId>
<version>1.9.5</version>
</dependency>
<dependency>
<groupId>org.apache.ant</groupId>
<artifactId>ant-apache-log4j</artifactId>
<version>1.9.5</version>
</dependency>
<dependency>
<groupId>org.apache.ant</groupId>
<artifactId>ant-commons-logging</artifactId>
<version>1.9.5</version>
</dependency>
<dependency>
<groupId>javax.xml.rpc</groupId>
<artifactId>javax.xml.rpc-api</artifactId>
<version>1.1</version>
</dependency>
<dependency>
<groupId>wsdl4j</groupId>
<artifactId>wsdl4j</artifactId>
<version>1.6.2</version>
</dependency>
<dependency>
<groupId>org.eclipse.jdt.core.compiler</groupId>
<artifactId>ecj</artifactId>
<version>4.4</version>
</dependency>
</dependencies>
</project>
三、匯入Intellij IDEA
(1)匯入maven工程
開啟Intellij IDEA,選擇Import Project
,在彈出框中選擇/yourpath/tomcat9/pom.xml
,一直next
直到finish
(2)修改JDK版本
選單欄file
->Project Strucuture
->Project
->Project SDK
,確實是否為JDK 1.8
(3)設定啟動項
選單欄run
->Edit Configurations
,左上角的+號,然後選擇Application
- Name:可隨意起,如
tomcat_9_run
- Main Class:選擇
org.apache.catalina.startup.Bootstrap
- VM options:填寫
-Dcatalina.home="/yourpath/tomcat9"
(4)刪除webapps內容
把/yourpath/tomcat9/webapps
資料夾下的內容情況,新建一個demo
資料夾,以及在demo
資料夾下新建index.html
檔案,如下,作為測試例子
<p>Hello! This is my tomcat 9</p>
ps:這裡解釋下為什麼把webapps裡的內容全部刪除掉,因為我用maven構建有一些類的依賴還沒解決,所以tomcat自帶的例子一些配置類載入不了,後面會導致出錯。作為學習這影響不大,後續有空再解決這個問題。
四、更改原始碼
Tomcat9中有部分程式碼使用CompilerOptions.VERSION_1_9
來判斷java虛擬機器版本,裡面涉及1.9版本的jvm,我機器上識別不了。
在java/org/apache/jasper/compiler/JDTCompiler.java
類中把上述程式碼找出,刪除即可,總共有3處。
五、編譯
在Intellij IDEA中,右邊Maven Project
->Lifecycle
->compile
進行編譯。
看見如下輸出資訊,即表示編譯成功。
[INFO] Scanning for projects...
[INFO]
[INFO] ------------------------------------------------------------------------
[INFO] Building Tomcat9 9.0
[INFO] ------------------------------------------------------------------------
[INFO]
[INFO] --- maven-resources-plugin:2.6:resources (default-resources) @ Tomcat9.0 ---
[WARNING] Using platform encoding (UTF-8 actually) to copy filtered resources, i.e. build is platform dependent!
[INFO] Copying 1851 resources
[INFO]
[INFO] --- maven-compiler-plugin:2.3:compile (default-compile) @ Tomcat9.0 ---
[INFO] Compiling 1589 source files to /Users/linxiaodong/LXD/source-code-analysis/tomcat9/target/classes
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
[INFO] Total time: 17.299 s
[INFO] Finished at: 2017-05-30T22:02:39+08:00
[INFO] Final Memory: 24M/666M
[INFO] ------------------------------------------------------------------------
Process finished with exit code 0
六、執行
在Intellij IDEA中執行Tomat程式,在瀏覽器中輸入
localhost:8080/demo
即可看見你新建的index.html
網頁。