Tomcat 核心啟動類為 org.apache.catalina.startup.Bootstrap,封裝於 %CATALINA_HOME%/bin/Bootstrap.jar。
REM startup.bat
java -jar Bootstrap.jar start
REM shutdown.bat
java -jar Bootstrap.jar stop
# startup.sh
java -jar Bootstrap.jar start
# shutdown.sh
java -jar Bootstrap.jar stop
public static void main(String[] args) {
// 1. JVM 版本檢查(需 J2SE 5.0+)
try { new ObjectName("test:foo=bar"); }
catch (Throwable t) {
System.out.println("需 J2SE 5.0 或更新版本...");
Thread.sleep(5000);
return;
}
// 2. 單例模式取得 Bootstrap 實例
if (daemon == null) {
daemon = new Bootstrap();
try { daemon.init(); }
catch (Throwable t) { t.printStackTrace(); return; }
}
// 3. 解析命令參數(預設 start)
String command = "start";
if (args.length > 0) command = args[args.length - 1];
try {
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); // 等待關閉信號
daemon.load(args);
daemon.start();
} else if (command.equals("stop")) { // 正常關閉
daemon.stopServer(args);
} else {
log.warn("未知命令: " + command);
}
} catch (Throwable t) { t.printStackTrace(); }
}
| 階段 | 方法 | 說明 |
|---|---|---|
| 初始化 | init() | 建立類載入器、解析 catalina.properties、註冊 MBean |
| 載入配置 | load(args) | 讀取 server.xml、建立 StandardServer、Engine、Host、Context 等組件樹 |
| 啟動 | start() | 啟動連接器、部署 Web 應用、啟動背景執行緒 |
| 等待 | setAwait(true) | 主執行緒阻塞等待關閉指令(預設 port 8005) |
| 關閉 | stop()/stopServer() | 觸發關閉鉤子、銷毀組件、釋放資源、關閉 JVM |
start:前景啟動,阻塞主執行緒(生產環境常用)startd:偵錯模式,便於 IDE 附著除錯stop:透過關閉埠發送 SHUTDOWN 指令stopd:偵錯模式關閉Bootstrap.init() 會建立三層類載入器:
commonLoader:$CATALINA_HOME/lib 共享庫catalinaLoader:Tomcat 內部類sharedLoader:應用共享庫(可選)若啟用 SecurityManager,啟動腳本需加入 -Djava.security.manager -Djava.security.policy==$CATALINA_BASE/conf/catalina.policy。
startup.sh/shutdown.sh 官方腳本(含環境變數設定、PID 檢查、日誌導向)java -jar Bootstrap.jar start 並捕獲標準輸出SIGTERM 觸發 shutdown 鉤子,避免 kill -9 強制終止