将Spring Boot应用变成GraalVM本机镜像快速运行 - codecentric


将应用软件作为GraalVM镜像能快速运行,Micronaut,Quarkus.io&Co.框架都以支持GraalVM为荣!但是Spring是企业Java中无可争议的先驱,将Spring Boot与GraalVM的优势结合起来不是很好吗?
可以在GitHub上找到一个示例项目,只需要运行/target/native-image/spring-graal-vm下可执行文件,这个Spring Boot App能在0.078秒内启动!!通过localhost:8080/hello可访问该应用程序。

GraalVM本机镜像主要可以通过两种方式配置:通过JSON文件进行静态配置和通过动态配置。
静态配置文件可以通过Graal Native Image Agent手工制作或生成。动态配置能够处理更复杂的情况。

通过将传统上在运行时发生的动态反射魔术转移到本机镜像的编译阶段,可以极大地减少Java应用程序的启动时间和内存占用。当我们考虑在普通的Java应用程序中使用一点点反射时,这种编译已经变成一项艰巨的工作,因此当我们查看Spring时,这变得更加困难。
但是Spring团队确实承担了这个巨大的挑战!Andy Clement和SébastienDeleuze已经作为实验项目提供了Graal @AutomaticFeature for Spring的实现。并且已经有大量使用此功能创建GraalVM本机映像的示例Spring项目示例。我发现这绝对很棒,真的很想仔细看看!

使用SDKMAN安装GraalVM
为了使用GraalVM,我们需要做的第一件事就是安装它。SKDMAN可以用来管理JDK和Java工具(例如Maven或GraalVM)。为了使用SDKMAN,我们需要在本地安装它

curl -s "https://get.sdkman.io" | bash
source
"$HOME/.sdkman/bin/sdkman-init.sh"

如果SDKNMAN安装成功,运行sdk list java 可看到输出。
这种方法的简单性是:不要再搞JDK安装了!现在要安装基于JDK11的GraalVM,只需运行:

sdk install java 20.0.0.r11-grl

在为我们安装GraalVM。为了正确配置PATH变量,您可能需要重新启动控制台。如果一切顺利,您应该看到java -version输出。

安装GraalVM本机镜像
我们需要GraalVM的子项目Native Image来编译Spring Boot Apps。因此,GraalVM附带了特殊工具gu– (GraalVM更新器)。要列出当前安装的所有GraalVM项目,请运行:

$ gu list
ComponentId              Version             Component name      Origin
--------------------------------------------------------------------------------
graalvm                  20.0.0              GraalVM Core

安装GraalVM本机镜像,运行:

gu install native-image

运行native-image --version可检查安装好的版本。

准备Spring Boot使其对Graal Native友好
现在,为了能够本地编译我们的Spring Boot应用程序,在执行native-image命令之前,需要准备一些事情:

  1. 重新定位注释类路径扫描
  2. 禁用GCLIB代理的使用
  3. 检测autoconfiguration
  4. 获取Spring Graal @AutomaticFeature
  5. 在pom.xml中设置start-class元素
  6. 准备用于本机镜像命令的配置
  7. 构建应用程序,扩展胖的JAR并配置类路径
  8. 制作native-image命令

具体八个步骤点击标题见原文。