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的初始化过程中,会通过遍历父加载器(setParentClassLoader方法)的方式将commonLoader挂到SystemClassLoader下 。如果通过bin目录下的脚本启动,因为脚本忽略系统classpath变量,而是使用了自定义的。所以Tomcat-9.0.27的SystemClassLoader加载Jar是Tomcat-9.0.27自定义的。见下面的两张图。


Tomcat会使用 java.net.URLClassLoader 来赋值 commonLoader,如果把 config 文件夹下的 Catalina.properties 里的 common.loader 置为空,则 commonLoader 会为 sum.misc.AppClassLoader。
load
用来读取config/Server.xml的配置。重新定向System.out和System.error流。启动Server并记录启动时间。
start
启动Server,向JVM添加关闭钩子,并等待关闭命令。
Runtime.getRuntime().addShutdownHook(shutdownHook);
posted on 2019-12-07 20:46 Logan12138 阅读(261) 评论(0) 收藏 举报
浙公网安备 33010602011771号