spring-boot-maven-plugin:介紹
spring-boot-maven-plugin是spring boot提供的maven打包外掛。可打直接可執行的jar包或war包。官方文件地址
使用2.2.1.RELEASE版本需要maven版本在2.0及以上,JDK在1.8及以上。
引入外掛
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId >spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
外掛中的maven目標
如圖,外掛提供了6個maven goal
- build-info:生成專案的構建資訊檔案 build-info.properties
- help:用於展示
spring-boot-maven-plugin
的幫助資訊。使用命令列mvn spring-boot:help -Ddetail=true -Dgoal=<goal-name>
可展示goal的引數描述資訊。 - repackage:可生成可執行的jar包或war包。外掛的核心goal。
- run:執行 Spring Boot 應用
- start:在整合測試階段,控制生命週期
- stop:在整合測試階段,控制生命週期
打包:repackage
將spring-boot-maven-plugin
引入pom,執行 mvn package
命令,即可打jar包(外掛預設打jar包),target資料夾裡的 *.jar
即為可執行jar包。
打包主要使用的是repackage goal,它是spring-boot-starter-parent
為外掛設定的預設goal。這個goal繫結在maven的 package生命週期上,完整命令為mvn package spring-boot:repackage
mvn package
執行打包之後,repackage 再次打包生成可執行的 jar包或war包。
預設情況下,repackage生成包的名稱與 mvn package
生成的原始包名稱相同,而原始包被重新命名為 *.origin
。若想修改生成jar包的名稱,請參考spring-boot-maven-plugin:打依賴包 中的方法。
repackage 命令生成的包,預設會包含專案引入的所有依賴,包括scope為provied的依賴,若除去provided依賴,請參考spring-boot-maven-plugin:打包時排除provided依賴。
若專案引入了spring-boot-devtools
,預設spring-boot-devtools
會被打在包裡,若想排除,應設定 repackage 的 excludeDevtools引數為true。在打war包時,還應將spring-boot-devtools
的optinal
設定為true
或將scope
設定為provided
。
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<executions>
<execution>
<id>repackage</id>
<configuration>
<excludeDevtools>true</excludeDevtools>
</configuration>
</execution>
</executions>
</plugin>
</plugins>
</build>
repackage 會在Manifest檔案中寫入Main-Class and Start-Class屬性。當預設值不能使程式正常執行時,可以通過外掛配置。Manifest檔案位於的META-INF資料夾中。
打可執行jar包時,示例如下:
Manifest-Version: 1.0
Archiver-Version: Plexus Archiver
Built-By: beauty
Start-Class: com.demo.beauty.BeautyApplication
Spring-Boot-Classes: BOOT-INF/classes/
Spring-Boot-Lib: BOOT-INF/lib/
Spring-Boot-Version: 2.2.1.RELEASE
Created-By: Apache Maven 3.6.3
Build-Jdk: 1.8.0_251
Main-Class: org.springframework.boot.loader.JarLauncher
對應的spring-boot-maven-plugin
配置如下:
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<configuration>
<mainClass>com.demo.beauty.BeautyApplication</mainClass>
</configuration>
</plugin>
</plugins>
</build>
可以看出,打可執行jar包時,spring-boot-maven-plugin
的mainClass
引數對應的是 Manifest 檔案中的Start-Class屬性,即專案的啟動類。
Manifest 檔案中的Main-Class屬性由外掛的 layout 決定。layout屬性值預設為jar/war。layout種類有
- JAR,即通常的可執行jar。Main-Class : org.springframework.boot.loader.JarLauncher
-
WAR,即通常的可執行war。Main-Class : org.springframework.boot.loader.warLauncher。為避免將war包部署在容器中執行時可能的衝突問題,provided型別的依賴都被放置在可執行war包的WEB-INF/lib-provided資料夾中,包括直接執行war需要的內建容器。
-
ZIP,亦可作DIR,類似於JAR。Main-Class : org.springframework.boot.loader.PropertiesLauncher
-
NONE,打包所有依賴庫和專案資源,但是不打包任何啟動器。可以看到在layout為NONE時,打出的包中的org資料夾沒有了,Manifest 檔案中沒有Start-Class屬性,Main-Class屬性值為專案的啟動類。
Manifest-Version: 1.0 Archiver-Version: Plexus Archiver Built-By: beauty Spring-Boot-Classes: BOOT-INF/classes/ Spring-Boot-Lib: BOOT-INF/lib/ Spring-Boot-Version: 2.2.1.RELEASE Created-By: Apache Maven 3.6.3 Build-Jdk: 1.8.0_251 Main-Class: com.demo.beauty.BeautyApplication
執行:run
run goal 可執行springboot專案,其預設將應用運行於 a forked process,通常方式設定的命令列引數不會對 run goal 啟動的程序產生影響。
-
直接使用run goal,不能使程式進入除錯模式,原因如上。除錯,或設定其他JVM 引數,應在外掛中配置
jvmArguments
。除錯程式的配置可參考spring-boot-maven-plugin:debug除錯程式 -
設定系統屬性和環境變數的方法: spring-boot-maven-plugin:新增系統屬性和環境變數
-
設定active profiles的方法:spring-boot-maven-plugin:設定active profiles
-
當將
fork
屬性為置為false時,run goal將直接通過 Maven JVM 執行專案(非官方建議做法),而不使用 a forked process。此時通過spring-boot-maven-plugin
外掛設定的的JVM引數(jvmArguments
), 系統屬性(systemPropertyVariables
),環境變數(environmentVariables
)和代理 (agents
)將不生效。 -
外掛支援資源熱更新,通過將
addResources
置為true來啟用熱更<plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> <configuration> <addResources>true</addResources> </configuration> </plugin>
啟用熱更後,執行時, src/main/resources 資料夾被加入類路徑, target/classes 資料夾下的副本被刪除。
構建專案的資源篩選不作用於熱更!
Spring Boot 1.3以後,官方推出了
spring-boot-devtools
工具,這個工具在熱更支援上體驗更好,所以spring-boot-maven-plugin
的熱更功能預設是關閉的。 -
與
repackage
goal 一致,run goal也將所有的依賴都放在類路徑中,包括scope為provided的依賴 -
若想在執行時包含scope為test的依賴,可以將
useTestClasspath
設定為true。注意,這隻影響run goal 不影響repackage goal,即打包時不會包含scope為test的依賴