解读tomcat源码之tomcat的启动过程

来源:互联网 发布:lol职业选手训练软件 编辑:程序博客网 时间:2024/04/30 02:47

解读tomcat源码之tomcat的启动过程

前言

tomcat 我们经常用到,但是有时候我们却感到对他无比陌生,出了错都不知道是什么原因引起的。这个就比较尴尬,不过好在tomcat是开源免费的,我们可以看到其源码,那么问题就简单了,我们看看源码什么迷惑就没有了。最近对于tomcat有诸多不解,故看看源码来解惑,理解可能有些偏差,还请大神不吝赐教,小子在此谢过。

启动过程

我们都应该知道tomcat是通过类org.apache.catalina.startup.Bootstrap 启动的。首先要说的是这个类是被final修饰的,使不能被继承的。这防止了我们通过继承这种方式搞一些破坏。在main函数里我们最先调用的是init() 函数在init() 里面tomcat做了一下几件事:
1. 初始化catalina homecatalina base catalina home:就是可以被多个tomcat公用的,如:lib和bin文件夹是所有tomcat公用的 catalina base:就是每个tomcat实例所拥有的备份,比如:conf 、logs、webapps、work文件夹下面的文件就是每个tomcat实例所独有的备份。
2. 初始化类加载器commonLoadercatalinaLoadersharedLoader。然后通过catalinaLoader 加载org.apache.catalina.startup.Catalina。在通过命令行传入参数(不传入默认就是start)。当传入参数是start 时,会在Bootstrapload()函数里面通过反射调用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.");            }

未完待续

1 0
原创粉丝点击