Tomcat -- 启动流程

本文详细介绍了Tomcat的启动流程,从web概念到Tomcat启动原理。内容包括启动流程、源码分析,如启动脚本startup.bat和catalina.bat的执行,Bootstrap的初始化和组件加载,以及Server、Service、Connector的生命周期方法。通过对Bootstrap.main方法、Catalina.load方法的解析,揭示了Tomcat如何加载配置文件、初始化容器组件并监听端口,准备接受客户端请求。
摘要由CSDN通过智能技术生成

web概念

  1. 软件架构
    a. C/S:客户端、服务器端架构,如微信,QQ
    b. B/S:浏览器、服务器端架构,如淘宝等门户网站
  2. 资源类别
    a. 静态资源:所有用户访问得到的结果都一样,称为静态资源,可以直接被浏览器解析,如html、css、jpg等
    b. 动态资源:每个用户访问得到的结果可能不一致,动态资源被访问后需要先转换为静态资源,再返回给浏览器,由浏览器解析,如:jsp、servlet等
  3. 网络三要素
    a. ip:电子设备在网络的唯一标识
    b. 端口:应用程序在计算机中的唯一标识
    c. 传输协议:规定数据传输的规则

tomcat启动原理

  • 加载tomcat配置文件,初始化容器组件,监听对应的端口号,准备接受客户端请求
    在这里插入图片描述
启动流程
  • 启动tomcat,执行bin/startup.bat脚本,调用catalina.bat脚本
  • 执行调用BootStrap中main方法,调用init方法,通过反射创建Catalina对象及初始化类加载器
  • main方法中调用load方法,会调用Catalina的load方法
  • Catalina的load方法会进行Server中的一系列主键的初始化工作,并构造Digester对象,负责解析XML
  • 加载tomcat配置文件,初始化容器组件,监听对应的端口号,准备接受客户端请求
启动源码

生命周期方法(Lifecycle)

  • 所有组件都存在初始化、启动、停止等生命周期方法,tomcat基于生命周期管理抽象成Lifecycle接口
  • 组件Server、Service、Container、Executor、Connector都实现Lifecycle,通过Lifecycle统一管理个组件的生命周期接口
    ○ init:初始化组件接口
    ○ start:启动组件接口
    ○ stop:停止组件接口
    ○ destroy:销毁组件接口

组件默认实现
在这里插入图片描述

源码跟踪

在这里插入图片描述

startup.bat 启动文件
:okHome
//调用catalina.bat 
set "EXECUTABLE=%CATALINA_HOME%\bin\catalina.bat"

rem Check that target executable exists
if exist "%EXECUTABLE%" goto okExec
echo Cannot find "%EXECUTABLE%"
echo This file is needed to run this program
goto end
:okExec

rem Get remaining unshifted command line arguments and save them in the
set CMD_LINE_ARGS=
:setArgs
if ""%1""=="""" goto doneSetArgs
set CMD_LINE_ARGS=%CMD_LINE_ARGS% %1
shift
goto setArgs
:doneSetArgs
//执行
call "%EXECUTABLE%" start %CMD_LINE_ARGS%
:end
catalina.bat (bootstrap.jar)
if "%CLASSPATH%" == "" goto emptyClasspath
set "CLASSPATH=%CLASSPATH%;"
:emptyClasspath
set "CLASSPATH=%CLASSPATH%%CATALINA_HOME%\bin\bootstrap.jar"
启动入口 Bootstrap.main

org.apache.catalina.startup.Bootstrap#main

public static void main(String args[]) {
   
    synchronized (daemonLock) {
   
        //执行init方法初始化,创建Catalina对象
        bootstrap.init();
        //...
        String command = "start";
        //...
        if (command.equals("startd")) {
   
            args[args.length - 1] = "start";
            daemon.load(args);
            daemon.start();
        } else if (command.equals("stopd")) {
   
            args[args.length - 1] = "stop";
            daemon.stop();
        } else if (command.equals("start")) {
   
            daemon.setAwait(true);
            daemon.load(args);
            daemon.start();
            if (null == daemon.getServer()) {
   
                System.exit(1);
            }
        } else if (command.equals("stop")) {
   
            daemon.stopServer(args);
        } else if (command.equals("configtest")) {
   
            daemon.load(args);
            if (null == daemon.getServer()) {
   
                System.exit(1);
            }
            System.exit(0);
        }
    }
}
Bootstrap初始化组件

解析配置xml :org.apache.catalina.startup.Catalina#parseServerXml

初始化Bootstrap – bootstrap.init
  • 初始化ClassLoader
  • 通过反射创建Catalina(反射解耦)
public void init() throws Exception {
   
    //初始化ClassLoader
    initClassLoaders();
    Thread.currentThread().setContextClassLoader(catalinaLoader);
    SecurityClassLoad.securityClassLoad(catalinaLoader);
	//使用自定义ClassLoader类加载器 反射创建Catalina
    Class<?> startupClass = catalinaLoader.loadClass("org.apache.catalina.startup.Catalina");
    Object startupInstance = startupClass.getConstructor().newInstance();
    String methodName = "setParentClassLoader";
    Class<?> paramTypes[] = new Class[1];
    paramTypes[0] = Class.forName("java.lang.ClassLoader");
    Object paramValues[
  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
引用\[1\]、\[2\]和\[3\]中提到了三个不同版本的tomcat-maven-plugin插件配置。根据你提供的引用内容,可以看出这三个配置分别是: 1. 引用\[1\]中的配置使用的是org.apache.tomcat.maven:tomcat7-maven-plugin:2.2版本的插件,没有指定具体的配置信息。 2. 引用\[2\]中的配置使用的是org.apache.tomcat.maven:tomcat7-maven-plugin:2.1版本的插件,指定了端口号(port)为80,路径(path)为/WeiXinApply,URI编码(uriEncoding)为UTF-8,最终名称(finalName)为WeiXinApply,服务器(server)为tomcat7。 3. 引用\[3\]中的配置使用的是org.codehaus.mojo:tomcat-maven-plugin:1.1版本的插件,指定了路径(path)为/wp,端口号(port)为8080,URI编码(uriEncoding)为UTF-8,服务器(server)为tomcat6。 根据你的问题"tomcat-maven-plugin",可以看出你想了解关于tomcat-maven-plugin插件的信息。根据提供的引用内容,可以得出结论,tomcat-maven-plugin是一个用于在Maven项目中集成Tomcat服务器的插件。它可以帮助开发人员在开发过程中方便地启动、停止和部署Tomcat服务器。根据不同的配置,可以实现不同的功能,如指定端口号、路径、URI编码等。具体使用哪个版本的插件以及如何配置取决于你的项目需求和Maven配置。 #### 引用[.reference_title] - *1* [Maven插件tomcat7-maver-plugin](https://blog.csdn.net/weixin_45856470/article/details/117000567)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control_2,239^v3^insert_chatgpt"}} ] [.reference_item] - *2* *3* [tomcat-maven-plugin 插件使用](https://blog.csdn.net/weixin_34205826/article/details/92281180)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control_2,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值