Apache Tomcat 源碼分析環境搭建

Apache Tomcat®軟件是Java Servlet、JavaServer頁面、Java 語言表達式和 Java WebSocket 技術的開源實現。Java Servlet、JavaServer頁面、Java 表達式語言和 Java WebSocket 規範都是在 Java 社區進程下開發的。

Apache Tomcat 軟件是在開放和參與的環境中開發的,並在 Apache 許可版本 2 下發布。Apache Tomcat 項目旨在成爲世界各地最優秀的開發人員的協作項目。我們邀請您參與這個開放的開發項目。要了解更多關於參與的信息,請點擊這裏

Apache Tomcat 做爲標準的 Java Servlet 規範的標準實現。在 Java 企業級開發中,很多企業都是基於 Tomcat 來發布應用,尤其是 Spring Boot 默認內置 Tomcat 做爲 Servlet 容器。我們有必要去學習 Tomcat 源碼,這樣我們可以更好的使用並且優化 Tomat。下面就來分享一下 Tomcat 源碼分析的環境搭建。

1、下載 Tomcat 源碼

Apache Tomcat 官方網站 下載 Tomcat 源碼,博主使用的是 8.5.54 版本,可以在官網的右邊導航欄 Download 選擇 Tomcat 8

在這裏插入圖片描述
由於博主使用的是 Mac 操作系統所以下載的是 tar.gz 格式的文件。如果使用 window 操作系統,可以下載 zip 格式的文件.

解析源碼壓縮包,可以得到源碼項目 apache-tomcat-8.5.54-src

2、添加 pom.xml

Tomcat 的依賴管理是使用的 ant,但是現在企業基本上都使用 maven 進行項目的依賴管理。

進入apache-tomcat-8.5.54-src 目錄,創建一個 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>apache-tomcat-8.5.53-src</artifactId>
    <name>Tomcat8.5</name>
    <version>8.5</version>

    <build>
        <!--指定源目錄-->
        <finalName>Tomcat8.5</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>3.1</version>
                <configuration>
                    <encoding>UTF-8</encoding>
                    <source>8</source>
                    <target>8</target>
                </configuration>
            </plugin>
        </plugins>
    </build>

    <!--Tomcat是java開發的,封裝了很多功能,它需要依賴一些基礎的jar包-->
    <dependencies>
        <!--遠程過程調用工具包-->
        <dependency>
            <groupId>javax.xml</groupId>
            <artifactId>jaxrpc</artifactId>
            <version>1.1</version>
        </dependency>
        <!--soap協議處理工具包-->
        <dependency>
            <groupId>javax.xml.soap</groupId>
            <artifactId>javax.xml.soap-api</artifactId>
            <version>1.4.0</version>
        </dependency>
        <!--解析webservice的wsdl文件工具-->
        <dependency>
            <groupId>wsdl4j</groupId>
            <artifactId>wsdl4j</artifactId>
            <version>1.6.2</version>
        </dependency>
        <!--Eclipse Java編譯器-->
        <dependency>
            <groupId>org.eclipse.jdt.core.compiler</groupId>
            <artifactId>ecj</artifactId>
            <version>4.5.1</version>
        </dependency>
        <!--ant管理工具-->
        <dependency>
            <groupId>ant</groupId>
            <artifactId>ant</artifactId>
            <version>1.7.0</version>
        </dependency>
        <!---easymock輔助單元測試-->
        <dependency>
            <groupId>org.easymock</groupId>
            <artifactId>easymock</artifactId>
            <version>3.4</version>
        </dependency>
    </dependencies>
</project>

3、創建配置文件 source

Tomcat 本身就是 Java 開發郵的一款軟件。我們在直接使用 Tomcat 的時候,Tomcat 需要讀取 server.xml 以及其它配置文件,同時還需要找到它要去部署的工程項目。使用源碼方式,依賴是如此的。
在這裏插入圖片描述
所以我們在啓動源碼進行調試時,需要在通過指定虛擬機參數把項目配置文件傳遞進去。

