一文深入理解Tomcat原理:阿里高級技術專家帶你玩轉Tomcat

前言

本文開始Tomcat源碼分析之旅,我將詳細的分析Tomcat的啟動過程及運行原理。本文將是最基礎的一節課,也就是本地編譯好Tomcat源碼,為後面的分析做基礎!

2編譯Tomcat源碼

2.1下載Tomcat源碼

我們去Tomcat官網下載最新的Tomcat源碼包,目前最新的版本為9.0.26,我們下載其source源碼包tar.gz版本,如下圖:

一文深入理解Tomcat原理:阿里高級技術專家帶你玩轉Tomcat

2.2 解壓源碼包apache-tomcat-9.0.26-src.tar.gz

解壓源碼包apache-tomcat-9.0.26-src.tar.gz之後得到的內容為:

一文深入理解Tomcat原理:阿里高級技術專家帶你玩轉Tomcat

2.3 解壓後的文件夾中添加pom.xml

因為要使用Maven的方式導入Tomcat項目,故需要添加相應的maven依賴,此處添加pom.xml文件,該文件內容如下:


<project> 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>com.github.sources/<groupid>
<artifactid>source-tomcat/<artifactid>
<version>9.0.26/<version>
<name>source-tomcat/<name>
<dependencies>
<dependency>
<groupid>junit/<groupid>
<artifactid>junit/<artifactid>
<version>4.12/<version>
<scope>test/<scope>
/<dependency>
<dependency>
<groupid>org.easymock/<groupid>
<artifactid>easymock/<artifactid>
<version>3.5.1/<version>
/<dependency>
<dependency>
<groupid>org.apache.ant/<groupid>
<artifactid>ant/<artifactid>
<version>1.10.1/<version>
/<dependency>
<dependency>
<groupid>wsdl4j/<groupid>
<artifactid>wsdl4j/<artifactid>
<version>1.6.2/<version>
/<dependency>
<dependency>
<groupid>javax.xml/<groupid>
<artifactid>jaxrpc/<artifactid>
<version>1.1/<version>
/<dependency>
<dependency>
<groupid>org.eclipse.jdt/<groupid>

<artifactid>org.eclipse.jdt.core/<artifactid>
<version>3.18.0/<version>
/<dependency>
<dependency>
<groupid>org.eclipse.jdt.core.compiler/<groupid>
<artifactid>ecj/<artifactid>
<version>4.6.1/<version>
/<dependency>
/<dependencies>
<build>
<finalname>Tomcat9.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>3.6.1/<version>
<configuration>
<encoding>UTF-8/<encoding>
<source>1.8/<source>
<target>1.8/<target>
/<configuration>
/<plugin>
/<plugins>
/<build>
/<project>

2.4 IDEA導入tomcat源碼工程

使用IDEA開發工具,以Maven的方式導入tomcat工程,導入之後工程結構如下:

一文深入理解Tomcat原理:阿里高級技術專家帶你玩轉Tomcat

2.5 啟動Tomcat工程

運行org.apache.catalina.startup包下的Bootstrap類的main方法

一文深入理解Tomcat原理:阿里高級技術專家帶你玩轉Tomcat

此時,我們發現了一些錯誤,下面我們來解決這些錯誤。

3 異常問題解決

3.1 trailers.ResponseTrailers不存在

我們可以去webapps/examples/WEB_INF/classes/trailers 目錄下找到該類,我們將這個類複製一份到test下:

一文深入理解Tomcat原理:阿里高級技術專家帶你玩轉Tomcat

拷貝完成之後的情況如下:

一文深入理解Tomcat原理:阿里高級技術專家帶你玩轉Tomcat

3.2 CookieFilter不存在

同樣,我們去將home\\webapps\\examples\\WEB-INF\\classes\\\\util\\CookieFilter.java 文件拷貝到 test\\\\util 目錄下:

一文深入理解Tomcat原理:阿里高級技術專家帶你玩轉Tomcat

3.3 FileNotFoundException: /Library/ApacheTomcat/source/test/source-tomcat/conf/server.xml (No such file or directory)

在解決上述3.1和3.2的問題之後,又出現了下圖所示的問題:

一文深入理解Tomcat原理:阿里高級技術專家帶你玩轉Tomcat

  • 解決方案: 在啟動的配置中,添加VM options的參數,添加項目路徑,本機為/Library/ApacheTomcat/source/test/apache-tomcat-9.0.26-src,故而添加參數內容為: -Dcatalina.home=/Library/ApacheTomcat/source/test/apache-tomcat-9.0.26-src, 如下圖所示:
一文深入理解Tomcat原理:阿里高級技術專家帶你玩轉Tomcat

3.4 java.lang.ClassNotFoundException: listeners.ContextListener

在解決上述3.3問題之後,再次啟動Bootstrap類的main方法,程序出現以下錯誤信息:

一文深入理解Tomcat原理:阿里高級技術專家帶你玩轉Tomcat

  • 解決方案: 刪除 webapps 下的 examples 文件夾!程序再次運行不報此錯誤!

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

在解決上述問題之後,啟動Bootstrap類的main方法,程序正常啟動,此時我們在瀏覽器訪問127.0.0.1:8080, 程序出現以下錯誤信息:

一文深入理解Tomcat原理:阿里高級技術專家帶你玩轉Tomcat

一文深入理解Tomcat原理:阿里高級技術專家帶你玩轉Tomcat

  • 解決方案:編輯 org.apache.catalina.startup.ContextConfig 文件的 configureStart() 方法,添加初始化 JSP 解析器的代碼:
context.addServletContainerInitializer(new JasperInitializer(), null);
一文深入理解Tomcat原理:阿里高級技術專家帶你玩轉Tomcat

添加之後,再次啟動main方法,瀏覽器輸入127.0.0.1:8080得到的結果為Tomcat的界面:

一文深入理解Tomcat原理:阿里高級技術專家帶你玩轉Tomcat

3.6 日誌亂碼

啟動的日誌中含有很多的亂碼,雖然對程序整體並不影響,但是在之後查看日誌時,還是影響比較大的,先看下日誌亂碼的情況:

一文深入理解Tomcat原理:阿里高級技術專家帶你玩轉Tomcat

  • 解決方案: 修改vm options 內容,將環境設置為美國-英文,設置內容如下:
-Duser.language=en -Duser.region=US -Dfile.encoding=UTF-8
一文深入理解Tomcat原理:阿里高級技術專家帶你玩轉Tomcat

再次運行main方法,程序日誌正常顯示:

一文深入理解Tomcat原理:阿里高級技術專家帶你玩轉Tomcat

至此,我們已經將Tomcat的源碼導入到IDEA的工具中,也解決了一些問題,之後,我們將利用這份源碼來分析Tomcat的啟動及運行原理。


分享到:


相關文章: