02 Tomcat目录结构解析;idea导入tomcat源码启动;tomcat源码学习

在这里插入图片描述

Tomcat的目录结构

tomcat目录结构

目录文件描述
bin/存放Tomcat的启动、停止等批处理脚本文件
startup.bat, startup.sh用于在windows和linux下的启动脚本
shutdown.bat, shutdown.sh用于在windows和linux下的停止脚本
conf/Tomcat的配置文件和相关的 DTD
Catalina存储针对每个虚拟机的Context配置
context.xml用于定义所有web应用均需加载的Context配置,如果web应用指定了自己的context.xml,该文件将被覆盖
catalina.propertiesTomcat 的环境变量配置
catalina.policyTomcat 运行的安全策略配置
logging.propertiesTomcat 的日志配置文件, 可以通过该文件修改Tomcat 的日志级别及日志路径等
server.xmlTomcat 服务器的核心配置文件
tomcat-users.xml定义Tomcat默认的用户及角色映射信息配置
web.xmlTomcat 中所有应用默认的部署描述文件, 主要定义了基础Servlet和MIME映射
lib/Tomcat 服务器的依赖包
logs/Tomcat 默认的日志存放目录
webapps/Tomcat 默认的Web应用部署目录
work/Web 应用JSP代码生成和编译的临时目录

Tomcat 启动 停止 访问

启动

windows启动
双击 bin/startup.bat 文件

linux启动
sh startup.sh

停止

windows停止
双击 bin/shutdown.bat 文件

linux停止
sh bin/startup.sh

访问

http://localhost:8080/
tomcat 启动页面

Tomcat源码下载,导入IDE启动

源码下载

为什么选择这个版本,因为这个版本是Java最后一个支持JDK1.8的版本

地址:https://tomcat.apache.org/download-10.cgi

源码下载

源码下载:https://github.com/apache/tomcat

在这里插入图片描述
在这里插入图片描述

源码目录结构

为什么源码结构中时build.xml,没有pom.xml

Tomcat的依赖管理用到的是Ant技术进行管理的,所以只有build.xml
Ant技术基本已经被淘汰,如果要使用maven管理,就要自己创建pom.xml

在这里插入图片描述

创建pom.xml

寻找可用的pom.xml 太累人了,
起初想查询一下是否有build.xml 转换为pom.xml的工具,都失败了。
通过百度,爬楼最终找到Tomcat10.0.6版本的pom文件。既然都是tomcat10版本,应该差不多。

Tomcat10.0.6版本的pomhttps://gitee.com/stefanpy/tomcat-source-code-learning

Tomcat10.0.13版本的pom

Tomcat10.0.14版本的pom

因本人学识浅薄,折腾时间过长,选择放弃自己创建pom文件,选择使用拿来主义。

准备使用apache-tomcat-8.5.42-src版本来学习Tomcat源码

apache-tomcat-8.5.42-src版本的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>apache-tomcat-8.5.42-src</artifactId>
    <version>8.5</version>
    <name>Tomcat8.5</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.4</version>
        </dependency>
        <dependency>
            <groupId>org.apache.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-api</artifactId>
            <version>1.1</version>
        </dependency>

        <dependency>
            <groupId>org.eclipse.jdt.core.compiler</groupId>
            <artifactId>ecj</artifactId>
            <version>4.5.1</version>
        </dependency>
    </dependencies>


    <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>3.6.1</version>
                <configuration>
                    <encoding>UTF-8</encoding>
                    <source>1.8</source>
                    <target>1.8</target>
                </configuration>
            </plugin>
        </plugins>
    </build>
</project>

idea 导入项目Tomcat项目 步骤

  1. 解压源码包
    在这里插入图片描述

  2. 创建一个目录,命名为catalina-home, 并将conf、webapps目录移入catalina-home目录中

  3. 创建一个 pom.xml 文件,引入tomcat的依赖包(可参考上面的pom)

  4. 配置idea的启动类, 配置 MainClass , 并配置 VM 参数。

VM 参数
-Dcatalina.home=D:\Sunxy_Space\Tomcat_project\apache-tomcat-8.5.42-src\catalina-home
-Dcatalina.base=D:\Sunxy_Space\Tomcat_project\apache-tomcat-8.5.42-src\catalina-home
-Djava.endorsed.dirs=D:\Sunxy_Space\Tomcat_project\apache-tomcat-8.5.42-src\catalina-home\endorsed
-Djava.io.tmpdir=D:\Sunxy_Space\Tomcat_project\apache-tomcat-8.5.42-src\catalina-home\temp
-Djava.util.logging.manager=org.apache.juli.ClassLoaderLogManager
-Djava.util.logging.config.file=D:\Sunxy_Space\Tomcat_project\apache-tomcat-8.5.42-src\catalina-home\conf\logging.properties
-Djava.protocol.handler.pkgs=org.apache.catalina.webresources
-Djdk.tls.ephemeralDHKeySize=2048

在这里插入图片描述
5. 编译启动

启动Tomcat过程中遇到的问题

idea java: -source 1.5 中不支持 diamond 运算符

idea java: -source 1.5 中不支持 diamond 运算符
(请使用 -source 7 或更高版本以启用 diamond 运算符)

在这里插入图片描述
点击上述图标或者 快捷键:Alt+Ctrl+Shift+S
在这里插入图片描述
改为高版本
在这里插入图片描述

TestCookieFilter报错:Error java: 找不到符号 符号: 变量 CookieFilter

我在webapps\examples\WEB-INF\classes\util 中找到CookieFilter.java
在java目录中创建一个包把该类移过去,在TestCookieFilter引入即可

在这里插入图片描述

org.apache.jasper.JasperException: java.lang.NullPointerException 无法编译

在这里插入图片描述

直接启动org.apache.catalina.startup.Bootstrap的时候没有加载JasperInitializer,从而无法编译JSP。解决办法是在tomcat的源码ContextConfig中的configureStart函数中手动将JSP解析器初始化

context.addServletContainerInitializer(new JasperInitializer(), null);

在这里插入图片描述

启动成功

在这里插入图片描述

总结

讲tomcat在idea中启动起来真的不容易。
整个过程爬贴无数,历史一天终见成效。
困难重重,忘君莫要放弃。加油!!!

参考文档

长剑走天涯的tomcat
IDEA运行Tomcat源码

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

EngineerForSoul

你的鼓励是我孜孜不倦的动力

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

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

打赏作者

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

抵扣说明:

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

余额充值