一. 概览
本文所涉及的Tomcat为6.0版本。
Tomcat的启动始于org.apache.catalina.startup.Bootstrap#main(),下面来列举一下相关的源代码:
- public static void main(String args[]) {
- if (daemon == null) {
- daemon = new Bootstrap();
- try {
- /* 初始化 */
- daemon.init();
- } catch (Throwable t) {
- t.printStackTrace();
- return;
- }
- }
- try {
- String command = "start";
- if (args.length > 0) {
- /* 最后一个命令行参数赋给command */
- command = args[args.length - 1];
- }
- if (command.equals("startd")) {
- args[0] = "start";
- daemon.load(args);
- daemon.start();
- } else if (command.equals("stopd")) {
- args[0] = "stop";
- daemon.stop();
- } else if (command.equals("start")) {
- daemon.setAwait(true);// 使用await
- daemon.load(args);// 载入守护线程
- daemon.start();// 开启容器
- } else if (command.equals("stop")) {
- daemon.stopServer(args);
- } else {
- log.warn("Bootstrap: command \"" + command + "\" does not exist.");
- }
- } catch (Throwable t) {
- t.printStackTrace();
- }
- }
public static void main(String args[]) { if (daemon == null) { daemon = new Bootstrap(); try { /* 初始化 */ daemon.init(); } catch (Throwable t) { t.printStackTrace(); return; } } try { String command = "start"; if (args.length > 0) { /* 最后一个命令行参数赋给command */ command = args[args.length - 1]; } if (command.equals("startd")) { args[0] = "start"; daemon.load(args); daemon.start(); } else if (command.equals("stopd")) { args[0] = "stop"; daemon.stop(); } else if (command.equals("start")) { daemon.setAwait(true);// 使用await daemon.load(args);// 载入守护线程 daemon.start();// 开启容器 } else if (command.equals("stop")) { daemon.stopServer(args); } else { log.warn("Bootstrap: command \"" + command + "\" does not exist."); } } catch (Throwable t) { t.printStackTrace(); } }
从整个main方法可以大致看出tomcat的启动过程,首先生成一个Bootstrap单例,然后调用它的init()方法,然后判断命令行参数,最后调用start()开启容器。
下面来逐一的研究下每一部分的具体行为。