我的电脑是WIN11,所以选择了Java 17 | windows(x64),对应下载的版本为:graalvm-jdk-17.0.9+11.1
如果有安装SDKMAN , 可以通过下面的命令安装:
sdk install java 21.0.1-graal配置GraalVM环境从下载的graalvm文件名称也可以看出,其本身也是jdk,打开安装文件里的bin目录 , 可以看到也有java javac等等命令,可以将本地Java环境覆盖 , 当然这个不是必须的 。比如我使用IDEA时,选择项目对应的SDK即可 。
GRAALMVM_HOME= <your graalvm-jdk path>PATH=%GRAALMVM_HOME%bin这样我们就可以在终端使用native-image命令了 。
通过native-image可以把Java代码编译为本地二进制可执行文件 。本地可执行文件只包括运行时所需的代码,即应用程序类、标准库类、语言运行时和来自JDK的静态链接的本机码 。
安装Visual Studio可以通过Visual Studio Installer来安装,下载地址 https://visualstudio.microsoft.com/zh-hans/downloads/ , 这里需要选择17.0以上的版本,否则后面会出现问题,我这里选择的是Visual Studio Community2022

文章插图
图片
示例
- 将一个Java文件生成一个可执行exe程序
- 编写Java代码
public class HelloWorld {public static void mAIn(String[] args) {System.out.println("Hello World!");}} - 编译
javacHelloWorld.java- 打包
native-image com.sucl.blog.vm.graalvm.HelloWorld- 测试
com.sucl.blog.vm.graalvm.HelloWorld.exe- 从Spring Boot 3.0就已经支持GraalVM原生镜像 , 这里通过一个基于Spring Boot的简单项目来看如何使用GraalVM
- 引入依赖,这里需要使用native-maven-plugin将最终的jar打包成exe文件
<project><dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency></dependencies><build><plugins><plugin><groupId>org.graalvm.buildtools</groupId><artifactId>native-maven-plugin</artifactId><version>0.9.25</version></plugin><plugin><groupId>org.springframework.boot</groupId><artifactId>spring-boot-maven-plugin</artifactId></plugin></plugins></build></project>- 编写Java代码
@RestController@SpringBootApplicationpublic class GraalVMApplication {public static void main(String[] args) {SpringApplication.run(GraalVMApplication.class, args);}@GetMappingpublic String index(){return "hello GraalVM";}}- 编译打包可以直接通过mvn命令:
mvn -Pnative clean native:compile -f pom.xml或者通过右侧Maven选项,选择native插件,配置运行参数,直接运行即可
文章插图
图片
整个打包过程比较长,由于需要将jar文件转换可直接运行的成二进制exe文件,整个编译的过程都会比较漫长 。启动完成后可以看到这样的信息

文章插图
图片
- 测试
通过GraalVM Native Image,可以将Java字节码直接编译成特定于平台的、自包含的本机可执行文件,从而实现更快的启动速度和更小的应用程序占用空间 。java跨平台的特性好像也没了...
打开浏览器 , 输入http://localhost:8080/则可以看到与普通项目相同的效果
其他支持通过官网可以看到,GraalVM Native除了支持上面的基于jar的构建,还有以下

文章插图
图片
遇到的问题
