构建
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
文件。要使用它,请将以下声明添加到你的 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 '1.8.2'
}
使用 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>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。 |
例如,要指示 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>
在不使用 spring-boot-antlib 的情况下使用 Ant 构建可执行归档文件
要使用 Ant 构建,您需要获取依赖项、编译,然后创建 jar 或 war 归档文件。要使其可执行,您可以使用 spring-boot-antlib
模块,也可以按照以下说明操作
-
如果您正在构建 jar,请将应用程序的类和资源打包到嵌套的
BOOT-INF/classes
目录中。如果您正在构建 war,请照常将应用程序的类打包到嵌套的WEB-INF/classes
目录中。 -
将运行时依赖项添加到 jar 的嵌套
BOOT-INF/lib
目录或 war 的WEB-INF/lib
目录中。请记住**不要**压缩归档文件中的条目。 -
将
provided
(嵌入式容器)依赖项添加到 jar 的嵌套BOOT-INF/lib
目录或 war 的WEB-INF/lib-provided
目录中。请记住**不要**压缩归档文件中的条目。 -
将
spring-boot-loader
类添加到归档文件的根目录(以便Main-Class
可用)。 -
使用适当的启动器(例如 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>