On this page
84. Build
84.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>1.5.9.RELEASE</version>
<executions>
<execution>
<goals>
<goal>build-info</goal>
</goals>
</execution>
</executions>
</plugin>
</plugins>
</build>
Tip
查看Spring Boot Maven 插件文档以获取更多详细信息。
并使用 Gradle 进行相同操作:
springBoot {
buildInfo()
}
可以使用 DSL 添加其他属性:
springBoot {
buildInfo {
additionalProperties = [
'foo': 'bar'
]
}
}
84.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 "1.4.17"
}
Tip
git.properties
中的提交时间应与格式yyyy-MM-dd'T'HH:mm:ssZ
相匹配。这是上面列出的两个插件的默认格式。使用此格式,可以将时间序列化为Date
,并将其序列化为 JSON 时的格式由 Jackson 的日期序列化配置设置控制。
84.3 自定义依赖项版本
如果您使用的 Maven 构建直接或间接继承自spring-boot-dependencies
(例如spring-boot-starter-parent
),但是要覆盖特定的第三方依赖关系,则可以添加适当的<properties>
元素。浏览spring-boot-dependencies POM 以获取完整的属性列表。例如,要选择其他slf4j
版本,应添加以下内容:
<properties>
<slf4j.version>1.7.5<slf4j.version>
</properties>
Note
仅当您的 Maven 项目(直接或间接)继承spring-boot-dependencies
时,此方法才有效。如果您在自己的dependencyManagement
部分中使用<scope>import</scope>
添加了spring-boot-dependencies
,则必须自己重新定义工件,而不是覆盖属性。
Warning
每个 Spring Boot 版本都是针对一组特定的第三方依赖项进行设计和测试的。覆盖版本可能会导致兼容性问题。
要覆盖 Gradle 中的依赖版本,您可以指定一个版本,如下所示:
ext['slf4j.version'] = '1.7.5'
有关更多信息,请参阅Gradle 依赖性 Management 插件文档。
84.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>1.5.9.RELEASE</version>
<executions>
<execution>
<goals>
<goal>repackage</goal>
</goals>
</execution>
</executions>
</plugin>
</plugins>
</build>
有关完整用法的详细信息,请参见plugin documentation。
84.5 使用 Spring Boot 应用程序作为依赖项
像 war 文件一样,Spring Boot 应用程序也不打算用作依赖项。如果您的应用程序包含要与其他项目共享的类,则建议的方法是将该代码移到单独的模块中。然后,您的应用程序和其他项目可以依赖单独的模块。
如果您不能按照上面的建议重新排列代码,则必须配置 Spring Boot 的 Maven 和 Gradle 插件以生成一个单独的工件,该工件适合用作依赖项。可执行归档文件不能用作BOOT-INF/classes
中的可执行 jar 格式软件包应用程序类的依赖项。这意味着当将可执行 jar 用作依赖项时,找不到它们。
为了产生两个工件,一个可以用作依赖项,另一个可以执行,必须指定分类器。该分类器应用于可执行 Files 的名称,保留默认 Files 作为依赖项。
要在 Maven 中配置exec
的分类器,可以使用以下配置:
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<configuration>
<classifier>exec</classifier>
</configuration>
</plugin>
</plugins>
</build>
使用 Gradle 时,可以使用以下配置:
bootRepackage {
classifier = 'exec'
}
84.6 运行可执行 jar 时提取特定的库
可执行 jar 中的大多数嵌套库无需解压即可运行,但是某些库可能会出现问题。例如,JRuby 包含其自己的嵌套 jar 支持,它假定jruby-complete.jar
始终可以直接作为文件直接使用。
要处理任何有问题的库,您可以标记在可执行 jar 首次运行时应将特定的嵌套 jar 自动解压缩到“ temp 文件夹”。
例如,为了指示应该使用 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>
并使用 Gradle 进行相同操作:
springBoot {
requiresUnpack = ['org.jruby:jruby-complete']
}
84.7 创建带有排除项的不可执行的 JAR
通常,如果您将可执行文件和非可执行 jar 作为构建产品,则可执行版本将具有库 jar 中不需要的其他配置文件。例如。 application.yml
配置文件可能会从不可执行的 JAR 中排除。
这是在 Maven 中执行此操作的方法:
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<configuration>
<classifier>exec</classifier>
</configuration>
</plugin>
<plugin>
<artifactId>maven-jar-plugin</artifactId>
<executions>
<execution>
<id>exec</id>
<phase>package</phase>
<goals>
<goal>jar</goal>
</goals>
<configuration>
<classifier>exec</classifier>
</configuration>
</execution>
<execution>
<phase>package</phase>
<goals>
<goal>jar</goal>
</goals>
<configuration>
<!-- Need this to ensure application.yml is excluded -->
<forceCreation>true</forceCreation>
<excludes>
<exclude>application.yml</exclude>
</excludes>
</configuration>
</execution>
</executions>
</plugin>
</plugins>
</build>
在 Gradle 中,您可以创建一个具有标准任务 DSL 功能的新 JAR 存档,然后使用其withJarTask
属性使bootRepackage
任务依赖于该任务:
jar {
baseName = 'spring-boot-sample-profile'
version = '0.0.0'
excludes = ['**/application.yml']
}
task('execJar', type:Jar, dependsOn: 'jar') {
baseName = 'spring-boot-sample-profile'
version = '0.0.0'
classifier = 'exec'
from sourceSets.main.output
}
bootRepackage {
withJarTask = tasks['execJar']
}
84.8 远程调试以 Maven 启动的 Spring Boot 应用程序
要将远程调试器附加到以 Maven 启动的 Spring Boot 应用程序,可以使用maven plugin的jvmArguments
属性。
查看this example了解更多详细信息。
84.9 远程调试以 Gradle 启动的 Spring Boot 应用程序
要将远程调试器附加到以 Gradle 启动的 Spring Boot 应用程序,可以使用bootRun
task 的jvmArgs
属性或--debug-jvm
命令行选项。
build.gradle
:
bootRun {
jvmArgs "-agentlib:jdwp=transport=dt_socket,server=y,suspend=y,address=5005"
}
Command line:
$ gradle bootRun --debug-jvm
查看Gradle 应用程序插件了解更多详细信息。
84.10 不使用 spring-boot-antlib 从 Ant 构建可执行 Files
要使用 Ant 进行构建,您需要获取依赖项,进行编译,然后创建一个 jar 或 war 存档。要使其可执行,可以使用spring-boot-antlib
模块,也可以按照以下说明进行操作:
如果要构建 jar,请将应用程序的类和资源打包在嵌套的
BOOT-INF/classes
目录中。如果要发动 War,请照常将应用程序的类打包在嵌套的WEB-INF/classes
目录中。在 jar 的嵌套
BOOT-INF/lib
目录中或在 war 的WEB-INF/lib
中添加运行时依赖项。记住不要压缩压缩 Files 中的条目。在 jar 的嵌套
BOOT-INF/lib
目录中添加provided
(嵌入式容器)依赖项,对于 War 则将WEB-INF/lib-provided
添加到嵌套的WEB-INF/lib-provided
目录中。记住不要压缩压缩 Files 中的条目。在 Files 的根目录中添加
spring-boot-loader
类(因此Main-Class
可用)。使用适当的启动器,例如 jar 文件的
JarLauncher
,作为清单中的Main-Class
属性,并指定它需要作为清单条目的其他属性,主要是Start-Class
。
Example:
<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>
Ant Sample的build.xml
任务与manual
任务一起运行,如果您使用
$ ant -lib <folder containing ivy-2.2.jar> clean manual
之后,您可以使用
$ java -jar target/*.jar
84.11 如何使用 Java 6
如果您想将 Spring Boot 与 Java 6 一起使用,则必须进行少量配置更改。确切的更改取决于您应用程序的功能。
84.11.1 嵌入式 Servlet 容器兼容性
如果使用的是 Boot 的嵌入式 Servlet 容器之一,则必须使用 Java 6 兼容的容器。 Tomcat 7 和 Jetty 8 都与 Java 6 兼容。有关详情,请参见第 73.16 节“使用 Tomcat 7.x 或 8.0”和第 73.18 节“使用 Jetty8”。
84.11.2 Jackson
Jackson 2.7 和更高版本需要 Java7.如果要在 Java 6 中使用 Jackson,则必须降级到 Jackson 2.6.
Spring Boot 使用从 Jackson 2.7 开始引入的 Jackson BOM,因此您不能仅覆盖jackson.version
属性。为了使用 Jackson 2.6,您将必须在构建的dependencyManagement
部分中定义各个模块,有关详细信息,请检查this example。
84.11.3 JTA API 兼容性
尽管 Java Transaction API 本身不需要 Java 7,但官方 API jar 包含已构建为需要 Java 7 的类。如果您使用的是 JTA,则需要用已构建的 Java 替换官方的 JTA 1.2 API jar。才能在 Java 6 上工作。为此,请排除对javax.transaction:javax.transaction-api
的所有传递依赖,并用对org.jboss.spec.javax.transaction:jboss-transaction-api_1.2_spec:1.0.0.Final
的依赖替换它们