构建

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

生成构建信息

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

要用Maven生成构建信息,可以添加一个执行构建信息目标,如下例所示:spring-doc.cadn.net.cn

<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:spring-doc.cadn.net.cn

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

生成 Git 信息

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

对于Maven用户来说,Spring靴启动父POM 包含一个预配置的插件,用于生成git.properties文件。 使用时,添加以下声明Git 提交 ID 插件给你的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(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. 这是上述两个插件的默认格式。使用该格式可以将时间解析成日期其格式在序列化为JSON时,由Jackson的日期序列化配置设置控制。

生成CycloneDX SBOM

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

对于Maven用户来说,Spring靴启动父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依赖关系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-插件可以用来创建可执行的“胖”JAR。如果你使用Spring靴启动父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,仍然可以使用该插件。但你必须额外添加一个<处决>章节如下:spring-doc.cadn.net.cn

<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-doc.cadn.net.cn

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

像战争文件一样,Spring Boot 应用程序并非用作依赖。 如果你的应用包含想与其他项目共享的类,建议将这些代码移到单独的模块中。 这样你的申请和其他项目就可以依赖这个独立模块。spring-doc.cadn.net.cn

如果你无法按照上述建议重新排列代码,Spring Boot 的 Maven 和 Gradle 插件必须配置为产生一个适合作为依赖使用的独立工件。 可执行压缩包不能作为依赖,因为可执行的 jar 格式将应用类打包在启动-INF/类. 这意味着当可执行 jar 作为依赖时,它们无法被找到。spring-doc.cadn.net.cn

为了产生两个工件,一个可作为依赖,一个可执行,必须指定一个分类器。 该分类器应用于可执行档案的名称,保留默认归档作为依赖。spring-doc.cadn.net.cn

要配置一个分类器执行官在Maven中,你可以使用以下配置: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运行时提取特定库

大多数可执行容器中的嵌套库无需解压即可运行。 然而,某些库可能会存在问题。 例如,JRuby 包含自己的嵌套 jar 支持,假设jruby-complete.jar总是以独立文件的形式直接提供。spring-doc.cadn.net.cn

为了解决任何有问题的库,你可以标记特定嵌套jar在执行jar首次运行时应自动解压。 此类嵌套jar写在由java.io.tmpdir系统属性。spring-doc.cadn.net.cn

应确保作系统配置良好,避免在应用程序运行时删除已解压到临时目录的jar。

例如,为了表示 JRuby 应被标记为可通过 Maven 插件解压,你需要添加以下配置: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中不需要的额外配置文件。 例如,application.yaml配置文件可能会被排除在不可执行的 JAR 之外。spring-doc.cadn.net.cn

在Maven中,可执行jar必须是主要的产物,你可以为库添加一个分类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 应用中,可以使用jvm论证Maven插件的属性。spring-doc.cadn.net.cn

更多细节请参见此示例spring-doc.cadn.net.cn

无需使用 Spring-boot-antlib 即可从 ant 构建可执行档案

用 Ant 构建时,你需要抓取依赖,编译,然后创建一个 jar 或 war archive。 要让它可执行,你可以使用Spring靴-antlib或者你可以按照以下说明作:spring-doc.cadn.net.cn

  1. 如果你是在构建一个jar,把应用的类和资源打包成嵌套的形式启动-INF/类目录。 如果你在构建战争,把应用的类打包成嵌套的网络基础/课程一如既往地。spring-doc.cadn.net.cn

  2. 在嵌套中添加运行时依赖启动-INF/LIBjar 或WEB-INF/LIB为了战争。 记得不要压缩档案中的条目。spring-doc.cadn.net.cn

  3. 添加提供嵌套容器中的(嵌入容器)依赖关系启动-INF/LIBjar 或WEB-INF/lib-提供的为了战争。 记得不要压缩档案中的条目。spring-doc.cadn.net.cn

  4. 添加Spring Boot加载器归档根节点的类(因此主级是可用的)。spring-doc.cadn.net.cn

  5. 使用合适的Starters(例如)JarLauncher对于jar文件)作为一个主级属性 在 manifest 中,并指定其需要的其他属性作为 manifest 条目——主要通过设置 a起始级财产。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>