Spring Boot 3.0.0-M5 中的原生支持

工程 | Stéphane Nicoll | 2022年9月26日 | ...

Spring 团队一直在致力于为 Spring 应用程序提供原生镜像支持。在 Spring Boot 2 中,经过 3 年多的在 Spring Native 实验项目中的孵化,原生支持将随着 Spring Framework 6 和 Spring Boot 3 正式发布!

原生镜像为 Java 应用程序提供了几乎即时的启动时间和减少的内存消耗。最近的 Spring Boot 3.0.0-M5 版本是我们首次寻求更广泛的社区反馈,关于我们的原生支持。如果您需要了解基础知识,请参阅 3 月下旬的 提前编译 (Ahead Of Time) 基础知识博客文章。您还可以了解 如何为 Spring Boot 3.0 准备您的应用程序

自 3 月份以来发生了很多事情!我们改进了与更多用例和库的兼容性,在此过程中修复并改进了我们的原生支持。这篇博客文章详细介绍了您入门所需了解的内容。

构建您的第一个原生镜像

入门最简单的方法是从 https://start.spring.io 创建一个新项目。确保选择 Spring Boot 3.0.0-M5(或更高版本)和您喜欢的构建工具。完成此操作后,构建原生镜像的一种方法是使用 原生构建工具插件 和本地 GraalVM 安装。

按照 安装 GraalVM 的说明,或者如果您安装了 SDKMan!,则调用以下命令:

$ sdk install java 22.2.r17-nik

您可以通过确保 native-image 位于您的路径中来检查一切是否按预期工作。Spring Boot 对 Maven 和 Gradle 具有特定的集成。如果您使用 Maven,启用原生配置文件将触发构建原生镜像所需的必要基础设施。

$ ./mvnw -Pnative package

对于 Gradle,我们的插件会对原生构建工具插件的存在做出反应,因此我们需要应用它。

plugins {
  ..
  id 'org.graalvm.buildtools.native' version '0.9.14'
}

完成此操作后,这将触发构建原生镜像所需的必要基础设施。

$ ./gradlew nativeCompile

这将为您的本地操作系统/CPU 生成一个原生二进制文件,分别位于 target/build/native/nativeCompile 中。您可以像使用任何其他二进制文件一样启动您的应用程序。例如,使用 Maven:

$ target/demo

在构建时优化应用程序

在 3.0 中,我们的构建插件有一个额外的目标,用于触发应用程序的提前处理。在此阶段,应用程序将被检查,并且我们通常在运行时做出的某些决策将被评估和记录。

虽然 Spring Boot 附带了大量的自动配置,但这些配置在至少满足类路径条件之前都是“休眠”的。构建原生镜像时,此类评估必须在构建镜像之前发生,否则所有组合都将包含在其中。

我们还需要检测 GraalVM 无法推断的用例,例如代理、反射和序列化以及资源加载的使用。此检测的结果形成了所谓的可达性元数据。整个 Spring 产品组合已更新,以检测此类用例并自动生成相关的元数据。

我们决定使用 Javadoc 和易于浏览的结构生成源代码。这允许在构建时生成的代码被检查并在必要时轻松调试。这也意味着我们最终仅向 native-image 提供常规编译的 Java 代码。

可达性元数据存储库

虽然原生兼容性的首选选项是每个库都提供其所需的额外可达性元数据提示,但这并不总是可能的。最近,Oracle Labs 宣布了一个用于 第三方可达性元数据 的共享存储库。此存储库对贡献开放,以收集整个 JVM 生态系统中的可达性元数据。每个条目都针对一系列版本进行隔离测试。

如果您的首选库未提供必要的元数据,请考虑为该存储库做出贡献。Spring 团队正在根据我们提供的第三方库集成积极做出贡献。

测试支持

我们对原生镜像的支持是关于根据应用程序的依赖项和配置优化应用程序,并推断反射、代理等的需求。这可能会遗漏一些特定于您的应用程序的内容,例如其对自定义库或框架的使用。为了帮助您解决这个问题,此里程碑还提供了一种简单的方法来在原生镜像中运行您现有的测试,让您可以验证您的应用程序及其依赖项是否按预期工作。

为了在原生环境中运行您的测试套件,我们依赖于原生构建工具插件的测试支持。首先,确保 native-image 可用于您的路径(有关设置说明,请参见上文)。

使用 Maven,可以按如下方式调用:

$ ./mvnw -PnativeTest test

使用 Gradle,命令如下:

$ ./gradlew nativeTest

对于使用 ApplicationContext 的测试,这将应用相同的优化过程并推断必要可达性元数据。

您的应用程序无法工作:现在怎么办?

如果您的应用程序无法作为原生镜像工作,我们很乐意了解情况并在发布候选版本(计划于 10 月下旬发布)之前改进我们的支持。支持因错误而异。

  • 提前优化阶段的构建失败,请报告给 Spring Framework 问题跟踪器
  • 生成原生镜像期间的构建失败可能有各种根本原因。请使用通常的支持渠道,例如 Gitter 或 StackOverflow。
  • 如果应用程序构建成功但无法启动,则可能是缺少某些可达性元数据。其需求可能来自您自己的代码或第三方库。

Spring Framework 6 附带了一个新的 API,允许您以编程方式记录提示。如果缺少的提示来自您自己的代码,请考虑实现 RuntimeHintsRegistrar。有关具体示例,请参阅此 示例应用程序

下一步

根据社区反馈,我们将继续改进我们的 AOT 引擎,并更新参考指南,以提供有关我们引入的新 API 的更多详细信息。我们计划在今年 11 月正式发布。

这是一个令人兴奋的时刻。我们再次感谢所有已经贡献和反馈的人,我们期待着进一步的反馈!

获取 Spring 电子简讯

关注 Spring 电子简讯

订阅

抢先一步

VMware 提供培训和认证,助您快速提升技能。

了解更多

获取支持

Tanzu Spring 通过一个简单的订阅提供 OpenJDK™、Spring 和 Apache Tomcat® 的支持和二进制文件。

了解更多

即将举行的活动

查看 Spring 社区中所有即将举行的活动。

查看全部