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