Tomcat的启动流程分析
@[toc]
前言
本篇博客主要是对Tomcat的启动流程进行梳理,如有错误请指出。
所有博客文件目录索引:博客目录索引(持续更新)
Tomcat启动过程
两个系统执行流程
windows执行startup.bat流程
一般两种启动方式:①通过点击bin目录下的startup.bat
来启动tomcat。②cmd中输入catalina run
命令,实际就是执行catalina.bat命令。
停止方式:对于①中startup.bat启动的需要再次点击shutdown.bat来停止服务器运行。对于②中cmd执行命令的关闭窗口或者按下ctrl+c即可。
下面简单描述一下执行的过程以及调用的文件:
-
点击
startup.bat
:会去查看CATALINA_HOME
变量若不存在,则设置CATALINA_HOME
变量为本身的tomcat文件目录的bin目录,传递start参数给catalina.bat
进行执行。 -
执行
catalina.bat
:其中包含设置临时变量(执行C盘文件),接着会传入start参数调用setclasspath.bat
,会定义设置一些临时变量,去查看一些bin目录下jar包,conf目录下的logging.properties
等等各类参数设置,判断等等。- 中间执行
setclasspath.bat
:其中会去读取JAVA_HOME
环境变量以及JRE_HOME
变量等。(这也是为什么之前配置jdk环境变量时要配置JAVA_HOME
)
- 中间执行
-
前面都是参数设置,判断等等,现在到达
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
-
-
最后调用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程序的命令)
我们接着看一下实际启动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()
方法作为入口:
jar
文件:实际就是class
文件的zip
压缩存档。开发中可以直接使用class
文件运行,不过这样不太方便,一般使用jar包来提供发布与运行,许多工具可以直接操纵该文档,但是其本身不能表单应用程序的便签信息。
话不多说我们解压看一下就知道了:
META-INF
:提供存档的便签信息,其中包含了三个文件。LICENSE
就是一个许可证(该许可证是apache的);MANIFEST.MF
(清单,描述jar文件中的信息的一个目录)其中包含清单版本、创建版本、主类名称(主类为org.apache.catalina.startup.Bootstrap
);NOTICE
:含版权信息之类。org
:其中包含的是java
的class
文件,主要是catalina
包以及tomcat
包,其中org.apache.catalina.startup.Bootstrap
在cataline
包中。
下面就是Bootstrap
的主类位置:
通过反编译工具jad反编译Bootstrap.class
文件,就能够看到其中的main()
方法:
- 其中的286、287行就是完成了
Tomcat
的初始化以及启动核心过程。
说明:大致tomcat
的启动流程我们就了解了,之后还需要深入源码去看其执行流程!
参考文章
- 其中的286、287行就是完成了
Tomcat
的初始化以及启动核心过程。
说明:大致tomcat
的启动流程我们就了解了,之后还需要深入源码去看其执行流程!
参考文章
Tomcat启动过程源码分析一 从startup.bat开始分析整个执行过程
- 点赞
- 收藏
- 关注作者
评论(0)