構建

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>4.0.0</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 '3.0.0'
}

自定義依賴版本

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

每個 Spring Boot 版本都經過設計和測試,以適應這組特定的第三方依賴。覆蓋版本可能會導致相容性問題。

要使用 Maven 覆蓋依賴版本,請參閱 Maven 外掛文件中的 使用外掛

要在 Gradle 中覆蓋依賴版本,請參閱 Gradle 外掛文件中的 自定義管理版本

使用 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>4.0.0</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。

例如,要指示 JRuby 應該透過使用 Maven 外掛進行解包標記,您需要新增以下配置:

<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 必須是主要工件,您可以為庫新增一個分類 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 屬性。

有關更多詳細資訊,請參閱 此示例

不使用 spring-boot-antlib 透過 Ant 構建可執行歸檔

要使用 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)作為清單中的 Main-Class 屬性,並指定它需要的其他屬性作為清單條目 — 主要是透過設定 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>
© . This site is unofficial and not affiliated with VMware.