1. 程式人生 > >【Tomcat9原始碼分析】原始碼下載、編譯與除錯

【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網頁。