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