1. 程式人生 > 其它 >spring-boot-maven-plugin:介紹

spring-boot-maven-plugin:介紹

技術標籤:springbootspring boot後端

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-devtoolsoptinal設定為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-pluginmainClass引數對應的是 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的依賴