(1)Tomcat 源码编译运行


前言

Tomcat作为我们常用的web服务器,还是有必要深入学习以下的。本章是我记录Tomcat学习的第一篇文章,将会记录tomcat7tomcat8IDEA上编译运行的过程,运行环境是JDK1.8

IDEA上编译运行tomcat源码将会基于Maven,因此需要先了解Maveng、a、v概念,这样方便处理编译运行过程中可能出现的问题。g也就是Group Id,表示组织名称,aArtifact Id,表示项目名称,vVersion,表示版本号,这三者合在一起俗称坐标,就是创建的项目在Maven本地仓库的目录位置。

举个例子:

在这里插入图片描述
在我的本地Maven仓库中有个分级目录org\apache\maven,在IDEA中是org.apache.maven,也就是Group ID即组织。

在这里插入图片描述
该组织下有个plugins\maven-compiler-plugin,在IDEA中是plugins.maven-compiler-plugin,也就是项目名称。在该项目下又分了若干个版本,即为版本号Version

Maven安装可参考我的另一篇文章:STS创建Maven工程配置Spring实现登陆注册功能的过程,至于如何在IDEA中配置Maven,这个网上一大堆,可自行百度。

tomcat7tomcat8的源码都是官网上的,网址是http://archive.apache.org/dist/tomcat/,由于下载速度比较慢,我下载下来后上传到了网盘。

  1. apache-tomcat-7.0.100-src.zip:8ybt
  2. apache-tomcat-8.5.51-src.zip:h1x2

一、Tomcat7源码的编译运行

下载源码压缩包,解压后,如图:

在这里插入图片描述
在该目录下创建一个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>Tomcat7.0</artifactId>
    <name>Tomcat</name>
    <version>7.0</version>

    <build>
        <finalName>Tomcat7</finalName>
        <sourceDirectory>java</sourceDirectory>
        <!--<testSourceDirectory>test</testSourceDirectory>  test 下的有些文件报错,因此将test文件夹去掉了-->
        <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.5.1</version>
                <configuration>
                    <encoding>UTF-8</encoding>
                    <source>1.8</source>
                    <target>1.8</target>
                </configuration>
            </plugin>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-jar-plugin</artifactId>
                <version>2.6</version>
            </plugin>
        </plugins>
    </build>
    <dependencies>
        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>4.11</version>
            <scope>test</scope>
        </dependency>
        <dependency>
            <groupId>ant</groupId>
            <artifactId>ant</artifactId>
            <version>1.6.5</version>
        </dependency>
        <dependency>
            <groupId>org.easymock</groupId>
            <artifactId>easymock</artifactId>
            <version>3.4</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.2.2</version>
        </dependency>
    </dependencies>
</project>

接下来在IDEA中打开项目:

在这里插入图片描述
找到刚才解压的目录,选中打开:
在这里插入图片描述
打开项目后会被识别成Maven项目,开始下载pom.xml中的依赖项:

在这里插入图片描述
下载过程中往往会报以下的错误:

在这里插入图片描述

Cannot resolve plugin org.apache.maven.plugins:maven-compiler-plugin:3.5.1
Cannot resolve plugin org.apache.maven.plugins:maven-jar-plugin:2.6
Cannot resolve plugin org.apache.maven.plugins:maven-deploy-plugin:2.7
Cannot resolve plugin org.apache.maven.plugins:maven-site-plugin:3.3

不要慌,这是下载包的过程中出错,导致下载未完成,可能跟Maven配置的阿里云镜像源有关。在网页中搜maven,找到Maven Repository: Search/Browse/Explore打开:

在这里插入图片描述
通过验证后进入到maven远程仓库页面:

在这里插入图片描述
找到第一条报错:

Cannot resolve plugin org.apache.maven.plugins:maven-compiler-plugin:3.5.1

就是无法下载版本为3.5.1maven-compiler-plugin呗,那么我们就直接搜索maven-compiler-plugin

在这里插入图片描述
找到对应的版本号3.5.1

在这里插入图片描述
点击下载:

在这里插入图片描述
在这里插入图片描述
下载完成后,根据前面讲的g、a、v概念,将找到本地仓库相应的位置:

在这里插入图片描述
将下载失败的那些文件全部删除掉,再将刚才下载的jar包移动到该文件夹

在这里插入图片描述
对于另外的几个报错,解决办法和上面的操作一样。

Cannot resolve plugin org.apache.maven.plugins:maven-jar-plugin:2.6
Cannot resolve plugin org.apache.maven.plugins:maven-deploy-plugin:2.7
Cannot resolve plugin org.apache.maven.plugins:maven-site-plugin:3.3

