Java項目打包與部署的完全指南(JAR vs WAR)
1. 引言
項目開發(fā)完成后,如何將其部署到服務(wù)器上,讓用戶能夠訪問?對于 Java 開發(fā)者而言,打包和部署是上線前最后、也是最關(guān)鍵的一步。Java 項目通常打包成兩種格式:JAR 和 WAR。選擇哪種包,以及如何部署,取決于項目類型、運行環(huán)境和團隊習(xí)慣。
本文將從零開始,帶你全面了解:
- ? JAR 包與 WAR 包的本質(zhì)區(qū)別和適用場景
- ? 使用 Maven/Gradle 打包的具體命令
- ? 部署 JAR 包的多種方式(前臺、后臺、參數(shù)配置)
- ? 部署 WAR 包到 Tomcat 的詳細(xì)步驟
- ? 部署流程全景圖與常見問題排查
無論你是剛?cè)腴T的開發(fā)者,還是需要負(fù)責(zé)上線任務(wù)的工程師,都能從中獲得實用的指導(dǎo)。
2. JAR vs WAR:核心區(qū)別

| 維度 | JAR 包 | WAR 包 |
|---|---|---|
| 全稱 | Java ARchive | Web Application ARchive |
| 包含內(nèi)容 | 類文件、依賴庫、配置文件(可能含內(nèi)嵌容器) | 類文件、依賴庫、配置文件、Web 資源(JSP/HTML) |
| 運行方式 | java -jar xxx.jar(獨立進程) | 放置在外部 Web 容器的 webapps 目錄下,啟動容器 |
| 適用場景 | Spring Boot / Spring Cloud 微服務(wù)、命令行工具 | 傳統(tǒng)單體 Web 應(yīng)用、需要部署在統(tǒng)一管理的 Tomcat 集群 |
| 容器依賴 | 無需安裝額外容器 | 必須預(yù)先安裝 Tomcat/Jetty/JBoss 等 |
| 啟動速度 | 快(直接啟動) | 相對慢(需啟動容器) |
| 資源占用 | 每個 JAR 獨立占用內(nèi)存 | 多個 WAR 可共享同一個容器進程 |
3. 打包前的準(zhǔn)備:項目類型判斷
在打包之前,先明確你的項目是什么類型:
- 如果是 Spring Boot 項目(默認(rèn)打包為 JAR,但也可配置為 WAR)
- 如果是 傳統(tǒng) Servlet/JSP 項目(通常打包為 WAR)
- 如果是 純工具類/批處理應(yīng)用(一定是 JAR)
可以通過 pom.xml(Maven)或 build.gradle(Gradle)中的打包配置判斷。
Maven 示例
<!-- 打包為 JAR --> <packaging>jar</packaging> <!-- 打包為 WAR --> <packaging>war</packaging>
Gradle 示例
// 打包為 JAR apply plugin: 'java' // 打包為 WAR apply plugin: 'war'
4. 打包命令詳解
4.1 Maven 項目
| 命令 | 作用 |
|---|---|
mvn clean | 刪除 target 目錄,清理舊文件 |
mvn compile | 編譯源代碼 |
mvn test | 運行測試用例 |
mvn package | 打包(生成 JAR/WAR 到 target 目錄) |
mvn install | 打包并安裝到本地 Maven 倉庫 |
mvn deploy | 打包并部署到遠(yuǎn)程倉庫(如 Nexus) |
常用組合:
# 跳過測試,快速打包 mvn clean package -DskipTests # 生成可執(zhí)行 JAR(需 Spring Boot Maven 插件) mvn clean package spring-boot:repackage
4.2 Gradle 項目
| 命令 | 作用 |
|---|---|
gradle clean | 刪除 build 目錄 |
gradle build | 編譯、測試、打包 |
gradle build -x test | 跳過測試打包 |
打包后的文件位置:
- Maven:
target/xxx.jar或target/xxx.war - Gradle:
build/libs/xxx.jar或build/libs/xxx.war
5. 部署 JAR 包
5.1 基本運行命令
java -jar app.jar
該命令會在前臺運行,按 Ctrl + C 會終止進程,關(guān)閉終端也會導(dǎo)致進程退出。
5.2 后臺運行(Linux/Unix)
nohup java -jar app.jar > app.log 2>&1 &
nohup:忽略掛斷信號,關(guān)閉終端后進程繼續(xù)運行> app.log:標(biāo)準(zhǔn)輸出重定向到文件2>&1:將錯誤輸出也重定向到同一個文件&:后臺運行
查看進程:ps -ef | grep app.jar
停止進程:kill -9 <PID>
5.3 指定參數(shù)
5.3.1 系統(tǒng)屬性(-D)
java -Dserver.port=8081 -Dspring.profiles.active=prod -jar app.jar
5.3.2 命令行參數(shù)(–)
Spring Boot 支持使用 -- 直接覆蓋配置:
java -jar app.jar --server.port=8081 --spring.datasource.url=jdbc:mysql://localhost:3306/mydb
5.3.3 外部配置文件
java -jar app.jar --spring.config.location=/path/to/application.yml
5.4 常見 JVM 調(diào)優(yōu)參數(shù)
java -Xms512m -Xmx2g -XX:+UseG1GC -jar app.jar
-Xms:初始堆內(nèi)存-Xmx:最大堆內(nèi)存-XX:+UseG1GC:使用 G1 垃圾回收器
5.5 使用 systemd 管理 JAR(生產(chǎn)推薦)
創(chuàng)建服務(wù)文件 /etc/systemd/system/myapp.service:
[Unit] Description=My Spring Boot Application After=network.target [Service] User=appuser ExecStart=/usr/bin/java -jar /opt/myapp/app.jar SuccessExitStatus=143 Restart=always [Install] WantedBy=multi-user.target
啟用并啟動:
systemctl daemon-reload systemctl enable myapp systemctl start myapp systemctl status myapp
6. 部署 WAR 包
6.1 部署到 Tomcat
步驟 1:安裝 Tomcat
# 下載并解壓 wget https://dlcdn.apache.org/tomcat/tomcat-9/v9.0.89/bin/apache-tomcat-9.0.89.tar.gz tar -xzf apache-tomcat-9.0.89.tar.gz cd apache-tomcat-9.0.89
步驟 2:放置 WAR 包
將生成的 .war 文件復(fù)制到 Tomcat 的 webapps 目錄下:
cp myapp.war /path/to/tomcat/webapps/
Tomcat 會自動解壓并部署(默認(rèn)會監(jiān)聽 8080 端口)。訪問地址:http://localhost:8080/myapp/
步驟 3:啟動 Tomcat
./bin/startup.sh # Linux # 或 ./bin/startup.bat # Windows
步驟 4:查看日志
tail -f logs/catalina.out
步驟 5:停止 Tomcat
./bin/shutdown.sh
6.2 部署優(yōu)化
- 配置虛擬路徑:修改
conf/server.xml,添加<Context>元素。 - 熱部署:將 WAR 放到
webapps后,Tomcat 會自動重新部署(但生產(chǎn)環(huán)境不建議)。 - 內(nèi)存配置:修改
bin/catalina.sh(或setenv.sh):
export JAVA_OPTS="-Xms512m -Xmx2g"
6.3 其他容器
- Jetty:將 WAR 放到
webapps目錄,運行java -jar start.jar - WebLogic / WebSphere:通過管理控制臺部署
7. 部署流程全景圖

