新手常問:「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` 目錄結構極易出錯,版本管理、回滾、分發極其困難。 |
專案源碼 (Maven/Gradle)
│
▼
構建工具編譯、打包 (mvn package / gradle war)
│
▼
生成 WAR 包 (myapp.war) ← 核心交付物
│
▼
複製到 $CATALINA_HOME/webapps/
│
▼
Tomcat 啟動 → 自動解壓 WAR → 部署為 Web 應用上下文
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
Eclipse/MyEclipse/IntelliJ IDEA 的「Deploy to Tomcat」本質上:
**WAR (Web Application Archive) 是 Java Web 交付的「集裝箱」**。它封裝了類別、資源、配置、依賴的完整契約。Tomcat 只認 WAR (或其解壓目錄)。請拋棄「放文件」思維,建立「構建產物 → 部署產物」的工程化流程觀。