Tomcat 启动过程概览
Posted logan12138
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Tomcat 启动过程概览相关的知识,希望对你有一定的参考价值。
可以使用bin目录下的脚本启动。在代码里,启动的入口是类Bootstrap的main方法。
可以看tomcat官网的启动过程PDF
对于"start"的命令。经过了init、load、start三个方法调用。
init
用来初始化以下ClassLoader(在Tomcat-5.5版本后,有实际意义的只有commonLoader了)。
- commonLoader
- catalinaLoader
- sharedLoader
commonLoader是catalinaLoader和sharedLoader的的parent。
调用
Thread.currentThread().setContextClassLoader(ClassLoader cl)
将catalinaLoader设置为当前线程的类加载器。
- getContextClassLoader是当前线程的类加载器,避开双亲委派模型的加载方式;
- getClassLoader()是当前类加载器,使用双亲委派模型。
然后将sharedLoader设置为类Catalina的classLoader(通过更新Catalina.class.getClassLoader()的引用)。
在Server的初始化过程中,会通过遍历父加载器的方式将commonLoader挂到SystemClassLoader下 。如果通过bin目录下的脚本启动,因为脚本忽略系统classpath变量,而是使用了自定义的。所以Tomcat-9.0.27的SystemClassLoader加载Jar是Tomcat-9.0.27自定义的。见下面的两张图。
load
用来读取config/Server.xml的配置。重新定向System.out和System.error流。启动Server并记录启动时间。
start
启动Server,向JVM添加关闭钩子,并等待关闭命令。
Runtime.getRuntime().addShutdownHook(shutdownHook);
以上是关于Tomcat 启动过程概览的主要内容,如果未能解决你的问题,请参考以下文章
在Tomcat的安装目录下conf目录下的server.xml文件中增加一个xml代码片段,该代码片段中每个属性的含义与用途