8. 常用命令速查表
| 操作 | 命令 |
|---|---|
| Maven 打包(跳過測試) | mvn clean package -DskipTests |
| Gradle 打包 | gradle clean build |
| 運行 JAR(前臺) | java -jar app.jar |
| 運行 JAR(后臺) | nohup java -jar app.jar > /dev/null 2>&1 & |
| 指定端口運行 JAR | java -jar app.jar --server.port=8081 |
| 查看 JAR 進程 | ps -ef | grep java |
| 停止 JAR 進程 | kill -9 <PID> |
| 啟動 Tomcat | ./bin/startup.sh |
| 停止 Tomcat | ./bin/shutdown.sh |
| 查看 Tomcat 日志 | tail -f logs/catalina.out |
| 查看端口占用 | netstat -tlnp | grep 8080 |
9. 常見問題與解決方案
9.1 JAR 包運行提示 “no main manifest attribute”
原因:打包時沒有指定主類(Main-Class)。
解決(Spring Boot):確保 spring-boot-maven-plugin 已配置。
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>9.2 WAR 包部署后訪問 404
- 檢查
webapps下是否生成了同名目錄。 - 確認(rèn)訪問路徑:
http://ip:port/項目名/。 - 查看
logs/catalina.out是否有部署錯誤。
9.3 端口沖突
# 查看端口占用 netstat -anp | grep 8080 # 修改運行端口 java -jar app.jar --server.port=8081
9.4 內(nèi)存溢出(OOM)
增加堆內(nèi)存限制:
java -Xms1g -Xmx2g -jar app.jar
9.5 后臺運行的 JAR 如何查看實時日志?
tail -f app.log # 如果重定向到了文件 # 或使用 journalctl(systemd 管理時) journalctl -u myapp -f
10. 總結(jié)與最佳實踐
| 場景 | 推薦方式 |
|---|---|
| 微服務(wù)、云原生應(yīng)用 | JAR + systemd(或 Docker) |
| 傳統(tǒng)單體 Web 應(yīng)用,與運維統(tǒng)一管理 | WAR + Tomcat |
| 開發(fā)調(diào)試 | java -jar 前臺運行 |
| 生產(chǎn)環(huán)境 | systemd / supervisor 管理 JAR,或使用容器編排 |
| 需要動態(tài)調(diào)整參數(shù) | 使用 --spring.config.location 外部化配置 |
部署檢查清單:
- ? 打包前運行所有測試
- ? 使用
-DskipTests加速構(gòu)建(僅當(dāng)測試已覆蓋) - ? 配置 JVM 堆大小和垃圾回收器
- ? 將配置文件外置,避免重新打包
- ? 配置日志輪轉(zhuǎn)(如 logrotate)
- ? 設(shè)置健康檢查端點,配合監(jiān)控系統(tǒng)
以上就是Java項目打包與部署的完全指南(JAR vs WAR)的詳細(xì)內(nèi)容,更多關(guān)于Java項目打包與部署的資料請關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
springboot的controller中如何獲取applicatim.yml的配置值
本文介紹了在SpringBoot的Controller中獲取application.yml配置值的四種方式,并舉例說明了每種方式的使用場景和優(yōu)缺點,結(jié)合實例代碼給大家介紹的非常詳細(xì),感興趣的朋友跟隨小編一起看看吧2025-12-12
springboot配置druid多數(shù)據(jù)源的示例代碼
這篇文章主要介紹了springboot配置druid多數(shù)據(jù)源的示例代碼,本文通過實例代碼給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下2022-09-09
Spring AOP實現(xiàn)Redis緩存數(shù)據(jù)庫查詢源碼
這篇文章主要介紹了Spring AOP實現(xiàn)Redis緩存數(shù)據(jù)庫查詢的相關(guān)內(nèi)容,源碼部分還是不錯的,需要的朋友可以參考下。2017-09-09
一小時迅速入門Mybatis之Prepared Statement與符號的使用
這篇文章主要介紹了一小時迅速入門Mybatis之Prepared Statement與符號的使用,本文給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下2021-09-09
Java 異步線程監(jiān)聽與結(jié)果回調(diào)及異常捕獲總結(jié)分析
異常是程序之中導(dǎo)致程序中斷的一種指令流,異常一旦出現(xiàn)并且沒有進行合理處理的話,那么程序就將中斷執(zhí)行,這篇文章綜合介紹了異步線程監(jiān)聽與結(jié)果回調(diào)及異常捕獲2021-11-11
springBoot配置國產(chǎn)達夢數(shù)據(jù)庫的示例詳解
本文向大家介紹springBoot?配置國產(chǎn)達夢數(shù)據(jù)庫的相關(guān)知識,文章結(jié)合示例代碼給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下2022-04-04

