此版本仍在开发中,尚未被视为稳定版本。对于最新的稳定版本,请使用 Spring Boot 3.4.0spring-doc.cn

构建

Spring Boot 包括适用于 Maven 和 Gradle 的构建插件。 本节回答了有关这些插件的常见问题。spring-doc.cn

生成 Build Information

Maven 插件和 Gradle 插件都允许生成包含项目坐标、名称和版本的构建信息。 还可以将插件配置为通过配置添加其他属性。 当存在这样的文件时, Spring Boot 会自动配置BuildProperties bean。spring-doc.cn

要使用 Maven 生成构建信息,请为目标添加执行,如以下示例所示:build-infospring-doc.cn

<build>
	<plugins>
		<plugin>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-maven-plugin</artifactId>
			<version>3.3.7-SNAPSHOT</version>
			<executions>
				<execution>
					<goals>
						<goal>build-info</goal>
					</goals>
				</execution>
			</executions>
		</plugin>
	</plugins>
</build>
有关更多详细信息,请参阅 Spring Boot Maven Plugin 文档

以下示例对 Gradle 执行相同的操作:spring-doc.cn

springBoot {
	buildInfo()
}
有关更多详细信息,请参阅 Spring Boot Gradle Plugin 文档

生成 Git 信息

Maven 和 Gradle 都允许生成一个文件,其中包含有关构建项目时源代码存储库状态的信息。git.propertiesgitspring-doc.cn

对于 Maven 用户,POM 包括一个预配置的插件,用于生成文件。 要使用它,请将 Git 提交 ID 插件的以下声明添加到您的 POM 中:spring-boot-starter-parentgit.propertiesspring-doc.cn

<build>
	<plugins>
		<plugin>
			<groupId>io.github.git-commit-id</groupId>
			<artifactId>git-commit-id-maven-plugin</artifactId>
		</plugin>
	</plugins>
</build>

Gradle 用户可以使用 gradle-git-properties 插件获得相同的结果,如下例所示:spring-doc.cn

plugins {
	id "com.gorylenko.gradle-git-properties" version "2.4.1"
}

Maven 和 Gradle 插件都允许配置 其中包含的属性。git.propertiesspring-doc.cn

提交的时间应与以下格式匹配:. 这是上面列出的两个插件的默认格式。 使用此格式可以将时间解析为 Date,其格式在序列化为 JSON 时由 Jackson 的日期序列化配置设置控制。git.propertiesyyyy-MM-dd’T’HH:mm:ssZ

生成 CycloneDX SBOM

Maven 和 Gradle 都允许在项目构建时生成 CycloneDX SBOM。spring-doc.cn

对于 Maven 用户,POM 包括一个预配置的插件,用于生成 SBOM。 要使用它,请将 cyclonedx-maven-plugin 的以下声明添加到您的 POM 中:spring-boot-starter-parentspring-doc.cn

<build>
    <plugins>
        <plugin>
            <groupId>org.cyclonedx</groupId>
            <artifactId>cyclonedx-maven-plugin</artifactId>
        </plugin>
    </plugins>
</build>

Gradle 用户使用 cyclonedx-gradle-plugin 插件也可以获得相同的结果,如下例所示:spring-doc.cn

plugins {
    id 'org.cyclonedx.bom' version '1.8.2'
}

自定义依赖项版本

POM 管理常见依赖项的版本。 适用于 Maven 和 Gradle 的 Spring Boot 插件允许使用 build 属性自定义这些托管依赖项版本。spring-boot-dependenciesspring-doc.cn

每个 Spring Boot 版本都是针对这组特定的第三方依赖项进行设计和测试的。 覆盖版本可能会导致兼容性问题。

要使用 Maven 覆盖依赖项版本,请参阅 Maven 插件文档中的 Using the Pluginspring-doc.cn

如需覆盖 Gradle 中的依赖项版本,请参阅 Gradle 插件文档中的自定义托管版本spring-doc.cn

使用 Maven 创建可执行 JAR

这可用于创建可执行的 “fat” JAR。 如果你使用 POM,你可以声明插件,并且你的 jar 被重新打包,如下所示:spring-boot-maven-pluginspring-boot-starter-parentspring-doc.cn

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

如果您不使用父 POM,您仍然可以使用该插件。 但是,您必须额外添加一个部分,如下所示:<executions>spring-doc.cn

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

有关完整的使用详情,请参阅插件文档spring-doc.cn

使用 Spring Boot 应用程序作为依赖项

与 war 文件一样, Spring Boot 应用程序不打算用作依赖项。 如果您的应用程序包含要与其他项目共享的类,则建议的方法是将该代码移动到单独的模块中。 然后,您的应用程序和其他项目可以依赖单独的模块。spring-doc.cn

如果您无法按照上述建议重新排列代码,则必须将 Spring Boot 的 Maven 和 Gradle 插件配置为生成适合用作依赖项的单独工件。 可执行存档不能用作依赖项,因为可执行 jar 格式将应用程序类打包在 . 这意味着当可执行 jar 用作依赖项时,无法找到它们。BOOT-INF/classesspring-doc.cn

要生成两个工件,一个可用作依赖项,另一个可用作可执行文件,必须指定分类器。 此分类器应用于可执行存档的名称,将默认存档用作依赖项。spring-doc.cn

要在 Maven 中配置 的分类器,您可以使用以下配置:execspring-doc.cn

<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 支持,它假定 the 始终可以直接作为文件使用。jruby-complete.jarspring-doc.cn

要处理任何有问题的库,您可以标记特定的嵌套 jar 应在可执行 jar 首次运行时自动解压缩。 此类嵌套 jar 将写入由 system 属性标识的临时目录下。java.io.tmpdirspring-doc.cn

应注意确保您的操作系统已配置,以便在应用程序仍在运行时不会删除已解压缩到临时目录的 jar。

例如,要指示应使用 Maven 插件将 JRuby 标记为解包,您可以添加以下配置:spring-doc.cn

<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.yamlspring-doc.cn

在 Maven 中,可执行 jar 必须是主对象,您可以为库添加分类 jar,如下所示:spring-doc.cn

<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 插件的属性。jvmArgumentsspring-doc.cn

有关更多详细信息,请参阅此示例spring-doc.cn

从 Ant 构建可执行存档,而无需使用 spring-boot-antlib

要使用 Ant 进行构建,您需要获取依赖项、编译,然后创建 jar 或 war 存档。 要使其可执行,您可以使用该模块,也可以按照以下说明进行操作:spring-boot-antlibspring-doc.cn

  1. 如果要构建 jar,请将应用程序的类和资源打包到嵌套目录中。 如果要构建 war,请像往常一样将应用程序的类打包到嵌套目录中。BOOT-INF/classesWEB-INF/classesspring-doc.cn

  2. 在 jar 或 war 的嵌套目录中添加运行时依赖项。 切记不要压缩存档中的条目。BOOT-INF/libWEB-INF/libspring-doc.cn

  3. 在 jar 或 war 的嵌套目录中添加(嵌入式容器)依赖项。 切记不要压缩存档中的条目。providedBOOT-INF/libWEB-INF/lib-providedspring-doc.cn

  4. 在存档的根目录中添加类(以便 可用)。spring-boot-loaderMain-Classspring-doc.cn

  5. 使用适当的Starters(例如 jar 文件的 JarLauncher)作为清单中的属性,并指定它需要作为清单条目的其他属性 — 主要是通过设置属性。Main-ClassStart-Classspring-doc.cn

以下示例演示如何使用 Ant 构建可执行存档:spring-doc.cn

<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>