| 格式 | 全稱 | 核心內容 | 部署容器 | 層級 |
|---|---|---|---|---|
| JAR | Java Archive | .class、.properties、資源文件、META-INF/MANIFEST.MF | JVM / 應用服務器 (庫) | 最小單元 |
| WAR | Web Archive | Servlet、JSP、HTML/JS/CSS、JAR庫、web.xml、圖片等 Web 資源 | Servlet 容器 | Web 應用 |
| EAR | Enterprise Archive | 多個 JAR (EJB)、多個 WAR、application.xml、安全角色 | EJB 容器 / 全功能 Java EE 服務器 | 企業級應用 |
JAR:
my-lib.jar
├── com/example/Util.class
├── config.properties
└── META-INF/MANIFEST.MF
WAR:
my-web.war
├── index.jsp
├── WEB-INF/
│ ├── web.xml
│ ├── classes/ # 編譯後 .class
│ │ └── com/example/Controller.class
│ └── lib/ # 依賴 JAR
│ └── gson-2.8.6.jar
└── META-INF/MANIFEST.MF
EAR:
my-app.ear
├── META-INF/
│ └── application.xml # 核心部署描述符
├── ejb-module.jar # EJB JAR
├── web-module.war # Web WAR
└── util-lib.jar # 共用庫 JAR
MyEnterpriseApp
customer-ejb.jar
web.war
/myapp
admin
# 創建 (c) 詳情 (v) 文件 (f)
jar cvf mylib.jar -C build/classes . # 從 build/classes 打包所有
# 查看 (t)
jar tf mylib.jar
# 解壓 (x)
jar xf mylib.jar
# 可運行 JAR (指定 Main-Class)
jar cvfe myapp.jar com.example.Main -C build/classes .
java -jar myapp.jar
# 在 Web 根目錄下 (包含 WEB-INF)
jar cvf myweb.war .
# 或指定目錄
jar cvf myweb.war -C webapp_root .
# 1. 先打好 WAR 和 JAR
# 2. 準備 application.xml 放入 META-INF/
# 3. 打包 EAR
jar cvf myapp.ear myweb.war myejb.jar META-INF/application.xml
.war / .earMETA-INF/MANIFEST.MF,WinRAR 不會開發/調試階段:直接部署爆炸目錄 (Tomcat webapps/目錄),熱加載友好,別打 WAR
生產發布/交付:打包為 WAR,單文件部署、版本管理、CI/CD 流水線友好
通用工具類/庫:打 JAR,供多項目依賴 (Maven/Gradle 坐標)
# Maven
jar
war
ear
# Gradle
plugins { id 'java' } // JAR
plugins { id 'war' } // WAR
plugins { id 'ear' } // EAR
Maven/Gradle 自動處理依賴傳遞、清單屬性、目錄結構,強烈建議使用構建工具而非手動 jar 命令。
Excelsior JET (現已停止更新) 可將 Java 編譯為原生 EXE,但:
可運行 JAR + jlink 定製 JRE 或 GraalVM Native Image (現代方案)myweb.war 放入 $CATALINA_HOME/webapps/myweb/https://localhost:8080/myweb/autoDeploy、unpackWARs=false,手動解壓管理JAR = 庫/模塊,WAR = Web 應用,EAR = 企業級組合。現代微服務架構下,獨立可運行 JAR (Spring Boot Fat JAR) 逐漸取代傳統 WAR/EAR 部署模式,但理解三者結構對維護舊系統、Java EE 認證仍至關重要。