Bootstrap
靜態類初始化過程:
- 加載工程目錄路徑
String userDir = System.getProperty("user.dir")
- 加載catalina.home目錄
String home = System.getProperty(Globals.CATALINA_HOME_PROP)
總結、檢查當前是否jvm傳入參數。如果傳入了就將他設置到系統變量中去。
Main啓動過程
- 創建啓動類的
Bootstrap bootstrap = new Bootstrap();
- 執行init方法
bootstrap.init()
org.apache.catalina.startup.Bootstrap#init()
public void init() throws Exception {
// init project
initClassLoaders();// //先初始化classLoader,包括common,catalina以及shared
Thread.currentThread().setContextClassLoader(catalinaLoader); // //設置當前線程classLoader
SecurityClassLoad.securityClassLoad(catalinaLoader); ////安全classLoader?
// Load our startup class and call its process() method
if (log.isDebugEnabled())
log.debug("Loading startup class");
//
Class<?> startupClass = catalinaLoader.loadClass("org.apache.catalina.startup.Catalina");
Object startupInstance = startupClass.getConstructor().newInstance();
// Set the shared extensions class loader
if (log.isDebugEnabled())
log.debug("Setting startup class properties");
String methodName = "setParentClassLoader";
Class<?> paramTypes[] = new Class[1];
paramTypes[0] = Class.forName("java.lang.ClassLoader");
Object paramValues[] = new Object[1];
paramValues[0] = sharedLoader;
Method method =
startupInstance.getClass().getMethod(methodName, paramTypes);
method.invoke(startupInstance, paramValues);
catalinaDaemon = startupInstance;
}
- 先初始化classLoader
- 創建Catalina
- 執行該方法進行賦值操作
started command
start
startd
stop
start
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();
if (null == daemon.getServer()) {
System.exit(1);
}
} 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.");
}
調用Catalina的start() 方法
public void start()
throws Exception {
if( catalinaDaemon==null ) init();
Method method = catalinaDaemon.getClass().getMethod("start", (Class [] )null);
method.invoke(catalinaDaemon, (Object [])null);
}
//TODO