idea匯入tomcat8原始碼搭建原始碼偵錯環境

2023-02-28 12:01:35

從apache tomcat下載tomcat8原始碼

1.下載到原始碼後,tomcat預設使用ant作為包管理工具,本地偵錯時建立pom.xml, 手動建立一個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>Tomcat8.0</artifactId>    
    <name>Tomcat8.0</name>    
    <version>8.0</version>    
    
    <build>    
        <finalName>Tomcat8.0</finalName>    
        <sourceDirectory>java</sourceDirectory>    
        <testSourceDirectory>test</testSourceDirectory>    
        <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>2.0.2</version>    
    
                <configuration>    
                    <encoding>UTF-8</encoding>    
                    <source>1.8</source>    
                    <target>1.8</target>    
                </configuration>    
            </plugin>    
        </plugins>    
    </build>

    <dependencies>
      <dependency>
       <groupId>org.easymock</groupId>
       <artifactId>easymock</artifactId>
       <version>5.0.0</version>
       <scope>test</scope>
      </dependency>
    <dependency>
      <groupId>com.unboundid</groupId>
      <artifactId>unboundid-ldapsdk</artifactId>
      <version>6.0.4</version>
      <scope>test</scope>
    </dependency>
        <dependency>
            <groupId>ant</groupId>
            <artifactId>ant</artifactId>
            <version>1.7.0</version>
        </dependency>
        <dependency>
            <groupId>ant</groupId>
            <artifactId>ant-apache-log4j</artifactId>
            <version>1.6.5</version>
        </dependency>
        <dependency>
            <groupId>ant</groupId>
            <artifactId>ant-commons-logging</artifactId>
            <version>1.6.5</version>
        </dependency>
        <dependency>
            <groupId>wsdl4j</groupId>
            <artifactId>wsdl4j</artifactId>
            <version>1.6.2</version>
        </dependency>
        <dependency>
            <groupId>javax.xml.rpc</groupId>
            <artifactId>javax.xml.rpc-api</artifactId>
            <version>1.1</version>
        </dependency>
        <dependency>
            <groupId>org.eclipse.jdt.core.compiler</groupId>
            <artifactId>ecj</artifactId>
            <version>4.6.1</version>
        </dependency>
        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>4.12</version>
            <scope>test</scope>
        </dependency>
    </dependencies>
</project>

2.使用idea匯入tomcat原始碼 File->Project from Existing Sources -> Maven import
重新匯入依賴後TestCookieFilter會報錯,本地註釋掉單元測試類即可。
3.編輯組態檔, Edit Configuration, 如下圖。
設定catalina.home和tomcat啟動類Bootstrap, jdk我選擇的是1.8

4.Maven Reload, 把依賴的包重新匯入進來。

新增JSP解析器程式碼:

1.Servlet.service() for servlet [jsp] in context with path [] threw exception [org.apache.jasper.JasperException: Unable to compile class for JSP] with root cause

解決方案:編輯 org.apache.catalina.startup.ContextConfig 檔案的 configureStart() 方法,新增初始化 JSP 解析器的程式碼:

在ContextConfig類的configStart方法中加入以下程式碼

context.addServletContainerInitializer(new JasperInitializer(), null);

我本地下載的tomcat8原始碼, 以上工作準備完後,直接編譯,單元測試也沒報錯。執行起來,就可以看到貓咪了, 可以開心的看原始碼了。

我原生的原始碼config/server.xml裡設定的是8080埠, 這裡就跑起來了。

tomcat原始碼目錄結構

tomcat核心原始碼

CATALINA_HOME和CATALINA_BASE

開始閱讀tomcat原始碼之前,先瀏覽一遍tomcat官方寫的介紹,裡面內容很全,也是我們學習的第一手資料,這裡涉及到兩個變數CATALINA_HOME和CATALINA_BASE。

  • CATALINA_HOME:表示 Tomcat 安裝的根目錄,即D:\Gitee\tomcat8\apache-tomcat-8.5.85-src
  • CATALINA_BASE:表示特定 Tomcat 範例的執行時設定的根。如果你需要在一臺機器上設定多個tomcat範例,則需要用到catalina_base變數

為什麼使用CATALINA_BASE

預設情況下,CATALINA_HOME和CATALINA_BASE指向同一目錄。當您需要在一臺計算機上執行多個 Tomcat 範例時,手動設定CATALINA_BASE。這樣做具有以下優點:

  • 更輕鬆地管理升級到較新版本的 Tomcat。由於具有單個CATALINA_HOME位置的所有範例共用一組檔案和二進位制檔案,因此您可以輕鬆地將檔案升級到較新版本,並將更改傳播到使用同一CATALIA_HOME目錄的所有 Tomcat 範例。
  • 避免重複相同的bin、lib資料夾的檔案。
  • 共用某些設定的可能性,例如 shell 或 bat 指令碼檔案(取決於您的作業系統)。

參考資料

https://2i3i.com/tomcat-code-7.html