弄好之后,回到IDEACtrl A + Ctrl Xpom.xml文件的内容全部剪切,再Ctrl S保存,此时会弹出import changes

在这里插入图片描述
将刚才剪切的内容再粘贴回去,保存,点击import changes,就不会再报错了:

在这里插入图片描述
接下来便是编译运行tomcat7源码。

在这里插入图片描述
相关设置如下图:

在这里插入图片描述
其中Name可随意设置,Main class一定要写为org.apache.catalina.startup.BootstrapVM options写为:

-Dcatalina.home=D:\idea_projects_2019.2.4\apache-tomcat-7.0.100-src
-Dfile.encoding=UTF-8
-Duser.region=us
-Duser.language=en

其中-Dcatalina.home要改为自己解压的tomcat目录。

点击ApplyOK

接下来重构项目:

在这里插入图片描述
在这里插入图片描述
重构会报找不到符号的错误:

在这里插入图片描述
解决办法便是将JDTCompiler.java中的372-373两行注释掉,将440-443四行注释掉:

在这里插入图片描述
在这里插入图片描述
再次重构,成功:

在这里插入图片描述
接下来运行tomcat7:

在这里插入图片描述
emm运行成功,但是报了几个找不到类的错,上网查阅,说是把webapps目录下的exsamples目录删掉就行:

在这里插入图片描述
删除之后,重新运行:

在这里插入图片描述
成功。

接下来测试,将我之前打包好的Login3.war放到webapps目录下,过一会自动完成解压:

在这里插入图片描述
访问localhost:8080/Login3

在这里插入图片描述
说明Tomcat7源码成功在IDEA编译运行。

我将编译好的源码放在了gitee上面:
https://gitee.com/as_gygutgkj/apache-tomcat-7.0.100-src.git

二、Tomcat8源码的编译运行

Tomcat7差不多。

解压:

在这里插入图片描述
在解压后的根目录下创建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>3.5.1</version>
                <configuration>
                    <encoding>UTF-8</encoding>
                    <source>1.8</source>
                    <target>1.8</target>
                </configuration>
            </plugin>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-jar-plugin</artifactId>
                <version>2.6</version>
            </plugin>
        </plugins>
    </build>
    <dependencies>
        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>4.11</version>
            <scope>test</scope>
        </dependency>
        <dependency>
            <groupId>ant</groupId>
            <artifactId>ant</artifactId>
            <version>1.6.5</version>
        </dependency>
        <dependency>
            <groupId>org.easymock</groupId>
            <artifactId>easymock</artifactId>
            <version>3.4</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.2.2</version>
        </dependency>
    </dependencies>
</project>

IDEA中打开项目:

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
这里在下载依赖的时候若报Cannot resolve plugin org.apache.maven.plugins的错,参照上面Tomcat7的解决办法。

接下来Add Configuration

在这里插入图片描述
在这里插入图片描述
其中Name可随意设置,Main class一定要写为org.apache.catalina.startup.BootstrapVM options写为:

-Dcatalina.home=D:\idea_projects_2019.2.4\apache-tomcat-8.5.51-src
-Dfile.encoding=UTF-8
-Duser.region=us
-Duser.language=en

其中-Dcatalina.home要改为自己解压的tomcat目录。

接下来构建项目:

在这里插入图片描述
出现了上面Tomcat7一样的问题:

在这里插入图片描述
解决:

注释掉341-342两行代码,注释掉409-412四行代码。

在这里插入图片描述

在这里插入图片描述再次构建项目,不再报错:

在这里插入图片描述
运行项目,又报找不到类的错:

在这里插入图片描述
webapps目录下的exsamples目录删掉:

在这里插入图片描述
再次运行,不再报错:

在这里插入图片描述
测试。将Login3.war复制到webapps目录下,tomcat会自动解压:

在这里插入图片描述
访问localhost:8080/Login3,报下面的错:

在这里插入图片描述
这是因为Tomcat内部使⽤了SPI机制来初始化jsp相关的东⻄,⼿动运⾏源码的过程中默认不会去初始化jsp相关的东西。

找到res/META-INF/jasper,jar/services文件夹,复制:

在这里插入图片描述
在工程根目录新建resources文件夹,在里面创建META-INF文件夹,将刚才复制的services文件夹复制进去。

右键resources文件夹,选择Make Directory as,点击Resources Root

在这里插入图片描述
在这里插入图片描述
重启Tomcat8,再次访问localhost:8080/Login3

在这里插入图片描述
成功。

编译好的Tomcat8源码gitee地址:
https://gitee.com/as_gygutgkj/apache-tomcat-8.5.51-src.git

总结

编译好了Tomcat源码,接下来就是深入学习其机制了。

  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

starslightshine

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值