構建
Spring Boot 包含了用於 Maven 和 Gradle 的構建外掛。本節回答了關於這些外掛的常見問題。
生成構建資訊
Maven 外掛和 Gradle 外掛都允許生成包含專案座標、名稱和版本的構建資訊。這些外掛也可以透過配置新增額外的屬性。當存在此類檔案時,Spring Boot 會自動配置一個 BuildProperties
bean。
要使用 Maven 生成構建資訊,請為 build-info
目標新增一個執行,示例如下
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<version>3.4.5</version>
<executions>
<execution>
<goals>
<goal>build-info</goal>
</goals>
</execution>
</executions>
</plugin>
</plugins>
</build>
有關更多詳細資訊,請參閱Spring Boot Maven 外掛文件。 |
以下示例使用 Gradle 實現相同功能
springBoot {
buildInfo()
}
有關更多詳細資訊,請參閱Spring Boot Gradle 外掛文件。 |
生成 Git 資訊
Maven 和 Gradle 都允許生成一個 git.properties
檔案,其中包含專案構建時 Git 原始碼倉庫的狀態資訊。
對於 Maven 使用者,spring-boot-starter-parent
POM 包含一個預配置的外掛用於生成 git.properties
檔案。要使用它,請在你的 POM 中新增以下 Git Commit Id Plugin
宣告
<build>
<plugins>
<plugin>
<groupId>io.github.git-commit-id</groupId>
<artifactId>git-commit-id-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
Gradle 使用者可以使用 gradle-git-properties
外掛實現相同的結果,示例如下
plugins {
id "com.gorylenko.gradle-git-properties" version "2.4.1"
}
Maven 和 Gradle 外掛都允許配置包含在 git.properties
中的屬性。
git.properties 中的提交時間應匹配以下格式:yyyy-MM-dd’T’HH:mm:ssZ 。這是上面列出的兩個外掛的預設格式。使用此格式可以將時間解析為 Date ,並且其在序列化為 JSON 時的格式由 Jackson 的日期序列化配置設定控制。 |
生成 CycloneDX SBOM
Maven 和 Gradle 都允許在專案構建時生成 CycloneDX SBOM。
對於 Maven 使用者,spring-boot-starter-parent
POM 包含一個預配置的外掛用於生成 SBOM。要使用它,請在你的 POM 中新增以下 cyclonedx-maven-plugin
宣告
<build>
<plugins>
<plugin>
<groupId>org.cyclonedx</groupId>
<artifactId>cyclonedx-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
Gradle 使用者可以使用 cyclonedx-gradle-plugin
外掛實現相同的結果,示例如下
plugins {
id 'org.cyclonedx.bom' version '1.10.0'
}
使用 Maven 建立可執行 JAR
spring-boot-maven-plugin
可用於建立可執行的“胖”JAR。如果你使用 spring-boot-starter-parent
POM,你可以宣告外掛,你的 jar 將按如下方式重新打包
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
如果你不使用父 POM,仍然可以使用該外掛。但是,你必須額外新增一個 <executions>
部分,如下所示
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<version>3.4.5</version>
<executions>
<execution>
<goals>
<goal>repackage</goal>
</goals>
</execution>
</executions>
</plugin>
</plugins>
</build>
有關完整的使用詳情,請參閱外掛文件。
將 Spring Boot 應用用作依賴
與 war 檔案類似,Spring Boot 應用不旨在用作依賴。如果你的應用包含希望與其他專案共享的類,推薦的方法是將這些程式碼移到一個單獨的模組中。然後你的應用和其他專案可以依賴該獨立模組。
如果無法按上述建議重新組織程式碼,則必須配置 Spring Boot 的 Maven 和 Gradle 外掛以生成適合用作依賴的單獨 artifact。可執行歸檔不能用作依賴,因為可執行 jar 格式將應用類打包在 BOOT-INF/classes
中。這意味著當可執行 jar 用作依賴時,無法找到這些類。
要生成兩個 artifact,一個可用作依賴,另一個是可執行的,必須指定一個分類器 (classifier)。此分類器將應用於可執行歸檔的名稱,而預設歸檔則用於依賴。
要在 Maven 中配置一個 exec
分類器,你可以使用以下配置
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<configuration>
<classifier>exec</classifier>
</configuration>
</plugin>
</plugins>
</build>
當可執行 Jar 執行時提取特定的庫
可執行 jar 中的大多數巢狀庫無需解壓即可執行。但是,某些庫可能會有問題。例如,JRuby 包含其自己的巢狀 jar 支援,它假定 jruby-complete.jar
始終可以直接作為檔案本身可用。
為了處理任何有問題的庫,你可以標記在可執行 jar 首次執行時應自動解壓特定的巢狀 jar。這些巢狀 jar 會被寫入由 java.io.tmpdir
系統屬性指定的臨時目錄下方。
應注意確保你的作業系統已配置,以便在應用仍在執行時不會刪除已解壓到臨時目錄的 jar 檔案。 |
例如,要指示應使用 Maven 外掛標記 JRuby 進行解壓,你需要新增以下配置
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<configuration>
<requiresUnpack>
<dependency>
<groupId>org.jruby</groupId>
<artifactId>jruby-complete</artifactId>
</dependency>
</requiresUnpack>
</configuration>
</plugin>
</plugins>
</build>
建立帶有排除項的非可執行 JAR
通常,如果你將可執行 jar 和非可執行 jar 作為兩個單獨的構建產品,則可執行版本會包含庫 jar 中不需要的額外配置檔案。例如,application.yaml
配置檔案可能從非可執行 JAR 中排除。
在 Maven 中,可執行 jar 必須是主 artifact,你可以按如下方式為庫新增一個帶有分類器的 jar
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
<plugin>
<artifactId>maven-jar-plugin</artifactId>
<executions>
<execution>
<id>lib</id>
<phase>package</phase>
<goals>
<goal>jar</goal>
</goals>
<configuration>
<classifier>lib</classifier>
<excludes>
<exclude>application.yaml</exclude>
</excludes>
</configuration>
</execution>
</executions>
</plugin>
</plugins>
</build>
在不使用 spring-boot-antlib 的情況下從 Ant 構建可執行歸檔
要使用 Ant 構建,你需要獲取依賴項、編譯,然後建立一個 jar 或 war 歸檔。要使其可執行,你可以使用 spring-boot-antlib
模組,或者你可以按照以下說明進行操作
-
如果你正在構建一個 jar,將應用的類和資源打包到巢狀的
BOOT-INF/classes
目錄中。如果你正在構建一個 war,將應用的類像往常一樣打包到巢狀的WEB-INF/classes
目錄中。 -
將執行時依賴項新增到 jar 的巢狀
BOOT-INF/lib
目錄或 war 的WEB-INF/lib
目錄中。請記住不要壓縮歸檔中的條目。 -
將 provided(嵌入式容器)依賴項新增到 jar 的巢狀
BOOT-INF/lib
目錄或 war 的WEB-INF/lib-provided
目錄中。請記住不要壓縮歸檔中的條目。 -
將
spring-boot-loader
類新增到歸檔的根目錄(以便Main-Class
可用)。 -
使用適當的啟動器(例如 jar 檔案的
JarLauncher
)作為 manifest 中的Main-Class
屬性,並透過設定Start-Class
屬性等方式指定其所需的其他 manifest 條目。
以下示例展示瞭如何使用 Ant 構建可執行歸檔
<target name="build" depends="compile">
<jar destfile="target/${ant.project.name}-${spring-boot.version}.jar" compress="false">
<mappedresources>
<fileset dir="target/classes" />
<globmapper from="*" to="BOOT-INF/classes/*"/>
</mappedresources>
<mappedresources>
<fileset dir="src/main/resources" erroronmissingdir="false"/>
<globmapper from="*" to="BOOT-INF/classes/*"/>
</mappedresources>
<mappedresources>
<fileset dir="${lib.dir}/runtime" />
<globmapper from="*" to="BOOT-INF/lib/*"/>
</mappedresources>
<zipfileset src="${lib.dir}/loader/spring-boot-loader-jar-${spring-boot.version}.jar" />
<manifest>
<attribute name="Main-Class" value="org.springframework.boot.loader.launch.JarLauncher" />
<attribute name="Start-Class" value="${start-class}" />
</manifest>
</jar>
</target>