建置

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.3.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 檔案。若要使用它,請將 Git Commit Id Plugin 的下列宣告新增至您的 POM

<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。若要使用它,請將 cyclonedx-maven-plugin 的下列宣告新增至您的 POM

<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.8.2'
}

自訂依賴版本

spring-boot-dependencies POM 管理常見依賴的版本。用於 Maven 和 Gradle 的 Spring Boot 外掛程式允許使用建置屬性自訂這些受管理的依賴版本。

每個 Spring Boot 版本都是針對這組特定的第三方依賴設計和測試的。覆寫版本可能會導致相容性問題。

若要使用 Maven 覆寫依賴版本,請參閱 Maven 外掛程式文件中的 使用外掛程式

若要使用 Gradle 覆寫依賴版本,請參閱 Gradle 外掛程式文件中的 自訂管理的版本

使用 Maven 建立可執行 JAR

spring-boot-maven-plugin 可用於建立可執行的 “fat” JAR。如果您使用 spring-boot-starter-parent POM,您可以宣告外掛程式,並且您的 jar 將重新封裝,如下所示

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

如果您不使用 parent POM,您仍然可以使用此外掛程式。但是,您還必須新增一個 <executions> 區段,如下所示

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

如需完整的使用詳細資訊,請參閱外掛程式文件

將 Spring Boot 應用程式用作依賴

如同 war 檔案,Spring Boot 應用程式不適合用作依賴。如果您的應用程式包含您想要與其他專案共用的類別,建議的方法是將該程式碼移至個別模組。然後,您的應用程式和其他專案可以依賴該個別模組。

如果您無法依照上述建議重新安排您的程式碼,則必須將 Spring Boot 的 Maven 和 Gradle 外掛程式設定為產生適合用作依賴的個別工件。可執行歸檔不能用作依賴,因為 可執行 jar 格式 將應用程式類別封裝在 BOOT-INF/classes 中。這表示當可執行 jar 用作依賴時,找不到它們。

若要產生兩個工件,一個可以用作依賴,另一個是可執行的,則必須指定分類器。此分類器會套用至可執行歸檔的名稱,保留預設歸檔以用作依賴。

若要在 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 中不需要的其他組態檔案。例如,application.yaml 組態檔案可能會從非可執行 JAR 中排除。

在 Maven 中,可執行 jar 必須是主要工件,您可以為程式庫新增分類的 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>

遠端偵錯使用 Maven 啟動的 Spring Boot 應用程式

若要將遠端偵錯工具附加到使用 Maven 啟動的 Spring Boot 應用程式,您可以使用 maven 外掛程式jvmArguments 屬性。

如需更多詳細資訊,請參閱 此範例

從 Ant 建置可執行歸檔,而無需使用 spring-boot-antlib

若要使用 Ant 建置,您需要抓取依賴、編譯,然後建立 jar 或 war 歸檔。若要使其可執行,您可以選擇使用 spring-boot-antlib 模組,也可以遵循這些指示

  1. 如果您正在建置 jar,請將應用程式的類別和資源封裝在巢狀 BOOT-INF/classes 目錄中。如果您正在建置 war,請依照慣例將應用程式的類別封裝在巢狀 WEB-INF/classes 目錄中。

  2. 將執行時期依賴新增至 jar 的巢狀 BOOT-INF/lib 目錄或 war 的 WEB-INF/lib。請記住不要壓縮歸檔中的項目。

  3. provided (嵌入式容器) 依賴新增至 jar 的巢狀 BOOT-INF/lib 目錄或 war 的 WEB-INF/lib-provided。請記住不要壓縮歸檔中的項目。

  4. spring-boot-loader 類別新增至歸檔的根目錄 (以便 Main-Class 可用)。

  5. 使用適當的啟動器 (例如 jar 檔案的 JarLauncher) 作為 manifest 中的 Main-Class 屬性,並指定它需要的其他屬性作為 manifest 項目 — 主要是透過設定 Start-Class 屬性。

下列範例顯示如何使用 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>