SpringBoot使用Maven打包后運行失敗的問題解決詳解
前言
在使用 Spring Boot 開發(fā)項目時,我們通常會使用 Maven 作為構建工具。Maven 負責依賴管理、編譯、打包等任務。但在實際開發(fā)中,經常遇到一個問題:Spring Boot 項目在本地運行正常,但使用 mvn package 打包成 JAR 后卻無法運行或啟動失敗。
本文將從多個角度分析常見錯誤場景,并提供詳細的排查和解決方案,幫助你徹底解決 Spring Boot Maven 打包后運行失敗的問題。
一、問題背景
Spring Boot 應用默認使用 spring-boot-maven-plugin 插件進行打包,生成一個包含所有依賴的可執(zhí)行 JAR 文件(俗稱“fat jar”)。然而,在某些情況下,構建后的 JAR 文件可能缺少主類、依賴未正確打包、配置文件缺失等問題,導致運行時報錯。
二、常見錯誤類型及解決方案
1. 缺少主類信息(no main manifest attribute)
現象
no main manifest attribute, in your-app.jar
原因
JAR 包中的 MANIFEST.MF 文件沒有指定主類(Main-Class),Java 無法識別程序入口點。
解決方案
確保在 pom.xml 中正確配置了 spring-boot-maven-plugin 插件,并顯式指定主類:
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<configuration>
<mainClass>com.example.demo.DemoApplication</mainClass>
</configuration>
<executions>
<execution>
<goals>
<goal>repackage</goal>
</goals>
</execution>
</executions>
</plugin>
</plugins>
</build>
或者,如果你使用的是 Spring Boot 的 parent POM,則可以直接啟用插件而無需額外配置:
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
驗證方法
查看 JAR 包中的 MANIFEST 是否包含主類信息:
unzip -p your-app.jar META-INF/MANIFEST.MF
2. 類找不到(ClassNotFoundException / NoClassDefFoundError)
現象
java.lang.ClassNotFoundException: com.example.service.SomeService
原因
- 依賴未被正確打包進最終的 JAR 文件
- 某些依賴的作用域設置為
provided或test - 沒有使用
spring-boot-maven-plugin插件
解決方案
確保依賴作用域正確:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
<!-- 不要使用 provided -->
</dependency>
使用 spring-boot-maven-plugin 進行 repackage:
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<executions>
<execution>
<goals>
<goal>repackage</goal>
</goals>
</execution>
</executions>
</plugin>
查看 JAR 包中是否包含目標類:
jar tf your-app.jar | grep SomeService.class
3. 配置文件未被打包或路徑不對
現象
應用啟動時報錯:
Could not load property source from location 'classpath:/application.properties'
原因
- 配置文件未放在標準目錄
src/main/resources下 - Maven 打包時未啟用資源過濾(filtering)
解決方案
- 將配置文件放在
src/main/resources目錄下 - 如果需要替換占位符(如
${my.property}),請啟用資源過濾:
<resources>
<resource>
<directory>src/main/resources</directory>
<filtering>true</filtering>
</resource>
</resources>
查看 JAR 包中是否包含配置文件:
jar tf your-app.jar | grep application.properties
4. 多模塊項目打包問題
現象
子模塊依賴未正確打包,導致類找不到或主程序找不到。
原因
- 子模塊未安裝到本地倉庫
- 主模塊未正確聲明依賴關系
解決方案
在父項目的 pom.xml 中定義模塊順序:
<modules>
<module>common</module>
<module>web</module>
</modules>
在主模塊中添加對子模塊的依賴:
<dependency>
<groupId>com.example</groupId>
<artifactId>common</artifactId>
<version>1.0.0</version>
</dependency>
構建前先執(zhí)行:
mvn clean install
主模塊中使用 spring-boot-maven-plugin 插件重新打包:
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<executions>
<execution>
<goals>
<goal>repackage</goal>
</goals>
</execution>
</executions>
</plugin>
5. JDK 版本不一致導致的錯誤
現象
java.lang.UnsupportedClassVersionError: major.minor version 61.0
原因
編譯環(huán)境與運行環(huán)境使用的 Java 版本不一致。
解決方案
統一編譯與運行環(huán)境的 JDK 版本,在 pom.xml 中指定編譯版本:
<properties>
<maven.compiler.source>17</maven.compiler.source>
<maven.compiler.target>17</maven.compiler.target>
</properties>
6. 打包命令使用錯誤
現象
構建的 JAR 文件缺失內容或不可執(zhí)行
正確做法
使用以下命令進行打包:
mvn clean package
確保 target/your-app.jar 是一個完整的、可執(zhí)行的 Spring Boot 應用。
三、推薦的排查步驟
| 步驟 | 操作 | 說明 |
|---|---|---|
| 1 | 查看日志 | 定位具體錯誤堆棧 |
| 2 | 檢查 JAR 內容 | jar tf your-app.jar |
| 3 | 檢查主類信息 | unzip -p your-app.jar META-INF/MANIFEST.MF |
| 4 | 驗證依賴完整性 | 查看 BOOT-INF/lib/ 目錄是否存在 |
| 5 | 本地測試運行 | java -jar your-app.jar |
四、完整示例:pom.xml 配置模板
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.example</groupId>
<artifactId>demo</artifactId>
<version>1.0.0</version>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>3.3.1</version>
<relativePath/>
</parent>
<properties>
<maven.compiler.source>17</maven.compiler.source>
<maven.compiler.target>17</maven.compiler.target>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
</dependencies>
<build>
<resources>
<resource>
<directory>src/main/resources</directory>
<filtering>true</filtering>
</resource>
</resources>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<configuration>
<mainClass>com.example.demo.DemoApplication</mainClass>
</configuration>
<executions>
<execution>
<goals>
<goal>repackage</goal>
</goals>
</execution>
</executions>
</plugin>
</plugins>
</build>
</project>
五、總結
| 問題類型 | 常見表現 | 解決方案 |
|---|---|---|
| 缺少主類 | no main manifest attribute | 配置 <mainClass> |
| 類找不到 | ClassNotFoundException | 檢查依賴 + repackage |
| 配置文件缺失 | 找不到 application.properties | 放入 resources + filtering |
| 多模塊問題 | 類找不到 | 先 install 子模塊 |
| JDK 版本不一致 | UnsupportedClassVersionError | 統一 source/target JDK |
| 插件配置錯誤 | 構建失敗或不可執(zhí)行 | 正確使用 spring-boot-maven-plugin |
六、結語
Spring Boot + Maven 是現代 Java Web 開發(fā)的標準組合,但打包過程中的細節(jié)容易出錯。通過理解構建流程、掌握關鍵插件的使用以及學會如何檢查 JAR 包內容,你可以快速定位并修復大多數打包運行失敗的問題。
到此這篇關于SpringBoot使用Maven打包后運行失敗的問題解決詳解的文章就介紹到這了,更多相關SpringBoot Maven打包后運行失敗解決內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
SpringBoot中ApplicationEvent和ApplicationListener用法小結
這篇文章介紹SpringBoot中ApplicationEvent用法,注意ApplicationEvent和MQ隊列雖然實現的功能相似,但是MQ還是有其不可替代性的,最本質的區(qū)別就是MQ可以用于不同系統之間的消息發(fā)布,而SpringEvent這種模式只能在一個系統中,需要的朋友可以參考下2023-03-03
解析springboot整合谷歌開源緩存框架Guava Cache原理
本文主要為大家解析了springboot整合谷歌開源緩存框架Guava Cache的原理以及在實際開發(fā)過程中的使用,附含源碼,有需要的朋友可以參考下2021-08-08
關于@GetMapping和@GetMapping(value=““)的區(qū)別
這篇文章主要介紹了關于@GetMapping和@GetMapping(value=““)的區(qū)別說明,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2022-05-05

