Tomcat的启动流程分析

简介: 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的启动流程我们就了解了,之后还需要深入源码去看其执行流程!

相关文章
|
6月前
|
设计模式 安全 Java
【分布式技术专题】「Tomcat技术专题」 探索Tomcat技术架构设计模式的奥秘(Server和Service组件原理分析)
【分布式技术专题】「Tomcat技术专题」 探索Tomcat技术架构设计模式的奥秘(Server和Service组件原理分析)
104 0
|
3月前
|
Arthas Java 应用服务中间件
一次Tomcat返回404的分析
一个Web应用部署在阿里云EDAS上,使用Tomcat 7.0.59.3,在测试环境遭遇所有接口返回404的问题,而生产环境正常。测试与生产环境主要差异在于Apollo配置不同。通过Arthas工具监控,确认Spring已正确加载Controller,并且请求未进入Spring或Filter处理流程。进一步分析发现,Tomcat内部处理流程中设置了404状态码,最终定位到`org.apache.coyote.http11.AbstractHttp11Processor.process`方法存在问题。通过对代码逻辑的分析,确定原因是请求URL路径不正确。修正URL路径后问题得到解决。
82 1
一次Tomcat返回404的分析
|
5月前
|
Java 应用服务中间件 API
Tomcat处理一个HTTP请求的执行流程的详细解析
Tomcat处理一个HTTP请求的执行流程的详细解析
163 4
|
6月前
|
存储 负载均衡 NoSQL
【分布式技术架构】「Tomcat技术专题」 探索Tomcat集群架构原理和开发分析指南
【分布式技术架构】「Tomcat技术专题」 探索Tomcat集群架构原理和开发分析指南
136 1
|
6月前
|
XML Java 应用服务中间件
SpringBoot配置外部Tomcat项目启动流程源码分析(长文)
SpringBoot配置外部Tomcat项目启动流程源码分析(长文)
530 0
|
Arthas 负载均衡 网络协议
Tomcat连接之KeepAlive逻辑分析
Tomcat连接之KeepAlive逻辑分析
416 1
|
Java 应用服务中间件 容器
Tomcat原理系列之三:对请求的过程详细分析
Tomcat原理系列之三:对请求的过程详细分析
Tomcat原理系列之三:对请求的过程详细分析
|
监控 算法 Java
java tomcat服务无缘无故挂掉分析和解决方案
最近有同事反应有时候xxx系统有时候会时不时出现服务异常提示,一上机器,发现xxx服务进程不在,重启服务后又恢复了,所以这边就需要去跟进问题。
3245 0
|
网络协议 Java 应用服务中间件
tomcat 的并发能力分析
tomcat 的并发能力分析
775 0
tomcat 的并发能力分析
|
设计模式 安全 Java
【Tomcat技术专题】循序渐进,分析Servlet容器鼻祖的Server和Service组件原理
【Tomcat技术专题】循序渐进,分析Servlet容器鼻祖的Server和Service组件原理
168 0
【Tomcat技术专题】循序渐进,分析Servlet容器鼻祖的Server和Service组件原理