問題一:JAR包缺少主清單屬性
問題描述
在使用 java -jar
命令啟動Spring Boot項目時,遇到以下錯誤:
demo-service.jar中沒有主清單屬性
問題原因
- pom.xml 中 spring-boot-maven-plugin 配置不正確
- 打包時跳過了主清單文件的生成
- 主類(Main Class)配置缺失或錯誤
解決方案
- 檢查并修正 pom.xml 配置
<build><plugins><plugin><groupId>org.springframework.boot</groupId><artifactId>spring-boot-maven-plugin</artifactId><version>${spring-boot.version}</version><configuration><!-- 指定主類 --><mainClass>com.example.demo.DemoApplication</mainClass><!-- 刪除 skip 配置,或設置為 false --><!-- <skip>true</skip> --></configuration><executions><execution><id>repackage</id><goals><goal>repackage</goal></goals></execution></executions></plugin></plugins>
</build>
- 驗證主類是否存在
- 確保主類路徑正確
- 檢查主類是否包含 main 方法
- 確保包名與配置一致
- 重新打包
# 清理之前的構建
mvn clean# 打包(跳過測試)
mvn package -DskipTests
- 驗證JAR包
# 查看 MANIFEST.MF 內容
jar tvf target/demo-service.jar | grep MANIFEST
# 或
unzip -p target/demo-service.jar META-INF/MANIFEST.MF
問題二:JAR包名稱不正確
問題描述
打包后的 JAR 文件名稱與預期不符,導致部署腳本無法正確找到和執行 JAR 文件。
問題原因
- pom.xml 中的 artifactId 與期望的文件名不一致
- 未指定最終的打包名稱
解決方案
- 設置固定的最終名稱
<build><!-- 直接指定最終文件名 --><finalName>demo-service</finalName><plugins><!-- ... 其他插件配置 ... --></plugins>
</build>
- 使用項目屬性動態設置
<properties><final.name>demo-service</final.name>
</properties><build><finalName>${final.name}</finalName>
</build>
- 驗證打包結果
# 檢查生成的文件
ls -l target/demo-service.jar
最佳實踐
1. 項目配置檢查清單
- pom.xml 中包含 spring-boot-maven-plugin
- 正確配置了主類路徑
- 移除了 skip 配置或設置為 false
- 指定了正確的打包文件名
- 所有必要的依賴都已聲明
2. 打包流程
# 1. 清理舊的構建文件
mvn clean# 2. 編譯和打包
mvn package -DskipTests# 3. 驗證生成的文件
ls -l target/*.jar# 4. 檢查 MANIFEST.MF
jar tvf target/demo-service.jar | grep MANIFEST# 5. 測試運行
java -jar target/demo-service.jar --spring.profiles.active=prod
3. 部署步驟
# 1. 創建部署目錄
mkdir -p /opt/demo-service# 2. 復制文件
cp target/demo-service.jar /opt/demo-service/
cp service.sh /opt/demo-service/# 3. 設置權限
chmod +x /opt/demo-service/service.sh# 4. 啟動服務
cd /opt/demo-service
./service.sh start# 5. 檢查狀態
./service.sh status
4. 常用調試命令
# 查看 JAR 包內容
jar tvf demo-service.jar# 查看日志
tail -f app.log# 檢查進程
ps -ef | grep demo-service# 檢查端口
netstat -nltp | grep 8080
注意事項
-
打包相關
- 確保使用正確版本的 JDK
- 注意 spring-boot-maven-plugin 的版本與 Spring Boot 版本匹配
- 打包時建議先執行 clean 清理舊文件
-
部署相關
- 確保目標服務器有足夠的磁盤空間
- 檢查 JVM 參數配置是否合適
- 注意文件權限設置
-
運行相關
- 使用正確的 Spring profiles
- 確保配置文件中的端口未被占用
- 設置適當的日志級別便于排查問題
這個教程涵蓋了 Spring Boot 項目打包部署中最常見的兩個問題及其解決方案,希望能幫助大家更好地處理類似問題。如果遇到其他問題,也可以參考這個思路進行排查和解決。