作爲一個優秀的程序開發者,我們不僅需要對自己編寫的程序有深刻的理解和認識,同樣的我們還需要對我們編寫的程序的運行環境有一個徹底的認識,這樣我們在能在這條路上走的更遠。相信大家對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到底是怎麼發佈我們部署的項目