Spring Boot 为 Maven 和 Gradle 提供了构建工具插件。这些插件提供了各种特性,包括可执行 JAR 的打包。本节提供了有关这两个插件的更多详细信息,以及在需要扩展不受支持的构建系统时提供的一些帮助。如果你刚刚开始,你可能需要先阅读“[using.html](using.html#using.build-systems)”一节中的“[using.html](using.html#using)”。
## 1.1 Spring 引导 Maven 插件
Spring boot Maven 插件在 Maven 中提供了 Spring boot 支持,允许你打包可执行文件 jar 或战争归档文件并“就地”运行应用程序。要使用它,你必须使用 Maven 3.2(或更高版本)。
Spring boot Gradle 插件在 Gradle 中提供 Spring 引导支持,允许你打包可执行文件 jar 或战争归档文件,运行 Spring 引导应用程序,并使用`spring-boot-dependencies`提供的依赖管理。它需要 Gradle 6.8、6.9 或 7.x。查看该插件的文档以了解更多信息:
|`resources`|一个或多个[资源收集](https://ant.apache.org/manual/Types/resources.html#collection),描述一组[Resources](https://ant.apache.org/manual/Types/resources.html),该集合应被添加到所创建的 jar 文件的内容中。|
| `lib` |应该将一个或多个[资源收集](https://ant.apache.org/manual/Types/resources.html#collection)添加到构成应用程序运行时依赖项 Classpath 的 jar 库集合中。|
如果你想使用 Maven、 Gradle 或 Ant 以外的构建工具,那么你可能需要开发自己的插件。可执行 JAR 需要遵循特定的格式,并且某些条目需要以未压缩的形式编写(有关详细信息,请参见附录中的“[executable jar format](executable-jar.html#appendix.executable-jar)”部分)。
Spring boot Maven 和 Gradle 插件都使用`spring-boot-loader-tools`来实际生成 JAR。如果需要,可以直接使用这个库。
### 4.1.重新包装档案
要重新打包现有的归档文件,使其成为一个自包含的可执行归档文件,请使用`org.springframework.boot.loader.tools.Repackager`。`Repackager`类接受一个构造函数参数,该参数引用现有的 jar 或 WAR 归档。使用两个可用的`repackage()`方法中的一个来替换原始文件或写入新的目标。在运行 Repackager 之前,还可以在其上配置各种设置。
jar 结果包含通过编译应用程序产生的类和应用程序的所有依赖项,这样就可以使用`java -jar`运行它。 jar 文件还包含来自应用程序 Classpath 的条目。可以通过使用`--include`和`--exclude`来添加和删除 jar 的显式路径。两者都是用逗号分隔的,并且都接受前缀,以“+”和“-”的形式表示它们应该从默认值中删除。默认值包括以下内容:
Spring 引导应用程序可以是容器化的[使用 DockerFiles](#container-images.dockerfiles),也可以是容器化的[使用本地云构建包创建优化的 Docker 兼容容器映像,可以在任何地方运行](#container-images.buildpacks)。
## 1. 高效的容器图像
将 Spring 引导 fat jar 打包为 Docker 映像是很容易的。然而,复制和运行 Docker 映像中的 fat jar 有各种缺点。在不拆包的情况下运行 A fat jar 时,总会有一定的开销,在集装箱化的环境中,这一点是显而易见的。另一个问题是,将应用程序的代码及其所有依赖项放在 Docker 映像中的一个层中是次优的。由于你重新编译代码的次数可能比升级所使用的启动版本更多,所以更好的做法通常是多分离一些东西。如果将 jar 个文件放在应用程序类之前的层中,Docker 通常只需要更改最底层的文件,就可以从其缓存中获取其他文件。
对于 Maven,请参阅[packaging layered jar or war section](https://docs.spring.io/spring-boot/docs/2.6.4/maven-plugin/reference/htmlsingle/#repackage-layers)以获取有关向归档文件添加图层索引的更多详细信息。有关 Gradle,请参见 Gradle 插件文档的[packaging layered jar or war section](https://docs.spring.io/spring-boot/docs/2.6.4/gradle-plugin/reference/htmlsingle/#packaging-layered-archives)。
## 2. DockerFiles
虽然只需在 Dockerfile 中的几行就可以将 Spring 启动 fat jar 转换为 Docker 映像,但我们将使用[分层特征](#container-images.efficient-images.layering)来创建优化的 Docker 映像。当你创建包含层索引文件的 jar 时,`spring-boot-jarmode-layertools` jar 将作为依赖项添加到 jar 中。有了这个 jar 在 Classpath 上,你可以以一种特殊的模式启动你的应用程序,该模式允许引导代码运行与你的应用程序完全不同的东西,例如,提取层的东西。
| |`layertools`模式不能与包含启动脚本的[fully executable Spring Boot archive](deployment.html#deployment.installing)一起使用。<br/>在构建打算与`layertools`一起使用的 jar 文件时禁用启动脚本配置。|
| |为了实现可重复的构建和容器映像缓存,构建包可以操作应用程序资源元数据(例如文件“上次修改”信息)。<br/>你应该确保你的应用程序在运行时不依赖于该元数据。<br/> Spring 引导在服务静态资源时可以使用该信息,但这可以用`spring.web.resources.cache.use-last-modified`禁用|
在项目[wiki](https://github.com/spring-projects/spring-boot/wiki)上提供了如何从 Spring 启动的早期版本升级的说明。按照[release notes](https://github.com/spring-projects/spring-boot/wiki#release-notes)部分中的链接查找要升级到的版本。
升级说明总是发布说明中的第一项。如果你落后于多个版本,请确保你还查看了跳过的版本的发布说明。
## 1. 从 1.x 升级
如果你正在从 Spring 启动的`1.x`版本进行升级,请检查提供详细升级说明的[维基项目中的“迁移指南”](https://github.com/spring-projects/spring-boot/wiki/Spring-Boot-2.0-Migration-Guide)。还可以在[“release notes”](https://github.com/spring-projects/spring-boot/wiki)中查看每个版本的“新的和值得注意的”特性列表。
## 2. 升级到新的功能版本
当升级到新的功能版本时,一些属性可能已被重命名或删除。 Spring Boot 提供了一种在启动时分析应用程序环境和打印诊断的方法,但也为你提供了在运行时临时迁移属性的方法。要启用该功能,请在项目中添加以下依赖项: