入行的時候,構建專案的工具為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
- 官網