apache-tomcat-8.5.54-src 目錄下的 conf 和 webapps 目錄移動到剛剛創建的 source 目錄當中。

4、Idea 導入 Tomcat 源碼

下面就需要把 Tomcat 源碼導入到 Idea 當中。

在這裏插入圖片描述
剛開始導入的時候,pom.xml 中依賴的有些 Jar 包還沒有下載,就會出現依賴問題。就需要執行 mvn clean install 編譯下載 pom.xml 中依賴的 Jar 包。

5、啓動 Tomcat

Tomcat 的入口類是 org.apache.catalina.startup.Bootstrap ,接着就是啓動這個入口類。當然爲了正常啓動還需要添加以下啓動參數。

-Dcatalina.home=/Users/carl/projects/idea/learn/apache-tomcat-8.5.54-src/source
-Dcatalina.base=/Users/carl/projects/idea/learn/apache-tomcat-8.5.54-src/source
-Djava.util.logging.manager=org.apache.juli.ClassLoaderLogManager
-Djava.util.logging.config.file=/Users/carl/projects/idea/learn/apache-tomcat-8.5.54-src/source/conf/logging.properties

也就是:

在這裏插入圖片描述

6、Q & A

6.1 控制檯亂碼

Tomcat 裏面是實現了 i18n 也就是國際化的,所以在啓動的時候會出現亂碼問題。雖然 Tomcat 的中文國際化文件的編碼格式是 utf-8,但是 Java 國際化 ResourceBundle 在讀取的時候默認使用的是 ISO-8859-1而且處理類還不能夠傳入編碼。
在這裏插入圖片描述
所以在處理 Tomcat 啓動亂碼時需要修改以下兩點:

第一個修改點

org.apache.tomcat.util.res.StringManager#getString(java.lang.String)

# @位置:org.apache.tomcat.util.res.StringManager
# @方法 getString()
# @Line:130行
str = bundle.getString(key)
替換成下面代碼:
str = new String(bundle.getString(key).getBytes("ISO-8859-1"), "UTF8");

第二個修改點:

org.apache.jasper.servlet.TldScanner#scanJars

log.info(Localizer.getMessage("jsp.tldCache.noTldSummary"));
替換成下面代碼:
String message = Localizer.getMessage("jsp.tldCache.noTldSummary");
String logger = new String(message.getBytes("ISO-8859-1"), "UTF8");
log.info(logger);

以下就是修改代碼後的控制檯打印日誌:

在這裏插入圖片描述

6.2 訪問 Tomcat 500

當啓動 Tomcat 成功之後訪問 localhost:8080時,會出現 500 異常。
在這裏插入圖片描述
原因是 Tomcat 源碼中 JSP 引擎 jasper 沒有被初始化,從而無法編譯處理 JSP(因爲 JSP 是需要被轉換成 Servlet 進一步編譯處理的)。我們只需要在 Tomcat 的源碼 ContextConfig 類中的 configureStart 方法中增加一行代碼將 JSP 引擎初始化,如下:

ContextConfig#configureStart

 // 讀取 Web 項目配置 (web.xml 配置)
 webConfig();


 // 初始化 jsp 引擎 (下面是添加的代碼)
 context.addServletContainerInitializer(new JasperInitializer(), null);

然後就可以正常訪問了。
在這裏插入圖片描述

6.3 訪問 Tomcat 提供的 Examples 報 404

訪問 ${tomcat.project}/source/webapps/examples 提供的 Examples 。
在這裏插入圖片描述
會報 404 異常:

在這裏插入圖片描述
解決辦法:
${tomcat.project}/source/webapps/examples/WEB-INF/classes 右擊 Mark Directory as sources Root

在這裏插入圖片描述
標記之後圖標會從灰色變成藍色,接着就重啓 Tomcat 源碼。然後就可以正常的訪問 localhost:8080/examples
在這裏插入圖片描述

參考文章:

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章