Spring Boot包括Maven和Gradle的构建插件。本部分回答有关这些插件的常见问题。
16.1. 生成构建信息
Maven插件和Gradle插件都允许生成包含项目的坐标,名称和版本的构建信息。还可以将插件配置为通过配置添加其他属性。当存在这样的文件时,Spring Boot会自动配置一个BuildProperties
bean。
要使用Maven生成构建信息,请为build-info
目标添加执行,如以下示例所示:
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<version>2.4.0-SNAPSHOT</version>
<executions>
<execution>
<goals>
<goal>build-info</goal>
</goals>
</execution>
</executions>
</plugin>
</plugins>
</build>
有关更多详细信息,请参见Spring Boot Maven插件文档。 | |
---|---|
下面的示例对Gradle执行相同的操作:
springBoot {
buildInfo()
}
有关更多详细信息,请参见Spring Boot Gradle插件文档。 | |
---|---|
16.2. 生成Git信息
Maven和Gradle都允许生成一个git.properties
文件,其中包含有关git
构建项目时源代码存储库状态的信息。
对于Maven用户,spring-boot-starter-parent
POM包含一个预配置的插件来生成git.properties
文件。要使用它,请将以下声明添加到您的POM中:
<build>
<plugins>
<plugin>
<groupId>pl.project13.maven</groupId>
<artifactId>git-commit-id-plugin</artifactId>
</plugin>
</plugins>
</build>
Gradle用户可以通过使用gradle-git-properties
插件获得相同的结果,如以下示例所示:
plugins {
id "com.gorylenko.gradle-git-properties" version "2.2.2"
}
提交时间git.properties 应与以下格式匹配:yyyy-MM-dd’T’HH:mm:ssZ 。这是上面列出的两个插件的默认格式。使用此格式,可以将时间解析为,Date 并将其序列化为JSON时的格式由Jackson的日期序列化配置设置控制。 |
|
---|---|
16.3. 自定义依赖版本
该spring-boot-dependencies
POM管理公共依赖的版本。Maven和Gradle的Spring Boot插件允许使用构建属性来自定义这些托管依赖项版本。
每个Spring Boot发行版均针对这组特定的第三方依赖项进行了设计和测试。覆盖版本可能会导致兼容性问题。 | |
---|---|
要使用Maven覆盖依赖版本,请参阅Maven插件文档的这一部分。
要覆盖Gradle中的依赖版本,请参阅Gradle插件文档的这一部分。
16.4. 使用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>2.4.0-SNAPSHOT</version>
<executions>
<execution>
<goals>
<goal>repackage</goal>
</goals>
</execution>
</executions>
</plugin>
</plugins>
</build>
有关完整用法的详细信息,请参见插件文档。
16.5. 使用Spring Boot应用程序作为依赖项
像war文件一样,Spring Boot应用程序也不打算用作依赖项。如果您的应用程序包含要与其他项目共享的类,则建议的方法是将该代码移到单独的模块中。然后,您的应用程序和其他项目可以依赖单独的模块。
如果您不能按照上面的建议重新排列代码,则必须配置Spring Boot的Maven和Gradle插件以生成一个单独的工件,该工件适合用作依赖项。可执行档案不能用作依赖项,因为可执行jar格式将打包应用程序类BOOT-INF/classes
。这意味着当将可执行jar用作依赖项时,找不到它们。
为了产生两个工件,一个可以用作依赖项,另一个可以执行,必须指定分类器。该分类器应用于可执行档案的名称,保留默认档案作为依赖项。
要exec
在Maven中配置分类器,可以使用以下配置:
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<configuration>
<classifier>exec</classifier>
</configuration>
</plugin>
</plugins>
</build>
16.6. 运行可执行jar时提取特定的库
可执行jar中的大多数嵌套库无需解压缩即可运行。但是,某些库可能会有问题。例如,JRuby包含其自己的嵌套jar支持,它假定jruby-complete.jar
总是可以直接以文件的形式直接使用。
要处理任何有问题的库,您可以标记在可执行jar首次运行时应自动解压缩特定的嵌套jar。这些嵌套的jar会写在java.io.tmpdir
system属性标识的临时目录下。
应注意确保已配置您的操作系统,以使其在应用程序仍在运行时不会删除已解压缩到临时目录中的jar。 | |
---|---|
例如,为了指示应该使用Maven插件将JRuby标记为解包,您可以添加以下配置:
<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>
16.7. 创建带有排除项的不可执行的JAR
通常,如果您具有一个可执行文件和一个不可执行的jar作为两个单独的构建产品,则可执行版本具有库jar中不需要的其他配置文件。例如,application.yml
配置文件可能会从不可执行的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.yml</exclude>
</excludes>
</configuration>
</execution>
</executions>
</plugin>
</plugins>
</build>
16.8. 远程调试以Maven开头的Spring Boot应用程序
要将远程调试器附加到使用Maven启动的Spring Boot应用程序,可以使用maven plugin的jvmArguments
属性。
有关更多详细信息,请参见此示例。
16.9. 不使用spring-boot-antlib从Ant构建可执行存档
要使用Ant进行构建,您需要获取依赖项,进行编译,然后创建一个jar或war存档。要使其可执行,可以使用该spring-boot-antlib
模块,也可以按照以下说明进行操作:
- 如果要构建jar,请将应用程序的类和资源打包在嵌套
BOOT-INF/classes
目录中。如果要发动战争,请WEB-INF/classes
照常将应用程序的类打包在嵌套目录中。 - 在
BOOT-INF/lib
jar或WEB-INF/lib
war的嵌套目录中添加运行时依赖项。切记不要压缩存档中的条目。 - 将
provided
(嵌入式容器)依赖项添加到BOOT-INF/lib
jar或WEB-INF/lib-provided
war的嵌套目录中。切记不要压缩存档中的条目。 - 将
spring-boot-loader
类添加到存档的根目录(以便Main-Class
可用)。 - 使用适当的启动器(例如
JarLauncher
jar文件)作为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.JarLauncher" />
<attribute name="Start-Class" value="${start-class}" />
</manifest>
</jar>
</target>