Tomcat 5 作為經典 Servlet 容器,其啟動機制與目錄結構體現了 Java 類加載器層級隔離的核心設計。本文系統梳理目錄職責、類加載器體系、server.xml 組件模型及核心接口,助你透徹理解容器運作原理。
Tomcat 根目錄($CATALINA_HOME)下 9 大目錄各司其職:
startup.bat/sh、shutdown.bat/sh)。lib/ 存放 Tomcat 與所有 Web 應用共享的 JAR(如 Servlet API、JDBC 驅動)。lib/ 存放僅 Web 應用可見、Tomcat 不可見的 JAR。webapps/ 內置管理應用;lib/ 存放 Tomcat 內部實現 JAR,對 Web 應用不可見。設計精髓: 通過目錄隔離實現「可見性」控制,構建雙親委派模型的物理基礎。
啟動入口:startup.bat → org.apache.catalina.startup.Bootstrap。類加載器呈樹狀結構:
Bootstrap (JVM 核心庫 + $JAVA_HOME/jre/lib/ext/*.jar)
└─ System ($CATALINA_HOME/bin/bootstrap.jar + tools.jar)
└─ Common ($CATALINA_HOME/common/classes, lib, endorsed)
├─ Catalina ($CATALINA_HOME/server/classes, lib) // 僅 Tomcat 可見
└─ Shared ($CATALINA_HOME/shared/classes, lib) // 僅 WebApp 可見
└─ WebAppX (WEB-INF/classes, WEB-INF/lib) // 單一 WebApp 專用
servlet.jar、xerces.jar、JNDI 相關包等公共庫。注意:WebApp 類不應放此處。catalina.jar、Coyote、JK 連接器等容器核心實現,對 WebApp 完全不可見,保證容器內部實現隔離。WEB-INF/classes、WEB-INF/lib 載入,失敗才委派給父加載器。實現 WebApp 間類隔離,不同應用可使用同類庫不同版本。此順序確保 WebApp 自身類優先,避免容器庫污染應用。
server.xml 定義容器組件拓撲,四大元素類別:
| 類別 | 元素 | 角色 |
|---|---|---|
| 頂層元素 | <Server>, <Service> | JVM 入口、服務聚合 |
| 連接器 | <Connector> | 處理客戶端通訊(HTTP/AJP) |
| 容器元素 | <Engine>, <Host>, <Context> | 請求處理鏈:Engine→Host→Context |
| 嵌套元素 | <Valve>, <Realm>, <Logger> | 橫切關注點:日誌、安全、請求攔截 |
<Server> (監聽 shutdown 命令)
└─ <Service> (名稱唯一)
├─ <Connector> (一個或多個,如 HTTP/8080、AJP/8009)
└─ <Engine> (唯一,默認 defaultHost)
├─ <Host> (虛擬主機,name=localhost, appBase=webapps)
│ └─ <Context> (Web 應用,path=/myapp, docBase=...)
└─ <Context> (也可直接掛在 Engine 下)
WEB-INF/classes、lib 變更。<Context>,應放在 META-INF/context.xml 或 conf/[enginename]/[hostname]/ 下,便於熱部署與管理。Tomcat 組件遵循標準接口,支撐熱插拔與生命週期管理:
start()/stop(),所有主要組件實現。Engine → Host → Context → Wrapper。Wrapper 代表單個 Servlet,管理其生命週期。Valve 可檢查/修改 Request/Response、包裝對象、決定是否調用 invokeNext()。AccessLogValve 記錄訪問日誌。ClassLoader,實現類加載隔離。HELLOAPP/ ← Web 應用根目錄 (JSP, HTML, CSS, JS)
├─ WEB-INF/ ← 受保護目錄,客戶端不可直接訪問
│ ├─ web.xml ← 部署描述符 (Servlet、Filter、Listener 配置)
│ ├─ classes/ ← 編譯後的類文件 (包結構)
│ └─ lib/ ← 應用專用 JAR 包
此結構為 Servlet 規範強制要求,也是 WebAppClassLoader 掃描的基礎路徑。
Tomcat 5 通過「目錄隔離 + 類加載器樹 + 組件化接口」實現了:
理解這些機制,是排查 ClassNotFoundException、LinkageError、熱部署失效、安全配置等疑難雜癥的鑰匙。