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

Tomcat 部署核心:WAR 包才是標準投遞物,而非 .java/.class 檔案

     編輯:程式設計疑難解答

新手常問:「Tomcat `webapps` 目錄下放 `.java` 還是 `.class`?」答案都不是。**Java Web 專案的標準部署單元是 WAR 包**,它是包含編譯後類別、資源、配置、依賴庫的完整壓縮檔。本文釐清部署鏈路,建立正確的構建發布認知。

為什麼不是原始碼/字節碼?

形態問題
.java 源碼Tomcat 是 Servlet 容器,**非編譯器**,無法執行源碼。需先經 `javac` 編譯。
.class 字節碼單獨 `.class` 缺少 `web.xml`、靜態資源 (JSP/CSS/JS)、第三方 JAR 包、目錄結構規範 (`WEB-INF/classes`),容器無法識別為 Web 應用。
散落文件手動複製 `WEB-INF` 目錄結構極易出錯,版本管理、回滾、分發極其困難。

標準部署流程:源碼 → WAR → Tomcat

專案源碼 (Maven/Gradle)
       │
       ▼
構建工具編譯、打包 (mvn package / gradle war)
       │
       ▼
生成 WAR 包 (myapp.war)  ←  核心交付物
       │
       ▼
複製到 $CATALINA_HOME/webapps/
       │
       ▼
Tomcat 啟動 → 自動解壓 WAR → 部署為 Web 應用上下文

WAR 包內部標準結構

myapp.war
├── index.jsp
├── css/
├── js/
├── WEB-INF/
│   ├── web.xml              (Servlet 3.0+ 可選,註解替代)
│   ├── classes/             (編譯後 .class 文件,包結構對應)
│   │   └── com/example/...
│   └── lib/                 (第三方依賴 JAR: jdbc驅動、json庫、框架jar等)
└── META-INF/
    └── MANIFEST.MF

IDE 一鍵部署原理

Eclipse/MyEclipse/IntelliJ IDEA 的「Deploy to Tomcat」本質上:

  1. 調用構建工具 (Maven/Gradle) 或內建編譯器生成 `.class`。
  2. 組裝 `WEB-INF` 結構,**打包成 WAR** (或爆炸式部署目錄)。
  3. 複製到 Tomcat `webapps` 或配置 `Context docBase` 指向目標。
  4. 觸發 Tomcat 熱部署/重啟。

兩種部署模式

  • WAR 包部署 (生產標準):`cp myapp.war $CATALINA_HOME/webapps/`。單一文件,易分發、版本管理、回滾、CI/CD 集成。
  • 爆炸式部署 (開發調試):解壓 WAR 為目錄 `myapp/`,直接修改 JSP/靜態資源即時生效 (需 Tomcat `autoDeploy="true"` 或開發工具熱替換類)。

常見誤區辨析

  • ❌ 「把 `.class` 複製到 `webapps/ROOT/WEB-INF/classes` 就能跑」 → 缺 `web.xml`、缺 `lib` 依賴、缺靜態資源,絕大多數會 404/500。
  • ❌ 「JSP 放 `webapps` 根目錄就能訪問」 → 僅限默認上下文 (`ROOT`),多應用隔離需獨立 WAR/目錄。
  • ✅ **唯一正規路徑**:專案配置 `pom.xml`/`build.gradle` → `mvn clean package` → 產出 `target/*.war` → 部署。

總結

**WAR (Web Application Archive) 是 Java Web 交付的「集裝箱」**。它封裝了類別、資源、配置、依賴的完整契約。Tomcat 只認 WAR (或其解壓目錄)。請拋棄「放文件」思維,建立「構建產物 → 部署產物」的工程化流程觀。

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