首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 程式設計綜合問答

Tomcat 7 部署 WAR 卡住無報錯:排查思路與變通方案

     編輯:程式設計綜合問答

現象

  • 本地 Eclipse 直接運行專案正常。
  • 打包 WAR 放入測試機 webapps,startup.sh 後卡在部署階段,無錯誤日誌。
  • 同一 Tomcat 能跑其他專案。

常見原因排查清單

  1. 啟動卡在掃描 TLD/註解:metadata-complete="true" 未設於 web.xml,導致掃描大量 jar。
    解決:在 <web-app> 加 metadata-complete="true",或升級 Tomcat 8+。
  2. 資料庫連線池初始化阻塞:DataSource JNDI 查找、驅動載入、網路不通。
    檢查 context.xml、server.xml 資源定義,測試機防火牆/安全組。
  3. 靜態資源/類別載入死鎖:log4j、Spring 初始化順序問題。
    啟用 jstack 抓取執行緒堆疊分析。
  4. 檔案鎖定/權限:WAR 解壓失敗、temp 目錄無寫入權限。
    ls -l webapps/ 確認擁有者。
  5. JVM 參數不足:PermGen / Metaspace OOM 但未拋出錯誤。
    設定 CATALINA_OPTS="-Xms512m -Xmx1024m -XX:MaxMetaspaceSize=256m"。

變通方案(原採用)

  • 手動解壓 WAR:unzip app.war -d app。
  • 修改解壓後的設定檔(資料庫 IP、Redis 等)。
  • 直接啟動展開目錄(server.xml Context docBase="app")。

根因推測

測試環境與開發環境網路完全隔離,導致啟動期遠端呼叫(註冊中心、配置中心、資料庫)超時阻塞,且無超時保護或日誌輸出。

最佳實踐

  • 所有外部依賴啟動期連線必須設定連線/讀取超時(connectionTimeout, socketTimeout)。
  • 使用 Spring @Lazy 或 SmartLifecycle 延後非關鍵 Bean 初始化。
  • 部署腳本自動化(Ansible/Jenkins),包含健康檢查端點驗證。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved