Tomcat的启动流程分析

举报
长路 发表于 2022/11/28 20:27:11 2022/11/28
【摘要】 文章目录前言Tomcat启动过程两个系统执行流程windows执行startup.bat流程Linux系统执行流程bootstrap.jar包参考文章参考文章 前言 本篇博客主要是对Tomcat的启动流程进行梳理,如有错误请指出。 所有博客文件目录索引:博客目录索引(持续更新) Tomcat启动过程 两个系统执行流程 windows执行startup.bat流程 一般两种启动方式:①通过点击bin

@[toc]

前言

本篇博客主要是对Tomcat的启动流程进行梳理,如有错误请指出。

所有博客文件目录索引:博客目录索引(持续更新)

Tomcat启动过程

两个系统执行流程

windows执行startup.bat流程

一般两种启动方式:①通过点击bin目录下的startup.bat来启动tomcat。②cmd中输入catalina run命令,实际就是执行catalina.bat命令。

停止方式:对于①中startup.bat启动的需要再次点击shutdown.bat来停止服务器运行。对于②中cmd执行命令的关闭窗口或者按下ctrl+c即可。

下面简单描述一下执行的过程以及调用的文件

  1. 点击startup.bat:会去查看CATALINA_HOME变量若不存在,则设置CATALINA_HOME变量为本身的tomcat文件目录的bin目录,传递start参数给catalina.bat进行执行。

  2. 执行catalina.bat:其中包含设置临时变量(执行C盘文件),接着会传入start参数调用setclasspath.bat,会定义设置一些临时变量,去查看一些bin目录下jar包,conf目录下的logging.properties等等各类参数设置,判断等等。

    • 中间执行setclasspath.bat:其中会去读取JAVA_HOME环境变量以及JRE_HOME变量等。(这也是为什么之前配置jdk环境变量时要配置JAVA_HOME)
    • image-20210426101402667
  3. 前面都是参数设置,判断等等,现在到达catalina.bat中的执行命令:会新开一个窗口叫做Tomcat,并且使用jdk中的工具java.exe以及各种参数配置。

    • %_EXECJAVA% %JAVA_OPTS% %CATALINA_OPTS% %DEBUG_OPTS% -Djava.endorsed.dirs="%JAVA_ENDORSED_DIRS%" -classpath "%CLASSPATH%" -Dcatalina.base="%CATALINA_BASE%" -Dcatalina.home="%CATALINA_HOME%" -Djava.io.tmpdir="%CATALINA_TMPDIR%" %MAINCLASS% %CMD_LINE_ARGS% %ACTION%
      
    • //上面的执行命令包含许多的环境变量设置,真实执行语句示例如下
      start "Tomcat" "D:\WorkSoftware\Java\jdk1.7.0_13\bin\java"  -Djava.util.logging.config.file="E:\cccccccccccccccccccccccc\tomcat7.0\conf\logging.properties" -Djava.util.logging.manager=org.apache.juli.ClassLoaderLogManager   -Djava.endorsed.dirs="E:\cccccccccccccccccccccccc\tomcat7.0\endorsed" -classpath "E:\cccccccccccccccccccccccc\tomcat7.0\bin\bootstrap.jar;E:\cccccccccccccccccccccccc\tomcat7.0\bin\tomcat-juli.jar" -Dcatalina.base="E:\cccccccccccccccccccccccc\tomcat7.0" -Dcatalina.home="E:\cccccccccccccccccccccccc\tomcat7.0" -Djava.io.tmpdir="E:\cccccccccccccccccccccccc\tomcat7.0\temp" org.apache.catalina.startup.Bootstrap  start
      
  4. 最后调用bin目录下的bootstrapjar包中的类org.apache.catalina.startup.Bootstrap里的main方法开始执行java程序。

小总结:主要相关的三个bat执行文件,其中setclasspath.bat会去读取JAVA_HOME的环境变量,catalina.bat在最终会去调用jar包中执行程序来开始程序的执行!



Linux系统执行流程

进入到tomcat的bin目录,输入./startup.sh,即可启动tomcat服务器。

具体流程如下:startup.sh —> catalina.sh start —> java xxxx.jar org.apache.catalina.startup.Bootstrap(main) start(参数)(这是在cataline.sh中启动java程序的命令)

image-20210519145413662

我们接着看一下实际启动java项目所输入的命令以及添加了些什么参数,输入命令ps -ef | grep tomcat查看

root       4060      1 15 22:47 pts/1    00:00:04 
/usr/bin/java   # 执行java工具
# -D添加参数以及jar包还有其他一些配置文件等 可以看做是 - xxx.jar
-Djava.util.logging.config.file=/opt/software/apache-tomcat-8.5.66/conf/logging.properties 
-Djava.util.logging.manager=org.apache.juli.ClassLoaderLogManager -Djdk.tls.ephemeralDHKeySize=2048 
-Djava.protocol.handler.pkgs=org.apache.catalina.webresources 
-Dorg.apache.catalina.security.SecurityListener.UMASK=0027 
-Dignore.endorsed.dirs= -classpath /opt/software/apache-tomcat-8.5.66/bin/bootstrap.jar:/opt/software/apache-tomcat-8.5.66/bin/tomcat-juli.jar 
-Dcatalina.base=/opt/software/apache-tomcat-8.5.66 
-Dcatalina.home=/opt/software/apache-tomcat-8.5.66 -Djava.io.tmpdir=/opt/software/apache-tomcat-8.5.66/temp org.apache.catalina.startup.Bootstrap   # 最后跟着启动的主类
start
root       4104   3949  0 22:48 pts/1    00:00:00 grep --color=auto tomcat

说明:可以看到实际通过执行java工具来进行启动服务器的,后面-D添加了一些参数和一些jar包地址以及一些工作目录如,在tomcat运行中需要。这与我们之后在本地IDEA中构建源码并启动需要添加的-D参数也有一些关联。



bootstrap.jar包

我们在tomcat的bin目录下可以看到bootstrap.jar包,该jar包中就包含了上面提到了的org.apache.catalina.startup.Bootstrap类,该类中的main()方法作为入口:

image-20210426102432109

  • jar文件:实际就是class文件的zip压缩存档。开发中可以直接使用class文件运行,不过这样不太方便,一般使用jar包来提供发布与运行,许多工具可以直接操纵该文档,但是其本身不能表单应用程序的便签信息。

话不多说我们解压看一下就知道了:

image-20210426103042747

  • META-INF:提供存档的便签信息,其中包含了三个文件。LICENSE就是一个许可证(该许可证是apache的);MANIFEST.MF(清单,描述jar文件中的信息的一个目录)其中包含清单版本、创建版本、主类名称(主类为org.apache.catalina.startup.Bootstrap);NOTICE:含版权信息之类。
    • image-20210426103231676
  • org:其中包含的是javaclass文件,主要是catalina包以及tomcat包,其中org.apache.catalina.startup.Bootstrapcataline包中。

下面就是Bootstrap的主类位置:

image-20210426103910902

通过反编译工具jad反编译Bootstrap.class文件,就能够看到其中的main()方法:

image-20210426104357463

  • 其中的286、287行就是完成了Tomcat的初始化以及启动核心过程。

说明:大致tomcat的启动流程我们就了解了,之后还需要深入源码去看其执行流程!

参考文章

  • 其中的286、287行就是完成了Tomcat的初始化以及启动核心过程。

说明:大致tomcat的启动流程我们就了解了,之后还需要深入源码去看其执行流程!

参考文章

Tomcat启动过程源码分析一 从startup.bat开始分析整个执行过程

【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。