Web全棧工程師修煉之路 -- 構建Tomcat源碼

       作爲一個優秀的程序開發者,我們不僅需要對自己編寫的程序有深刻的理解和認識,同樣的我們還需要對我們編寫的程序的運行環境有一個徹底的認識,這樣我們在能在這條路上走的更遠。相信大家對tomcat都很熟悉,目前也是大陸使用的較多的一種開源的Web容器。對於Tomcat的基本使用這裏不做過多的介紹。具體的下載和使用可以查看我在2018年寫的https://blog.csdn.net/qq_38701478/article/details/85003063這篇文章。

    好了我們進入今天的主題,首先準備好源碼,這裏使用的版本是tomcat8.5-42

首先我們來打開Idea 創建一個空的工程

點擊完成,然後我們將下載好的源碼包解壓,放到上面剛剛創建的空工程對應的文件夾下

 

然後我們需要進行兩個操作,首先創建一個home目錄,接着將conf文件夾和webapps文件夾拷貝到home目錄中(其他的不需要)

好了,接着我們在源碼的目錄下創建一個pom.xml的文件,因爲我們要以Maven工程的模式來構建源碼,pom文件中主要的內容就是tomcat 依賴的jar包,對應於lib目錄下的那些。具體的內容如下:

<?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.42-src</artifactId>
    <name>Tomcat8.5</name>
    <version>8.5</version>
 
    <build>
        <finalName>Tomcat8.5</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.3</version>
                <configuration>
                    <encoding>UTF-8</encoding>
                    <source>1.8</source>
                    <target>1.8</target>
                </configuration>
            </plugin>
        </plugins>
    </build>
 
    <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.4</version>
        </dependency>
        <dependency>
            <groupId>ant</groupId>
            <artifactId>ant</artifactId>
            <version>1.7.0</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.core.compiler</groupId>
            <artifactId>ecj</artifactId>
            <version>4.5.1</version>
        </dependency>
       
    </dependencies>
</project>

 接着我們回到Idea中,我們在項目中new一個module ,選擇這從已經存在的項目中創建。

 

 

選中pom.xml文件即可。等待項目加載完成,(在此之前請見檢查自己的maven環境是否正常)

導入成功之後項目結構如下:

 

       好了,我們先來看一下,tomcat 的項目架構,我們都知道,一個Java項目的入口都是一個main方法,我們想要自己運行這個工程就要找到他的程序入口Main方法,首先我們都很熟悉,我們在啓動tomcat的時候都是使用的startup.sh或者是startup.bat這兩個簡本,這兩個腳本一個是Linux下的一個是Windows平臺下的,首先我們先來看一下startup.bat這個。

       我們發現 這個批處理文件中實際上調用的是catalina.bat,好吧,我們打開catalina.bat這個文件看看,雖然我們可能看不懂windows下面的批處理腳本,但是我們可以挑一些我們熟悉的東西看,大家仔細看的話,會發現一個叫做MAINCLASS的變量,如下圖所示:

 

 

      從字面上來理解,這個應該就是我們要找的著啓動類了,也就是說Main 方法就是在該類中,好了,我們接着打開BootStrap這個類, 

 

 

我們看一下,發現裏面確實有一個main方法,

 

好了,主啓動類找到了,接下來我們需要配置一下運行時的參數,我們選擇添加一個Application

 

-Dcatalina.home=D:/projec/java/IdeaProjects/tomcat-src/apache-tomcat-8.5.42-src/home
-Dcatalina.base=D:/projec/java/IdeaProjects/tomcat-src/apache-tomcat-8.5.42-src/home
-Djava.util.logging.manager=org.apache.juli.ClassLoaderLogManager
-Djava.util.logging.config.file=D:/projec/java/IdeaProjects/tomcat-src/apache-tomcat-8.5.42-src/home/conf/logging.properties

好了,我們啓動剛剛配置的BootStrap這個Application即可

點擊debug ,就可以啓動項目了,首次啓動的過程可能有點漫長

 

我們發現8080端口成功的啓動了,打開瀏覽器,我們發現可以正常的訪問主頁

如果發現訪問的時候報錯了,可以在ContextConfig中的configureStart函數中手動將JSP解析器初始 在770行webConfig();方法後加上context.addServletContainerInitializer(new JasperInitializer(), null); 即可。

好了,我們到這裏我們已經成功的構建了tomcat8.5版本的源碼了,並且已經可以在本地運行了。下面我們就來看看Tomcat到底是怎麼發佈我們部署的項目

 

 

 

 

 

 

 

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