Tomcat的启动流程从整体上来说并不算复杂,启动的入口就是从Bootstrap类的main方法开始的,这篇文章就让我们来看一下Bootstrap这个类都干了些什么。
Bootstrap类中的变量
首先看下Bootstrap都定义了哪些变量
|
|
Tomcat的类加载器
首先看下JVM的类加载器的结构:

- Bootstrap:引导类加载器,负责加载
rt.jar
- Extension:扩展类加载器,负责加载
jre/lib/ext
中的jar - System:系统类加载器,负责加载指定classpath中的jar
下面来看一下tomcat的类加载器的结构:

- Bootstrap:负责加载JVM启动时所需要的类以及
$JAVA_HOME/jre/lib/ext
目录中的类。相当于Java类加载器的Bootstrap和Extension。 - System:负责加载
$CATALINA_HOME/bin
目录下的类,比如bootstrap.jar
- Common:负责加载tomcat使用以及应用通用的一些类,位于
$CATALINA_HOME/lib
或$CATALINA_BASE/lib
下的jar,比如servlet-api.jar
- WebappX:每个应用在部署后,都会创建一个唯一的类加载器。该类加载器会加载位于该应用下的
WEB-INF/lib
中的jar文件和WEB-INF/classes
中的class文件
在tomcat中,如果要加载一个类,那么他的加载顺序为:
使用bootstrap引导类加载器加载
使用system系统类加载器加载
使用应用类加载器在
WEB-INF/classes
中加载使用应用类加载器在
WEB-INF/lib
中加载使用common类加载器在
$CATALINA_HOME/lib
或$CATALINA_BASE/lib
中加载
static代码块
在static代码块中,主要是对一些路径进行初始化。代码如下:
|
|
以上可见,主要是设置了一些运行时所需要的路径,例如要设置catalina.home,如果你要运行tomcat源码的话,可以在启动选项的VM options中设置-Dcatalina.home="/Users/sangjian/dev/source-files/apache-tomcat-8.5.4-src/output/build"
来指定。例如:

main方法
|
|
其实整个流程很简单,总结如下:
- 创建一个自身对象并调用
init
方法初始化,赋值给daemon - 判断参数,默认是start
- 执行
daemon.load
方法,判断参数类型,反射调用org.apache.catalina.startup.Catalina
对象的load
方法 - 执行
daemon.start
方法,反射调用org.apache.catalina.startup.Catalina
对象的start
方法
init方法
|
|
init方法主要做了以下几件事:
- 初始化类加载器
- 设置当前线程的类加载器
- 创建
org.apache.catalina.startup.Catalina
对象startupInstance
- 反射调用
org.apache.catalina.startup.Catalina
对象的setParentClassLoader
方法,设置父加载器为sharedLoader
- 将
startupInstance
赋值给catalinaDaemon
initClassLoaders和createClassLoader方法
|
|
基于之前介绍的tomcat的类加载器,这两个方法应该比较好理解了,这里需要注意的是,在Tomcat5之后,Tomcat的类加载器发生了变化,默认是没有catalinaLoader和sharedLoader的路径了,这个可以通过查看catalina.properties
文件来说明:
|
|
可见,默认只设置了commonLoader。从createClassLoader
方法可以看出,后两个loader的值是空的,所以commonLoader,catalinaLoader和sharedLoader都是同一个对象。
load方法
|
|
这不用多说了吧,还是调用org.apache.catalina.startup.Catalina
对象的load
方法。
start方法
|
|
更简单是不是?
以上就是Bootstrap类的工作,接下来就是Catalina需要做的事了,所以从这个流程来看,Bootstrap所做的工作还是很简单的。关于Catalina的分析下一篇文章继续吧。