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到底是怎么发布我们部署的项目

 

 

 

 

 

 

 

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