前言
本系列写于2023年9月
如果英文和网络条件允许,安装各类软件环境还是建议查看官网文档,网上的「二手博客」更像是个人经验总结,时效性太强,仅供参考
GraalVM的官方网站
总体而言,GraalVM也是一个JDK,基本上按照JDK的安装方法来就行,另外就是需要安装Visual Studio
下载并解压GraalVM的Windows zip包
由于我写的都是Windows平台下的博客,故下载Windows平台的zip包
之后解压缩到一个合适的位置即可
设置JAVA_HOME与PATH
目前确实有很多程序逐渐不再依赖JAVA_HOME这个环境变量了
但是GraalVM除外,根据
https://www.graalvm.org/latest/docs/getting-started/windows/
很明显,JAVA_HOME还是需要设置的
确保Visual Studio相关组件的存在(Native Tools Command Prompt)
这部分直接参照下方链接即可
如果电脑里面安装过 Visual Studio,确保能打开 Native Tools Command Prompt for VS XXXX
这样的一个黑框框老式 cmd 命令行,有关 native-image 编译为 exe 的命令只能在这里面运行
Demo测试
首先需要确保正在使用的是 GraalVM,命令行输入
java --version
确保打印出来的结果里面有 GraalVM 的字眼
之后写一个 HelloWorld
public class Hello {
public static void main(String[] args) {
System.out.println("Hello GraalVM");
}
}
之后编译为字节码,命令行输入
javac Hello.java
这样应该会在当前目录生成一个叫 Hello.class
的文件
之后尝试 native-image 编译为 exe
注意,下面的这条命令需要在 Native Tools Command Prompt 中运行,不能在 PowerShell 里面直接运行
native-image Hello
最后运行编译生成的 hello.exe,应该能看到打印出的 Hello GraalVM 字样
以下是执行 native-image 命令后整个流程的长截图
值得注意的是,在我的机器上(Lenovo Legion R7000P 2021H, AMD Ryzen 7 5800H, 16GB RAM),编译打包一个 HelloWorld 就已经耗费了最大 3.19GB 内存,而且编译时间达到了 42.9s,足以说明编译 native-image 需要很长的时间和很大的系统资源开销
更新:GraalVM JDK 20(java 20.0.2 2023-07-18)的版本,做了不少优化,编译 HelloWorld 所占的峰值内存缩减到了 1.38GB,编译时间也降低到了 21.6s,看来新版的 GraalVM 还是有优势的
踩坑记录
1. returned non-zero result
- 可能原因1 项目路径包含了一些特殊字符或中文字符,移动一下项目路径就好
https://github.com/spring-attic/spring-native/issues/1534 - 可能原因2 需要在 MSVC 的工具 Native Tools Command Prompt for VS 里面运行指令
https://stackoverflow.com/questions/73905381/failed-to-compile-spring-native-on-graalvm-with-the-message-native-image-cmd-re
2. gu.cmd not found
可能是因为 Path 没包含 GraalVM 的路径
另外,如果是一个说 gu 安装失败的报错,尝试自己手动安装一下 native-image 应该就好
应该是运行 gu install native-image
这个命令即可,参考 https://segmentfault.com/a/1190000039778813
3. GraalVM Native Image for JDK 20 requires Visual Studio 2022 version 17.1.0 or later
这说明安装的 GraalVM JDK 比较新,GraalVM JDK 20 需要 Visual Studio 2022 v17.1 或更高的版本,没啥好办法,安装新版的 Visual Studio 就是了
我就是想在PowerShell里运行native-image!
前面提到了“有关 native-image 编译为 exe 的命令只能在 MSVC 命令行里面运行”,但如果就是想在 PowerShell 里面直接运行,也不是不行
主要是要解决环境变量的问题,装完 Visual Studio 之后,环境变量里面并没有 VC++ 编译器相关的环境变量,所以直接运行 native-image 必然会出问题
一番探索后,结合 午秋 撰写的这篇博客
记录一次在PowerShell下进入VC编译环境的探索过程 https://blog.youkuaiyun.com/wuqiu/article/details/104563185
最终在 PowerShell 中先运行以下三条命令,之后就可以运行 native-image 了
注意第一行的 $vsPath
变量的值应该改为自己的 Visual Studio 所在的位置,后面的-arch=x64 -host_arch=x64参数也可能要根据实际情况进行修改
$vsPath="C:\Program Files\Microsoft Visual Studio\2022\Community";
Import-Module ("$vsPath\\Common7\\Tools\\Microsoft.VisualStudio.DevShell.dll");
Enter-VsDevShell -VsInstallPath "$vsPath" -SkipAutomaticLocation -DevCmdArguments "-arch=x64 -host_arch=x64";