首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> Java 程式設計 >> Java 相關知識

Tomcat 主目錄與虛擬目錄配置全攻略:server.xml、Context.xml 與熱部署機制

     編輯:Java 相關知識

核心概念

  • 主目錄:訪問 https://host:port/ 時對應的 Web 應用,Context path=""。
  • 虛擬目錄:訪問 https://host:port/ctx/ 時對應的 Web 應用,Context path="/ctx"。
  • Context 容器:Tomcat 單一 Web 應用的運行上下文,含類加載器、資源管理、Session 管理等。

三種配置方式優先級(高→低)

  1. $CATALINA_BASE/conf/[engine]/[host]/.xml(推薦,熱部署友好)
  2. $CATALINA_BASE/conf/server.xml 中 <Host> 內嵌 <Context>(需重啟生效)
  3. WebApp 內 META-INF/context.xml(打包進 WAR,不可外部修改)

方式一:獨立 Context.xml(生產環境首選)

主目錄配置

檔案:$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"/>

關鍵屬性詳解

屬性說明建議值
docBaseWeb 應用絕對路徑或相對 $CATALINA_BASE/webapps 路徑絕對路徑,避免歧義
path上下文路徑,主目錄為空字串 ""虛擬目錄以 / 開頭,如 /api
reloadable類文件變更自動重載(開發 true,生產 false)生產環境關閉
crossContext允許 ServletContext.getContext("/other") 跨應用訪問按需開啟
unpackWAR是否解壓 WAR 到工作目錄true(效能較好)
autoDeploy啟動時自動部署此 Contexttrue

熱部署與監控機制

  • Tomcat 定期掃描 $CATALINA_BASE/conf/Catalina/localhost/ 目錄下的 .xml 變更。
  • 新增/修改 XML → 自動重新部署對應 WebApp(reloadable="true" 時類變更也會觸發)。
  • 刪除 XML → 卸載 WebApp。
  • 注意:若同時在 server.xml 配置同名 Context,會產生衝突,以獨立 XML 為準。

常見坑與排查

現象原因解決
修改 server.xml 無效已存在同名 Context.xml 且優先級更高刪除 $CATALINA_BASE/conf/Catalina/localhost/ 下對應 XML
虛擬目錄 404path 屬性未以 / 開頭、docBase 路徑錯誤檢查 path="/cms"、docBase 絕對路徑存在
靜態資源不更新瀏覽器/代理緩存、Tomcat 靜態資源緩存加版本號、關閉生產環境 reloadable、配置 Cache-Control
跨應用 Session 共享失敗crossContext="false" 或 Session ID 不同開啟 crossContext、配置同域 Single Sign-On Valve

遷移建議:Tomcat 9/10+

  • 目錄結構不變,但 javax.servlet → jakarta.servlet 包名變更。
  • 建議將 DataSource 等資源定義在 context.xml 的 <Resource>,而非 server.xml <GlobalNamingResources>,便於應用級隔離。
  • 使用 Tomcat Maven/Gradle Plugin 開發期熱部署,生產交付 .war + Context.xml 分離包。

總結

採用獨立 Context.xml + 絕對路徑 docBase + 生產關閉 reloadable,是最穩健、可維護的 Tomcat 部署模式。將環境差異(資料庫、第三方服務)外部化至 Context 資源定義,實現「構建一次,到處部署」。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved