这一章关注的重点是:Tomcat 如何使用 org.apache.catalina.startup 下面的Catalina 类和Bootstrap 类来启动的。
Catalina 类用来启动和停止一个服务器对象,并解析tomcat 的配置文件即web.xml (使用前一章的Digester)
Bootstrap 类创建一个Catalina 的实例,并调用它的process 方法(最新的版本已经废弃了这个方法)。
Tomcat 允许使用批处理文件(windows .bat)和shell 脚本(linux .sh)来启动和停止servlet 容器。
public static void main(String args[]) {
if (daemon == null) {
// Don't set daemon until init() has completed
Bootstrap bootstrap = new Bootstrap();
try {
bootstrap.init();
} catch (Throwable t) {
handleThrowable(t);
t.printStackTrace();
return;
}
daemon = bootstrap;
} else {
// When running as a service the call to stop will be on a new
// thread so make sure the correct class loader is used to prevent
// a range of class not found exceptions.
Thread.currentThread().setContextClassLoader(daemon.catalinaLoader);
}
try {
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.");
}
} catch (Throwable t) {
// Unwrap the Exception for clearer error reporting
if (t instanceof InvocationTargetException &&
t.getCause() != null) {
t = t.getCause();
}
handleThrowable(t);
t.printStackTrace();
System.exit(1);
}
}
deamon 就是一个Bootstrap 实例。
init() 方法主要是初始化类加载器。
然后bootstrap 会根据输入的命令来进行对应的操作。