此版本仍在开发中,尚未视为稳定版。如需最新稳定版本,请使用 Spring Boot 4.0.4spring-doc.cadn.net.cn

构建

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

生成构建信息

Maven 插件和 Gradle 插件都允许生成包含项目坐标、名称和版本的构建信息。 这些插件还可以通过配置添加额外的属性。 当存在此类文件时,Spring Boot 会自动配置一个 BuildProperties Bean。spring-doc.cadn.net.cn

要使用 Maven 生成构建信息,请为 build-info 目标添加一个执行配置,如下例所示:spring-doc.cadn.net.cn

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

以下示例使用 Gradle 实现相同的功能:spring-doc.cadn.net.cn

springBoot {
	buildInfo()
}
更多详情请参阅Spring Boot Gradle 插件文档

生成 Git 信息

Maven 和 Gradle 都允许生成一个 git.properties 文件,其中包含项目构建时你的 git 源代码仓库的状态信息。spring-doc.cadn.net.cn

对于 Maven 用户,spring-boot-starter-parent POM 包含一个预配置的插件,用于生成 git.properties 文件。 要使用它,请将以下 Git Commit Id Plugin 声明添加到您的 POM 中:spring-doc.cadn.net.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.cadn.net.cn

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

Maven 和 Gradle 插件都允许配置包含在 git.properties 中的属性。spring-doc.cadn.net.cn

git.properties 中的提交时间应符合以下格式:yyyy-MM-dd’T’HH:mm:ssZ。 这是上述两个插件的默认格式。 使用该格式可将时间解析为 Date,并且在序列化为 JSON 时,其格式可由 Jackson 的日期序列化配置设置进行控制。

生成 CycloneDX SBOM

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

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

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

Gradle 用户可以通过使用 cyclonedx-gradle-plugin 插件实现相同的结果,如下例所示:spring-doc.cadn.net.cn

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

自定义依赖版本

spring-boot-dependencies POM 管理常用依赖项的版本。 Maven 和 Gradle 的 Spring Boot 插件允许通过构建属性来自定义这些受管理的依赖版本。spring-doc.cadn.net.cn

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

要使用 Maven 覆盖依赖版本,请参阅 Maven 插件文档中的使用插件spring-doc.cadn.net.cn

要在 Gradle 中覆盖依赖版本,请参阅 Gradle 插件文档中的自定义托管版本spring-doc.cadn.net.cn

使用 Maven 创建可执行的 JAR

spring-boot-maven-plugin 可用于创建一个可执行的“fat” JAR。 如果你使用 spring-boot-starter-parent POM,你可以声明该插件,你的 JAR 文件将按如下方式重新打包:spring-doc.cadn.net.cn

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

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

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

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

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

与 WAR 文件类似,Spring Boot 应用程序并不打算用作依赖项。 如果你的应用程序包含希望与其他项目共享的类,推荐的做法是将这些代码移到一个独立的模块中。 然后,你的应用程序和其他项目都可以依赖这个独立的模块。spring-doc.cadn.net.cn

如果你无法按照上述建议重新组织你的代码,那么必须配置 Spring Boot 的 Maven 和 Gradle 插件,以生成一个单独的构件(artifact),该构件适合作为依赖项使用。 可执行归档文件不能用作依赖项,因为可执行 jar 格式将应用程序类打包在 BOOT-INF/classes 目录下。 这意味着当可执行 jar 被用作依赖项时,这些类将无法被找到。spring-doc.cadn.net.cn

要生成两个构件,一个用作依赖项,另一个是可执行的,必须指定一个分类器(classifier)。 该分类器将应用于可执行归档文件的名称,而默认归档文件则保留用于作为依赖项。spring-doc.cadn.net.cn

要在 Maven 中配置 exec 分类器,您可以使用以下配置:spring-doc.cadn.net.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 支持机制,该机制假定 jruby-complete.jar 始终能作为一个独立的文件直接被访问。spring-doc.cadn.net.cn

为了解决任何有问题的库,你可以标记特定的嵌套 JAR 文件,使其在可执行 JAR 首次运行时自动解包。 这些嵌套的 JAR 文件会被写入由 java.io.tmpdir 系统属性指定的临时目录下。spring-doc.cadn.net.cn

应特别注意确保您的操作系统已正确配置,以免在应用程序仍在运行时删除已解压到临时目录的 JAR 文件。

例如,若要通过使用 Maven 插件来指示应将 JRuby 标记为需要解包,您应添加以下配置:spring-doc.cadn.net.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.yaml 配置文件可能会被排除在非可执行 JAR 之外。spring-doc.cadn.net.cn

在 Maven 中,可执行的 JAR 必须作为主构件(main artifact),你可以按如下方式为库添加一个分类的 JAR(classified jar):spring-doc.cadn.net.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 插件../maven-plugin/index.html 属性。spring-doc.cadn.net.cn

有关更多详情,请参见此示例spring-doc.cadn.net.cn

在不使用 spring-boot-antlib 的情况下从 Ant 构建可执行归档文件

要使用 Ant 进行构建,你需要获取依赖项、编译代码,然后创建一个 JAR 或 WAR 归档文件。 要使其可执行,你可以使用 spring-boot-antlib 模块,或者按照以下说明操作:spring-doc.cadn.net.cn

  1. 如果你正在构建一个 JAR 文件,请将应用程序的类和资源打包到嵌套的 BOOT-INF/classes 目录中。 如果你正在构建一个 WAR 文件,请像往常一样将应用程序的类打包到嵌套的 WEB-INF/classes 目录中。spring-doc.cadn.net.cn

  2. 将运行时依赖项添加到 JAR 文件中的嵌套 BOOT-INF/lib 目录下,或 WAR 文件中的 WEB-INF/lib 目录下。 请记住不要压缩归档文件中的条目。spring-doc.cadn.net.cn

  3. provided(嵌入式容器)依赖项添加到 JAR 文件中的嵌套目录 BOOT-INF/lib 中,或 WAR 文件中的 WEB-INF/lib-provided 目录中。 请记住不要压缩归档文件中的条目。spring-doc.cadn.net.cn

  4. spring-boot-loader 类添加到归档文件的根目录中(以便 Main-Class 可用)。spring-doc.cadn.net.cn

  5. 使用适当的Starters(例如,对于 jar 文件使用 JarLauncher)作为清单中的 Main-Class 属性,并将其他所需属性指定为清单条目——主要是通过设置 Start-Class 属性来实现。spring-doc.cadn.net.cn

以下示例展示了如何使用 Ant 构建一个可执行的归档文件:spring-doc.cadn.net.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>