錯誤堆疊核心:
Caused by: java.lang.ClassNotFoundException: org.springframework.web.context.WebApplicationContext
這不是 Tomcat 本體壞了,而是Web 應用類別載入器找不到 Spring 核心類。常見誘因:
- 部署專案過多導致 Metaspace/PermGen 耗盡,類別卸載失敗,後續載入崩潰。
- 專案 `WEB-INF/lib` 缺少 `spring-web.jar`,或版本衝突(多個 Spring 版本共存)。
- Maven 依賴範圍錯誤:`spring-web` 標記為 `provided` 卻未在 Tomcat `lib` 目錄放置。
標準排查與修復流程
- 停止 Tomcat,刪除 `work/Catalina/localhost`、`temp`、`webapps` 下舊專案目錄與 `.war`。
- 檢查專案 `pom.xml`: 確認 `spring-web`、`spring-context` 為 `compile` 範圍,且版本統一 (如 `5.3.x`)。
- 調大 JVM 記憶體: `set CATALINA_OPTS=-Xms512m -Xmx2048m -XX:MetaspaceSize=256m -XX:MaxMetaspaceSize=512m` (Windows 用 `setenv.bat`,Linux 用 `setenv.sh`)。
- 乾淨重建: `mvn clean package -DskipTests` 產出新 WAR,放入 `webapps`,啟動觀察日誌。
進階診斷:若仍失敗
- 啟動時加 `-verbose:class` 觀察 `WebApplicationContext` 由哪個 JAR 載入。
- 執行 `mvn dependency:tree | grep spring-web` 排查傳遞性依賴衝突。
- 懷疑 JAR 損壞:刪除 `~/.m2/repository/org/springframework/spring-web` 強制重新下載。
口訣:清部署、調記憶體、對依賴、重啟——解決 90% Tomcat 啟動疑難雜症。