0002-use-native-image-in-springboot3

2. 在spring boot3中使用native image

简介

在之前spring boot3文章中我们介绍了,spring boot3的一个重要特性就是支持把spring boot3的应用编译成为GraalVM的Native Image。

今天我们用具体的例子来给大家演示一下如何正确的将spring boot3的应用编译成为native image。

安装GraalVM

如果要把spring boot3的app编译成为native应用,需要GraalVM的支持。

什么是GraalVM呢?

从名字就可以看出来GraalVM是一个虚拟机,它的主要目标就是提升java应用程序的性能,并且消耗更少的资源。

它在java HotSpot JVM的基础上添加了JIT编译器和AOT来实现将应用编译成为本地可执行文件。除了java之外,GraalVM还支持JavaScript、Ruby、Python等多种编程语言。

所以,为什么要用GraalVM呢?一个字:快。

安装GraalVM也比较简单,我们进入它的官方下载页面下载对应的版本即可:https://www.oracle.com/downloads/graalvm-downloads.html。

GraalVM跟JDK一样也有两个版本,社区版和企业版本,大家可以根据需要自行选择。

要注意的是spring boot3需要GraalVM 22.3以上的版本支持,大家可不要下载错了。

下载完成之后,我们可以像正常安装JDK一样来安装GraalVM,这里以mac为例,假如我们安装的目录是/Library/Java/JavaVirtualMachines/graalvm-ee-java17-22.3.0,那么我们需要配置对应的JAVA_HOME和PATH环境变量如下:

PATH中有一个非常重要的命令叫做gu,如果不添加PATH,那么在使用中就可能遇到下面的异常:

安装完毕之后可以通过下面的命令来进行验证:

如果是在mac环境下,还需要执行下面的命令来解除对graalvm的隔离限制:

否则在使用中就会遇到下面的问题:

添加Native Image支持

我们安装GraalVM的目的就是使用它的native Image特性。native image是一个单独的jar包,我们可以执行下面的命令来进行安装:

其中gu就是/Library/Java/JavaVirtualMachines/graalvm-ee-java17-22.3.0/Contents/Home/bin中的命令。

下载的过程中还需要输入一个有效的邮件,并进行邮箱校验。然后一路ENTER就可以了。

当然,你还可以把Oracle GraalVM Enterprise Edition Native Image下载到本地,然后使用gu install -L来进行本地安装。

好了,到目前为止,一切准备妥当,我们接下来看看如何把spring boot3的应用打包成为native image吧。

构建spring boot3应用

这里我们使用的是maven,所以需要添加下面的spring boot3的依赖:

因为要构建native image,所以我们还需要用到下面的一个native-maven-plugin插件:

这里我们只创建了一个非常简单的main方法:

然后,我们尝试运行 mvn native:build来构建spring boot3应用程序。

记得在build之前一定先要编译好项目。

很可惜,你会发现下面的异常:

从上面的异常我们发现了两个问题,第一个问题是一个警告,它推荐我们使用native:compile-no-fork。

第二个问题是说找不到mainclass,根据异常信息,我们在pom的plugin中添加下面的配置信息,如下所示:

然后重新运行mvn native:compile-no-fork:

经过漫长的等待,我们终于build完成了。

因为我们的artifactId叫做native-image,所以最终在target目录下面生成了一个叫做native-image的可执行文件:

如果你这时候运行target/native-image,那么很可能得到下面的异常:

这是因为我们缺少一些spring boot的AOT元文件信息,正确的做法是使用下面的命令:

它实际上执行的是下面的几个命令:

最终我们得到编译好的native-image信息,运行得到下面的结果:

总结

从运行情况来看,native-image的启动速度非常快,应该可以提升不少的性能。

感兴趣的小伙伴赶紧用起来吧。

本文的例子https://github.com/ddean2009/learn-springboot3

最后更新于

这有帮助吗?