SpringBoot使用Maven打包后運(yùn)行失敗的問(wèn)題解決詳解
前言
在使用 Spring Boot 開(kāi)發(fā)項(xiàng)目時(shí),我們通常會(huì)使用 Maven 作為構(gòu)建工具。Maven 負(fù)責(zé)依賴(lài)管理、編譯、打包等任務(wù)。但在實(shí)際開(kāi)發(fā)中,經(jīng)常遇到一個(gè)問(wèn)題:Spring Boot 項(xiàng)目在本地運(yùn)行正常,但使用 mvn package 打包成 JAR 后卻無(wú)法運(yùn)行或啟動(dòng)失敗。
本文將從多個(gè)角度分析常見(jiàn)錯(cuò)誤場(chǎng)景,并提供詳細(xì)的排查和解決方案,幫助你徹底解決 Spring Boot Maven 打包后運(yùn)行失敗的問(wèn)題。
一、問(wèn)題背景
Spring Boot 應(yīng)用默認(rèn)使用 spring-boot-maven-plugin 插件進(jìn)行打包,生成一個(gè)包含所有依賴(lài)的可執(zhí)行 JAR 文件(俗稱(chēng)“fat jar”)。然而,在某些情況下,構(gòu)建后的 JAR 文件可能缺少主類(lèi)、依賴(lài)未正確打包、配置文件缺失等問(wèn)題,導(dǎo)致運(yùn)行時(shí)報(bào)錯(cuò)。
二、常見(jiàn)錯(cuò)誤類(lèi)型及解決方案
1. 缺少主類(lèi)信息(no main manifest attribute)
現(xiàn)象
no main manifest attribute, in your-app.jar
原因
JAR 包中的 MANIFEST.MF 文件沒(méi)有指定主類(lèi)(Main-Class),Java 無(wú)法識(shí)別程序入口點(diǎn)。
解決方案
確保在 pom.xml 中正確配置了 spring-boot-maven-plugin 插件,并顯式指定主類(lèi):
<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,則可以直接啟用插件而無(wú)需額外配置:
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
驗(yàn)證方法
查看 JAR 包中的 MANIFEST 是否包含主類(lèi)信息:
unzip -p your-app.jar META-INF/MANIFEST.MF
2. 類(lèi)找不到(ClassNotFoundException / NoClassDefFoundError)
現(xiàn)象
java.lang.ClassNotFoundException: com.example.service.SomeService
原因
- 依賴(lài)未被正確打包進(jìn)最終的 JAR 文件
- 某些依賴(lài)的作用域設(shè)置為
provided或test - 沒(méi)有使用
spring-boot-maven-plugin插件
解決方案
確保依賴(lài)作用域正確:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
<!-- 不要使用 provided -->
</dependency>
使用 spring-boot-maven-plugin 進(jìn)行 repackage:
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<executions>
<execution>
<goals>
<goal>repackage</goal>
</goals>
</execution>
</executions>
</plugin>
查看 JAR 包中是否包含目標(biāo)類(lèi):
jar tf your-app.jar | grep SomeService.class
3. 配置文件未被打包或路徑不對(duì)
現(xiàn)象
應(yīng)用啟動(dòng)時(shí)報(bào)錯(cuò):
Could not load property source from location 'classpath:/application.properties'
原因
- 配置文件未放在標(biāo)準(zhǔn)目錄
src/main/resources下 - Maven 打包時(shí)未啟用資源過(guò)濾(filtering)
解決方案
- 將配置文件放在
src/main/resources目錄下 - 如果需要替換占位符(如
${my.property}),請(qǐng)啟用資源過(guò)濾:
<resources>
<resource>
<directory>src/main/resources</directory>
<filtering>true</filtering>
</resource>
</resources>
查看 JAR 包中是否包含配置文件:
jar tf your-app.jar | grep application.properties
4. 多模塊項(xiàng)目打包問(wèn)題
現(xiàn)象
子模塊依賴(lài)未正確打包,導(dǎo)致類(lèi)找不到或主程序找不到。
原因
- 子模塊未安裝到本地倉(cāng)庫(kù)
- 主模塊未正確聲明依賴(lài)關(guān)系
解決方案
在父項(xiàng)目的 pom.xml 中定義模塊順序:
<modules>
<module>common</module>
<module>web</module>
</modules>
在主模塊中添加對(duì)子模塊的依賴(lài):
<dependency>
<groupId>com.example</groupId>
<artifactId>common</artifactId>
<version>1.0.0</version>
</dependency>
構(gòu)建前先執(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 版本不一致導(dǎo)致的錯(cuò)誤
現(xiàn)象
java.lang.UnsupportedClassVersionError: major.minor version 61.0
原因
編譯環(huán)境與運(yùn)行環(huán)境使用的 Java 版本不一致。
解決方案
統(tǒng)一編譯與運(yùn)行環(huán)境的 JDK 版本,在 pom.xml 中指定編譯版本:
<properties>
<maven.compiler.source>17</maven.compiler.source>
<maven.compiler.target>17</maven.compiler.target>
</properties>
6. 打包命令使用錯(cuò)誤
現(xiàn)象
構(gòu)建的 JAR 文件缺失內(nèi)容或不可執(zhí)行
正確做法
使用以下命令進(jìn)行打包:
mvn clean package
確保 target/your-app.jar 是一個(gè)完整的、可執(zhí)行的 Spring Boot 應(yīng)用。
三、推薦的排查步驟
| 步驟 | 操作 | 說(shuō)明 |
|---|---|---|
| 1 | 查看日志 | 定位具體錯(cuò)誤堆棧 |
| 2 | 檢查 JAR 內(nèi)容 | jar tf your-app.jar |
| 3 | 檢查主類(lèi)信息 | unzip -p your-app.jar META-INF/MANIFEST.MF |
| 4 | 驗(yàn)證依賴(lài)完整性 | 查看 BOOT-INF/lib/ 目錄是否存在 |
| 5 | 本地測(cè)試運(yùn)行 | 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>
五、總結(jié)
| 問(wèn)題類(lèi)型 | 常見(jiàn)表現(xiàn) | 解決方案 |
|---|---|---|
| 缺少主類(lèi) | no main manifest attribute | 配置 <mainClass> |
| 類(lèi)找不到 | ClassNotFoundException | 檢查依賴(lài) + repackage |
| 配置文件缺失 | 找不到 application.properties | 放入 resources + filtering |
| 多模塊問(wèn)題 | 類(lèi)找不到 | 先 install 子模塊 |
| JDK 版本不一致 | UnsupportedClassVersionError | 統(tǒng)一 source/target JDK |
| 插件配置錯(cuò)誤 | 構(gòu)建失敗或不可執(zhí)行 | 正確使用 spring-boot-maven-plugin |
六、結(jié)語(yǔ)
Spring Boot + Maven 是現(xiàn)代 Java Web 開(kāi)發(fā)的標(biāo)準(zhǔn)組合,但打包過(guò)程中的細(xì)節(jié)容易出錯(cuò)。通過(guò)理解構(gòu)建流程、掌握關(guān)鍵插件的使用以及學(xué)會(huì)如何檢查 JAR 包內(nèi)容,你可以快速定位并修復(fù)大多數(shù)打包運(yùn)行失敗的問(wèn)題。
到此這篇關(guān)于SpringBoot使用Maven打包后運(yùn)行失敗的問(wèn)題解決詳解的文章就介紹到這了,更多相關(guān)SpringBoot Maven打包后運(yùn)行失敗解決內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
SpringBoot中ApplicationEvent和ApplicationListener用法小結(jié)
這篇文章介紹SpringBoot中ApplicationEvent用法,注意ApplicationEvent和MQ隊(duì)列雖然實(shí)現(xiàn)的功能相似,但是MQ還是有其不可替代性的,最本質(zhì)的區(qū)別就是MQ可以用于不同系統(tǒng)之間的消息發(fā)布,而SpringEvent這種模式只能在一個(gè)系統(tǒng)中,需要的朋友可以參考下2023-03-03
解析springboot整合谷歌開(kāi)源緩存框架Guava Cache原理
本文主要為大家解析了springboot整合谷歌開(kāi)源緩存框架Guava Cache的原理以及在實(shí)際開(kāi)發(fā)過(guò)程中的使用,附含源碼,有需要的朋友可以參考下2021-08-08
Java 實(shí)戰(zhàn)項(xiàng)目之在線(xiàn)點(diǎn)餐系統(tǒng)的實(shí)現(xiàn)流程
讀萬(wàn)卷書(shū)不如行萬(wàn)里路,只學(xué)書(shū)上的理論是遠(yuǎn)遠(yuǎn)不夠的,只有在實(shí)戰(zhàn)中才能獲得能力的提升,本篇文章手把手帶你用java+SSM+jsp+mysql+maven實(shí)現(xiàn)一個(gè)在線(xiàn)點(diǎn)餐系統(tǒng),大家可以在過(guò)程中查缺補(bǔ)漏,提升水平2021-11-11
SpringSecurityOAuth2實(shí)現(xiàn)微信授權(quán)登錄
微信的登錄功能是用戶(hù)注冊(cè)和使用微信的必經(jīng)之路之一,而微信授權(quán)登錄更是方便了用戶(hù)的登錄操作,本文主要介紹了SpringSecurityOAuth2實(shí)現(xiàn)微信授權(quán)登錄,感興趣的可以了解一下2023-09-09
mybatis-plus實(shí)體類(lèi)主鍵策略有3種(小結(jié))
這篇文章主要介紹了mybatis-plus實(shí)體類(lèi)主鍵策略有3種(小結(jié)),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2020-08-08
關(guān)于@GetMapping和@GetMapping(value=““)的區(qū)別
這篇文章主要介紹了關(guān)于@GetMapping和@GetMapping(value=““)的區(qū)別說(shuō)明,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-05-05

