解读tomcat源码之tomcat的启动过程
前言
tomcat 我们经常用到,但是有时候我们却感到对他无比陌生,出了错都不知道是什么原因引起的。这个就比较尴尬,不过好在tomcat是开源免费的,我们可以看到其源码,那么问题就简单了,我们看看源码什么迷惑就没有了。最近对于tomcat有诸多不解,故看看源码来解惑,理解可能有些偏差,还请大神不吝赐教,小子在此谢过。
启动过程
我们都应该知道tomcat是通过类org.apache.catalina.startup.Bootstrap
启动的。首先要说的是这个类是被final修饰的,使不能被继承的。这防止了我们通过继承这种方式搞一些破坏。在main函数里我们最先调用的是init()
函数在init()
里面tomcat做了一下几件事:
1. 初始化catalina home
和catalina base
catalina home
:就是可以被多个tomcat公用的,如:lib和bin文件夹是所有tomcat公用的 catalina base
:就是每个tomcat实例所拥有的备份,比如:conf 、logs、webapps、work文件夹下面的文件就是每个tomcat实例所独有的备份。
2. 初始化类加载器commonLoader
、catalinaLoader
、sharedLoader
。然后通过catalinaLoader
加载org.apache.catalina.startup.Catalina
。在通过命令行传入参数(不传入默认就是start)。当传入参数是start
时,会在Bootstrap
的load()
函数里面通过反射调用Catalina
函数里面的load()
函数。然后调用catalina
里面的start()
然后tomcat就这样启动起来了,当然在load()
和start()
方法里面又调用了其他函数。(这个后来我慢慢补齐,还没怎么看懂,水平有限,惭愧惭愧)
String command = "start";
if (args.length > 0) {
command = args[args.length - 1];
}
if (command.equals("startd")) {
args[args.length - 1] = "start";
daemon.load(args);
daemon.start();
} else if (command.equals("stopd")) {
args[args.length - 1] = "stop";
daemon.stop();
} else if (command.equals("start")) {
daemon.setAwait(true);
daemon.load(args);
daemon.start();
} else if (command.equals("stop")) {
daemon.stopServer(args);
} else if (command.equals("configtest")) {
daemon.load(args);
if (null==daemon.getServer()) {
System.exit(1);
}
System.exit(0);
} else {
log.warn("Bootstrap: command \"" + command + "\" does not exist.");
}
未完待续