SpringBoot文件之Build Tool Plugins的閱讀筆記

jackieathome發表於2024-08-18

入行的時候,構建專案的工具為Ant,後來在新專案中引入了Maven。
Ant類似於C語言,構建過程的每個環節,都需要詳細指定,雖然功能很強大,但是寫構建指令碼的過程,開發體驗和維護體驗比較差。
Maven類似於C++語言,基於專案模型、約定大於配置等理念,重新定義了構建過程,分離框架和外掛的互動和職責,同時基於座標和軟體倉庫提供了依賴管理能力,因此在迅速在各類專案中得到大力推廣。
Maven對於細節的掌控力沒有Ant好,對於已有專案,從Ant遷移到Maven時,涉及很多改造,比如原始碼位置、構建過程等遷移操作,初期工作量比較大,但後期改造完成之後,對於開發、維護的體驗有極大的提升。

依據官方文件Build Tool Plugins,Spring Boot提供了對Maven、Gradle、Ant的官方支援。
本文是對官方文件的閱讀筆記,摘取了一些關鍵內容,後續再補充驗證的結果。

Maven

  • Maven Plugin
    支援3.6.3及以後的版本。
    支援構建jar和war兩種釋出形態。

  • Getting Started

    修改pom.xml,增加如下配置:

    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
        </plugins>
    </build>
    
  • Using the Plugin
    增加屬性的定義,樣例配置,如下:

    <properties>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <java.version>17</java.version>
        <maven.compiler.source>${java.version}</maven.compiler.source>
        <maven.compiler.target>${java.version}</maven.compiler.target>
        <spring-boot-starter.version>3.3.2</spring-boot-starter.version>
    </properties>
    

    匯入SpringBoot的依賴配置。
    方法一:繼承SpringBoot的父POM,配置如下:

    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>${spring-boot-starter.version}</version>
    </parent>
    

    方法二:匯入依賴,配置如下:

    <dependencyManagement>
        <dependencies>
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-dependencies</artifactId>
                <version>${spring-boot-starter.version}</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
        </dependencies>
    </dependencyManagement>
    
  • Goals

  • Packaging Executable Archives
    使用spring-boot-starter-parent作為父POM時,只需要修改pom.xml,增加如下配置:

    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
        </plugins>
    </build>
    

    匯入spring-boot-dependencies依賴時,則需要手工指定構建目標。

    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
                <executions>
                    <execution>
                        <goals>
                            <goal>repackage</goal>
                        </goals>
                    </execution>
                </executions>
            </plugin>
        </plugins>
    </build>
    

    使用spring-boot-maven-plugin構建得到的jar檔案可以直接使用命令java -jar方式啟動,和構建目標repackage相關,官方說明如下:

    Repackage existing JAR and WAR archives so that they can be executed from the command line using java -jar.

  • Packaging OCI Images

  • Running your Application with Maven
    執行命令mvn spring-boot:run,執行程式。
    從來沒有這麼玩過,暫時沒有應用場景。

  • Ahead-of-Time Processing
    基於Spring AOT技術,依賴GraalVM。

    For instance, if you want to opt-in or opt-out for certain features, you need to configure the environment used at build time to do so.

    使用本特性,依據上述描述,推測需要放棄一些執行時的動態能力。
    使用方面的細節和注意事項,待後續有機會再深入體驗。

  • Running Integration Tests

  • Integrating with Actuator
    在構建目標檔案中增加META-INF/build-info.properties,使用spring-boot-starter-parent作為父POM時,只需要修改pom.xml,增加如下配置:

    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
                <executions>
                    <execution>
                        <goals>
                            <goal>build-info</goal>
                        </goals>
                        <configuration>
                            <additionalProperties>
                                <encoding.source>UTF-8</encoding.source>
                                <encoding.reporting>UTF-8</encoding.reporting>
                                <java.version>${java.version}</java.version>
                            </additionalProperties>
                        </configuration>
                    </execution>
                </executions>
            </plugin>
        </plugins>
    </build>
    
  • Help Information
    執行命令mvn spring-boot:help -Ddetail=true -Dgoal=<goal-name>,可以檢視指定構建目標的幫助資訊。

Gradle

  • Gradle Plugin

Apache Ant

  • Spring Boot AntLib Module

其它構建系統

  • Supporting Other Build Systems

參考資料

原始碼的編碼格式

  • 【Maven】修改編碼格式的多種方式
  • Maven ,命令列中,字元編碼 設定

依賴管理

  • Introduction to the Dependency Mechanism
  • Maven專案中pom檔案中的dependencyManagement,dependencies,dependency有什麼區別?
  • Maven 中的dependencyManagement和dependency的區別
  • Maven:<dependencyManagement>:依賴集中管理
  • Maven中的dependencyManagement 意義
  • Maven DependencyManagement:掌控依賴的終極利器
  • Differences between dependencyManagement and dependencies in Maven

GraalVM

  • 官網

相關文章