https://host:port/ 時對應的 Web 應用,Context path=""。https://host:port/ctx/ 時對應的 Web 應用,Context path="/ctx"。<Host> 內嵌 <Context>(需重啟生效)檔案:$CATALINA_BASE/conf/Catalina/localhost/ROOT.xml(大寫 ROOT)
<?xml version="1.0" encoding="UTF-8"?>
<Context
docBase="/opt/webapps/myapp"
path=""
reloadable="true"
crossContext="true">
<!-- 資料源、環境變量等 -->
<Resource name="jdbc/myDS" auth="Container" type="javax.sql.DataSource"
maxTotal="20" maxIdle="10" maxWaitMillis="-1"
username="dbuser" password="secret"
driverClassName="com.mysql.cj.jdbc.Driver"
url="jdbc:mysql://localhost:3306/mydb?useSSL=false"/>
</Context>
檔案:$CATALINA_BASE/conf/Catalina/localhost/cms.xml(小寫,對應 path)
<?xml version="1.0" encoding="UTF-8"?>
<Context
docBase="/opt/webapps/cms"
path="/cms"
reloadable="false"
crossContext="true"/>
| 屬性 | 說明 | 建議值 |
|---|---|---|
| docBase | Web 應用絕對路徑或相對 $CATALINA_BASE/webapps 路徑 | 絕對路徑,避免歧義 |
| path | 上下文路徑,主目錄為空字串 "" | 虛擬目錄以 / 開頭,如 /api |
| reloadable | 類文件變更自動重載(開發 true,生產 false) | 生產環境關閉 |
| crossContext | 允許 ServletContext.getContext("/other") 跨應用訪問 | 按需開啟 |
| unpackWAR | 是否解壓 WAR 到工作目錄 | true(效能較好) |
| autoDeploy | 啟動時自動部署此 Context | true |
$CATALINA_BASE/conf/Catalina/localhost/ 目錄下的 .xml 變更。reloadable="true" 時類變更也會觸發)。server.xml 配置同名 Context,會產生衝突,以獨立 XML 為準。| 現象 | 原因 | 解決 |
|---|---|---|
| 修改 server.xml 無效 | 已存在同名 Context.xml 且優先級更高 | 刪除 $CATALINA_BASE/conf/Catalina/localhost/ 下對應 XML |
| 虛擬目錄 404 | path 屬性未以 / 開頭、docBase 路徑錯誤 | 檢查 path="/cms"、docBase 絕對路徑存在 |
| 靜態資源不更新 | 瀏覽器/代理緩存、Tomcat 靜態資源緩存 | 加版本號、關閉生產環境 reloadable、配置 Cache-Control |
| 跨應用 Session 共享失敗 | crossContext="false" 或 Session ID 不同 | 開啟 crossContext、配置同域 Single Sign-On Valve |
javax.servlet → jakarta.servlet 包名變更。context.xml 的 <Resource>,而非 server.xml <GlobalNamingResources>,便於應用級隔離。Tomcat Maven/Gradle Plugin 開發期熱部署,生產交付 .war + Context.xml 分離包。採用獨立 Context.xml + 絕對路徑 docBase + 生產關閉 reloadable,是最穩健、可維護的 Tomcat 部署模式。將環境差異(資料庫、第三方服務)外部化至 Context 資源定義,實現「構建一次,到處部署」。