Spring Boot Maven 插件如何構(gòu)建可執(zhí)行 JAR 的核心配置
前言
在 Java 生態(tài)中,Spring Boot 以其“約定優(yōu)于配置”的理念和開(kāi)箱即用的特性,成為現(xiàn)代應(yīng)用開(kāi)發(fā)的首選框架。而 spring-boot-maven-plugin 作為 Spring Boot 的核心插件,承擔(dān)著將應(yīng)用打包為可執(zhí)行 JAR/WAR 的關(guān)鍵角色。
一、插件的核心功能與目標(biāo)
1.1 插件的定位
spring-boot-maven-plugin 是 Spring Boot 提供的 Maven 插件,其核心目標(biāo)是:
- 可執(zhí)行包生成:將應(yīng)用及其依賴打包為獨(dú)立的 JAR/WAR 文件,支持通過(guò)
java -jar直接運(yùn)行。 - 生命周期管理:在集成測(cè)試階段啟動(dòng)/停止應(yīng)用,支持自動(dòng)化測(cè)試。
- 構(gòu)建信息管理:生成
build-info.properties文件,供 Actuator 等組件使用。 - 熱部署支持:與 Spring Boot DevTools 集成,實(shí)現(xiàn)代碼修改后的自動(dòng)重啟。
1.2 插件的 Goals(目標(biāo))
該插件定義了 5 個(gè)核心目標(biāo)(Goal),分別對(duì)應(yīng)不同的構(gòu)建階段:
| Goal | 作用 |
|---|---|
repackage | 在 mvn package 后重新打包,生成可執(zhí)行的 JAR/WAR(保留原始包為 .origin 文件)。 |
run | 通過(guò) mvn spring-boot:run 直接運(yùn)行應(yīng)用,無(wú)需顯式打包。 |
start | 在集成測(cè)試階段啟動(dòng)應(yīng)用(非阻塞),常用于測(cè)試前的初始化。 |
stop | 在集成測(cè)試完成后停止由 start 啟動(dòng)的應(yīng)用。 |
build-info | 生成 build-info.properties 文件,記錄項(xiàng)目版本、構(gòu)建時(shí)間等元信息。 |
1.3 插件定位
spring-boot-maven-plugin 是 Spring Boot 提供的官方 Maven 插件,其核心目標(biāo)是將 Spring Boot 應(yīng)用程序打包為可獨(dú)立運(yùn)行的 JAR 或 WAR 文件。與傳統(tǒng) Maven 打包方式不同,該插件生成的可執(zhí)行文件內(nèi)置了嵌入式服務(wù)器(如 Tomcat、Jetty),無(wú)需依賴外部容器即可運(yùn)行,極大簡(jiǎn)化了部署流程。
1.4 核心功能
- 可執(zhí)行文件打包:將應(yīng)用及其所有依賴打包為單一 JAR/WAR,支持
java -jar直接運(yùn)行。 - 生命周期管理:支持集成測(cè)試階段的應(yīng)用啟動(dòng)與停止。
- 開(kāi)發(fā)者工具集成:結(jié)合 Spring Boot DevTools 實(shí)現(xiàn)熱部署。
- 構(gòu)建信息生成:生成
build-info.properties文件,記錄項(xiàng)目元數(shù)據(jù)。
二、核心配置詳解
2.1 <mainClass>:指定入口類
<configuration>
<mainClass>com.example.Application</mainClass>
</configuration>- 作用:定義應(yīng)用的主類(包含
@SpringBootApplication注解的類)。 - 原理:插件會(huì)在生成的 JAR 包的
MANIFEST.MF中寫(xiě)入以下內(nèi)容:Main-Class: org.springframework.boot.loader.JarLauncher Start-Class: com.example.Application
- 注意事項(xiàng):
- 若未顯式配置,插件會(huì)自動(dòng)掃描項(xiàng)目中帶有
@SpringBootApplication的類。 - 對(duì)于多模塊項(xiàng)目,需確保主類路徑正確,避免沖突。
- 若未顯式配置,插件會(huì)自動(dòng)掃描項(xiàng)目中帶有
2.2 <skip>:跳過(guò)插件執(zhí)行
<configuration>
<skip>true</skip>
</configuration>- 作用:控制是否跳過(guò)
repackage等操作。 - 適用場(chǎng)景:
- 快速構(gòu)建時(shí)僅生成普通 JAR(如
mvn package后直接部署)。 - 調(diào)試階段避免重復(fù)打包。
- 快速構(gòu)建時(shí)僅生成普通 JAR(如
- 默認(rèn)值:
false。
2.3 <includeSystemScope>:包含系統(tǒng)依賴
<configuration>
<includeSystemScope>true</includeSystemScope>
</configuration>- 作用:是否將
system作用域的依賴(通過(guò)<systemPath>引入的本地 JAR)包含到最終包中。 - 風(fēng)險(xiǎn)提示:
- 系統(tǒng)依賴依賴于本地路徑,可能導(dǎo)致構(gòu)建不可移植。
- 建議:優(yōu)先使用
file或maven倉(cāng)庫(kù)管理依賴。
2.4 <layout>:定義打包格式
<configuration>
<layout>JAR</layout>
</configuration>支持的值:
值 描述 JAR可執(zhí)行 JAR,使用 JarLauncher啟動(dòng)(默認(rèn)值)。WAR可執(zhí)行 WAR,使用 WarLauncher啟動(dòng),需配置servlet容器。ZIP類似 JAR 的 ZIP 包,使用 PropertiesLauncher啟動(dòng)。NONE僅打包依賴,不包含 Spring Boot 啟動(dòng)器(不可執(zhí)行)。 MODULE打包依賴庫(kù)(排除 provided作用域),不包含啟動(dòng)器。選擇策略:
- Web 應(yīng)用優(yōu)先使用
WAR。 - 微服務(wù)或獨(dú)立應(yīng)用使用
JAR。 - 高度定制化場(chǎng)景選擇
NONE或MODULE。
- Web 應(yīng)用優(yōu)先使用
2.5 <executions>:綁定構(gòu)建生命周期
(1) repackage 目標(biāo)
<executions>
<execution>
<id>repackage</id>
<goals>
<goal>repackage</goal>
</goals>
</execution>
</executions>- 作用:將
repackage目標(biāo)綁定到package階段。 - 結(jié)果:執(zhí)行
mvn package后,插件會(huì)自動(dòng)生成可執(zhí)行包,并覆蓋原始包(保留為.origin文件)。 - 生成結(jié)構(gòu):
your-app.jar ├── META-INF/ │ └── MANIFEST.MF ├── org/springframework/boot/loader/ # 啟動(dòng)類 └── BOOT-INF/ ├── classes/ # 項(xiàng)目編譯后的類文件 └── lib/ # 所有依賴的 .jar 文件 - 執(zhí)行命令:
mvn clean package java -jar target/your-app.jar
(2) run 目標(biāo)
mvn spring-boot:run
- 作用:直接運(yùn)行 Spring Boot 應(yīng)用,無(wú)需打包。
- 適用場(chǎng)景:快速調(diào)試或開(kāi)發(fā)階段。
(3) start 與 stop 目標(biāo)
<execution>
<id>start</id>
<goals>
<goal>start</goal>
</goals>
</execution>
<execution>
<id>stop</id>
<goals>
<goal>stop</goal>
</goals>
</execution>- 作用:在集成測(cè)試階段啟動(dòng)/停止應(yīng)用。
- 典型流程:
mvn integration-test # 啟動(dòng)應(yīng)用 mvn verify # 停止應(yīng)用
(4) build-info 目標(biāo)
<execution>
<goals>
<goal>build-info</goal>
</goals>
</execution>- 作用:生成
build-info.properties文件,記錄項(xiàng)目版本、構(gòu)建時(shí)間等元數(shù)據(jù)。 - 文件內(nèi)容示例:
build.artifact=your-app build.name=your-app build.version=1.0.0 build.time=2025-07-13T18:14:03Z
三、高級(jí)配置與最佳實(shí)踐
3.1 多環(huán)境配置
通過(guò) <profiles> 動(dòng)態(tài)切換配置文件:
<profiles>
<profile>
<id>dev</id>
<properties>
<env>dev</env>
</properties>
</profile>
<profile>
<id>prod</id>
<properties>
<env>prod</env>
</properties>
</profile>
</profiles>結(jié)合資源過(guò)濾(resources 配置)實(shí)現(xiàn)不同環(huán)境的配置分離。
3.2 與 Spring Boot DevTools 集成
啟用熱部署(HotSwap):
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-devtools</artifactId>
<optional>true</optional>
</dependency>
</dependencies>- 效果:代碼修改后,應(yīng)用會(huì)自動(dòng)重啟(無(wú)需手動(dòng)執(zhí)行
mvn package)。
3.3 自定義構(gòu)建信息
通過(guò) build-info 目標(biāo)生成元數(shù)據(jù):
<execution>
<id>generate-build-info</id>
<goals>
<goal>build-info</goal>
</goals>
<phase>process-resources</phase>
</execution>生成的 build-info.properties 示例:
build.artifact=example-app build.name=example-app build.version=1.0.0 build.time=2025-07-13T22:00:09Z
四、典型配置示例
4.1 基礎(chǔ)配置
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<version>${spring-boot.version}</version>
<configuration>
<mainClass>com.example.Application</mainClass>
<skip>false</skip>
<includeSystemScope>false</includeSystemScope>
<layout>JAR</layout>
</configuration>
<executions>
<execution>
<id>repackage</id>
<goals>
<goal>repackage</goal>
</goals>
</execution>
</executions>
</plugin>4.2 高級(jí)配置(集成 DevTools 與多環(huán)境)
<profiles>
<profile>
<id>dev</id>
<properties>
<env>dev</env>
</properties>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<configuration>
<mainClass>com.example.Application</mainClass>
<layout>JAR</layout>
</configuration>
<executions>
<execution>
<id>repackage</id>
<goals>
<goal>repackage</goal>
</goals>
</execution>
</executions>
</plugin>
</plugins>
</build>
</profile>
</profiles>五、常見(jiàn)問(wèn)題與解決方案
5.1 啟動(dòng)類未正確識(shí)別
- 現(xiàn)象:運(yùn)行
java -jar app.jar報(bào)錯(cuò)No main manifest attribute。 - 原因:未正確配置
<mainClass>或自動(dòng)掃描失敗。 - 解決方案:
- 顯式配置
<mainClass>。 - 確保主類路徑正確(
src/main/java/com/example/Application.java)。 - 檢查
@SpringBootApplication注解是否缺失。
- 顯式配置
5.2 依賴沖突
- 現(xiàn)象:運(yùn)行時(shí)報(bào)錯(cuò)
java.lang.NoSuchMethodError。 - 原因:依賴版本不一致或存在多個(gè)同名 JAR。
- 解決方案:
- 使用
mvn dependency:tree分析依賴樹(shù)。 - 通過(guò)
<exclusions>排除沖突依賴。 - 升級(jí) Spring Boot 版本以獲取最新依賴管理。
- 使用
5.3 打包后體積過(guò)大
- 現(xiàn)象:生成的 JAR 文件體積異常龐大。
- 原因:包含大量未使用的依賴或重復(fù)資源。
- 解決方案:
- 使用
spring-boot-maven-plugin的exclude配置過(guò)濾無(wú)用依賴。 - 啟用
spring-boot:repackage的skip模式,僅打包必要依賴。
- 使用
六、總結(jié)
spring-boot-maven-plugin 是 Spring Boot 項(xiàng)目構(gòu)建的基石,其配置直接影響應(yīng)用的打包效率、運(yùn)行性能及維護(hù)成本。通過(guò)合理配置 <mainClass>、<layout>、<executions> 等參數(shù),開(kāi)發(fā)者可以靈活控制構(gòu)建流程,適配不同場(chǎng)景需求。同時(shí),結(jié)合 DevTools、多環(huán)境配置等高級(jí)特性,能夠顯著提升開(kāi)發(fā)效率與部署靈活性。
到此這篇關(guān)于Spring Boot Maven 插件如何構(gòu)建可執(zhí)行 JAR 的核心配置的文章就介紹到這了,更多相關(guān)Spring Boot Maven可執(zhí)行jar內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
- SpringBoot項(xiàng)目中Maven剔除無(wú)用Jar引用的最佳實(shí)踐
- Springboot 使用 maven-resources-plugin 打包變量替換jar沒(méi)有打包進(jìn)去、Jar包沒(méi)有被使用的解決方法
- springboot的maven多模塊混淆jar包的實(shí)現(xiàn)方法
- maven?springboot如何將jar包打包到指定目錄
- springboot maven 項(xiàng)目打包jar 最后名稱自定義的教程
- SpringBoot使用Maven打包異常-引入外部jar的問(wèn)題及解決方案
- maven+springboot打成jar包的方法
- Spring Boot Maven 打包可執(zhí)行Jar文件的實(shí)現(xiàn)方法
相關(guān)文章
Java Switch對(duì)各類型支持實(shí)現(xiàn)原理
這篇文章主要介紹了Java Switch對(duì)各類型支持實(shí)現(xiàn)原理,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-05-05
Mybatis-Plus默認(rèn)主鍵策略導(dǎo)致自動(dòng)生成19位長(zhǎng)度主鍵id的坑
這篇文章主要介紹了Mybatis-Plus默認(rèn)主鍵策略導(dǎo)致自動(dòng)生成19位長(zhǎng)度主鍵id的坑,本文一步步給大家分享解決方法,給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2021-12-12
從零搭建腳手架之集成Spring?Retry實(shí)現(xiàn)失敗重試和熔斷器模式(實(shí)戰(zhàn)教程)
在我們的大多數(shù)項(xiàng)目中,會(huì)有一些場(chǎng)景需要重試操作,而不是立即失敗,讓系統(tǒng)更加健壯且不易發(fā)生故障,這篇文章主要介紹了從零搭建開(kāi)發(fā)腳手架之集成Spring?Retry實(shí)現(xiàn)失敗重試和熔斷器模式,需要的朋友可以參考下2022-07-07
Druid(新版starter)在SpringBoot下的使用教程
Druid是Java語(yǔ)言中最好的數(shù)據(jù)庫(kù)連接池,Druid能夠提供強(qiáng)大的監(jiān)控和擴(kuò)展功能,DruidDataSource支持的數(shù)據(jù)庫(kù),這篇文章主要介紹了Druid(新版starter)在SpringBoot下的使用,需要的朋友可以參考下2023-05-05
java 學(xué)習(xí)筆記(入門篇)_java的基礎(chǔ)語(yǔ)法
從基礎(chǔ)語(yǔ)法開(kāi)始,這個(gè)語(yǔ)法你也可以理解為英語(yǔ)或是漢語(yǔ)里面的語(yǔ)法,只不過(guò)大家各有各的特點(diǎn)和區(qū)別;那么在學(xué)習(xí)的過(guò)程中我們就要不斷的積累重要的類和方法,這樣寫(xiě)程序就會(huì)方便快捷了,下面就開(kāi)始學(xué)習(xí)java的基礎(chǔ)語(yǔ)法2013-01-01
SpringBoot集成MongoDB的實(shí)現(xiàn)
本文主要介紹了SpringBoot集成MongoDB的實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2025-01-01

