Eclipse 通過 工作空間元數據模式 在 .metadata/.plugins/org.eclipse.wst.server.core/tmp{index} 下構建一個**獨立的 Tomcat 運行時實例**,包含 conf、webapps(即 wtpwebapps)、work、logs、temp 等目錄。專案以 Context 形式發布到此處,Tomcat 啟動時加載該實例的 server.xml 與 wtpwebapps。
Workspace Root (.metadata)
└── .plugins
└── org.eclipse.wst.server.core
└── tmp0 <-- Server 實例 0 (第一個 Tomcat)
├── conf <-- 複製/生成自 Tomcat 安裝目錄 conf
│ ├── server.xml <-- 端口、Host、Valve 配置(Eclipse 同步修改)
│ ├── web.xml <-- 全局 Servlet 映射
│ └── context.xml <-- 默認 Context 配置
├── logs <-- Tomcat 標準輸出/訪問日志
│ ├── catalina.yyyy-MM-dd.log
│ └── localhost_access_log.yyyy-MM-dd.txt
├── temp <-- 臨時文件(上傳文件緩存等)
├── work <-- JSP 編譯生成的 Servlet 源碼/類文件
│ └── Catalina
│ └── localhost
│ └── MyWeb
│ └── org
│ └── apache
│ └── jsp
└── wtpwebapps <-- **Web 應用發布根目錄 (appBase)**
└── MyWeb <-- 專案 Context Root
├── WEB-INF
│ ├── classes <-- Java 編譯輸出 (.class)
│ ├── lib <-- 依賴 JAR (Maven: WEB-INF/lib)
│ └── web.xml
├── index.jsp
├── css/
└── js/
| 模式 | 部署路徑 | 特點 | 適用場景 |
|---|---|---|---|
| Use Tomcat installation (默認,舊版) | $CATALINA_HOME/webapps | 直接修改安裝目錄;多專案共享一個 Tomcat 進程;易污染安裝目錄 | 單專案、簡單測試、不關心隔離 |
| Use workspace metadata (**推薦,現代默認**) | .metadata/.plugins/.../tmp{index}/wtpwebapps | **隔離性強**,每個 Server 視圖實例獨立運行時;不修改安裝目錄;支援多 Server 同時運行不同端口 | **日常開發、多專案並行、團隊標準** |
| Use custom location | 用戶指定目錄 | 完全可控,適合 CI/CD 腳本掛載、Docker 卷掛載 | 自動化部署、容器化、特殊合規要求 |
Tomcat v9.0 Server at localhost。wtpwebapps。Clean → Restart。專案 (Project)
├── src/main/java --(Java Builder)--> .class 文件
├── src/main/resources --(Resource Copy)--> .classpath 輸出目錄
├── src/main/webapp --(直接同步)--> WebContent 等價
│ ├── WEB-INF/web.xml
│ ├── WEB-INF/lib/ <-- Maven 依賴 (m2e 自動同步)
│ └── *.jsp, *.html, css, js
└── pom.xml --(m2e)--> Maven Dependencies Library
↓ Eclipse WTP 發布器 (Publisher)
↓ 增量同步 / 全量同步 (Clean 觸發全量)
wtpwebapps/MyWeb/
├── WEB-INF/classes/ <-- .class 文件 (必須在這裡 Tomcat 才能加載)
├── WEB-INF/lib/ <-- 依賴 JAR
├── WEB-INF/web.xml
└── 靜態資源...
WebContent/WEB-INF/classes(或 src/main/webapp/WEB-INF/classes),否則 Tomcat 類加載器找不到類 → 404/ClassNotFoundException。pom.xml <packaging>war</packaging> + m2e 插件自動將 compile/runtime 依賴發布到 WEB-INF/lib。src/main/webapp 下文件直接複製,無編譯過程。| 現象 | 根因定位路徑 | 解決 |
|---|---|---|
| 404 / ClassNotFoundException | 1. 檢查 wtpwebapps/MyWeb/WEB-INF/classes 是否有 .class2. Build Path 輸出目錄是否指向此處 3. Maven 依賴是否發布到 WEB-INF/lib | 修正 Build Path 輸出目錄;Maven 專案確保 m2e 啟用;Clean → Restart |
| JSP 修改不生效 | 1. work/Catalina/localhost/MyWeb/org/apache/jsp 是否有舊編譯類2. Context reloadable="true" 是否設置 | Clean Tomcat Work Directory;設置 reloadable;或 antiResourceLocking="true" |
| 靜態資源 (CSS/JS) 404 | 1. 文件是否在 src/main/webapp 下2. web.xml 是否有 DefaultServlet 映射 / | 確認專案結構;Spring MVC 需配置 <mvc:resources/> 或 configurer.enable() |
| 端口衝突 / 無法啟動 | 1. tmp0/conf/server.xml Connector port2. netstat -ano | findstr :8080 | 修改 Server 編輯器 Ports 區域;殺佔用進程 |
| Session 丟失 / 重啟後登出 | 1. Manager pathname="" 是否配置2. Context 是否 reloadable 導致重載 | 禁用 Session 持久化;生產環境用 Redis 共享 Session |
# 1. pom.xml 打包類型war # 2. 依賴範圍# 3. Eclipse 導入 File → Import → Existing Maven Projects → 選擇項目根目錄 # m2e 自動: # - 識別 src/main/webapp 為部署根目錄 # - 配置 Build Path 輸出到 target/classes → 發布映射到 WEB-INF/classes # - 管理 Dependencies → 發布 compile/runtime JAR 到 WEB-INF/lib # - 啟用 WAR 結構驗證 jakarta.servlet jakarta.servlet-api 5.0.0 provided
tmp{index},互不干擾。WEB-INF/classes,Maven 依賴 → WEB-INF/lib。Clean 強制全量同步;Clean Tomcat Work Directory 清理 JSP 緩存。server.xml 中的 Context,專案級配置放 META-INF/context.xml。看懂 wtpwebapps、Server Locations、Context、Build Path 輸出目錄 這四大核心概念及其映射關係,Eclipse 部署 404、熱更新失效、依賴缺失、端口衝突等疑難雜癥皆可迎刃而解。建議將本文目錄結構圖、模式對比表、排查路徑表製成團隊《Eclipse WTP 部署原理速查卡》,新人入職必讀。