先看看 GraalVM 的介绍
GraalVM 是一种通用虚拟机,用于运行以 JavaScript,Python,Ruby,R,基于JVM的语言(例如 Java,Scala,Clojure,Kotlin 和基于 LLVM 的语言,例如 C 和 C++)编写的应用程序。
总结成一句话就是:提高应用程序性能、将程序编译为独立的二进制文件、并且无缝集成多种语言。
官网:https://www.graalvm.org/
开源仓库:https://github.com/oracle/graal
再看看为什么需要将程序编译成 Native 文件
一段 Java 代码执行,需要先编译为 class 文件,再由类加载器(Class Loader)加载到 JVM 中,再通过执行引擎解释执行,才能在操作系统上运行。当有了 GraalVM 这一切就变得简单了,直接将代码编译成本地机器码,帮你省掉了类加载、解析执行的步骤。这样程序启动就变得更快了。
通俗的说就是:你在别人的电脑上运行 Java 程序,不需要安装 JDK/JRE, 直接运行 exe 文件就可以了。
所以 Oracle 野心不可谓不大,想用 GraalVM 一统天下。那这么牛逼的大腿我们是不是要抱一下呢?
那么开始吧
接下来笔者安装 GraalVM 并将一个 Java 程序打包成 Native 文件(在 Windows 下的表现形式就是 exe)。
下载地址:https://www.graalvm.org/downloads/
配置环境变量
笔者下载后解压到这个目录 D:\app\Java\graalvm-ce-java8-21.0.0
,接着就是配置环境变量,跟 Java 的环境变量是一样的,就是 JAVA_HOME 和 Path。
这个时候,如果你直接进入 cmd 运行 Java -version 命令,查看版本信息,会报这个错误:
Error: loading: D:\app\Java\graalvm-ce-java8-21.0.0\jre\bin\server\jvm.dll
无法加载 jvm.dll,如果你百度这个错误,都是乱七八糟的,说要下载32位 jdk 什么的。其实不是,是因为缺少了 vc++ 运行库,笔者也是参考了这篇 https://blog.csdn.net/nklinsirui/article/details/100715182 文章才知道的。
从这个地址 https://www.microsoft.com/zh-CN/download/details.aspx?id=14632 下载 vcredist_x64.exe,安装就可以了。再次执行 java -version 命令就可以看到对应的版本信息输出来了。
注意观察最后一行,是否有出现 GraalVM 字样,否则就是 GraalVM 的环境变量配置没有成功。
编写程序
现在写一个我们最熟悉的 Hello World 程序。
public class Hello {
public static void main(String[] args) {
System.out.println("Hello World!");
}
}
写好后,先编译为 class 文件,并确保是可以运行的
javac Hello.java
java Hello
打包 Native 文件
打包 Native 文件需要用到 native-image 这个工具,所以我们先要安装它。安装方式很简单,使用 gu 就可以了。
gu install native-image
gu 是 GraalVM bin 目录下的一个工具。安装速度因个人网络而异。
现在开始打包,命令如下:
native-image Hello
嗯~ 又出现错误了,说 cl.exe 找不到。cl.exe 是 C++ 组件中的,也就是说要安装 MSVC(Microsoft Visual C++)。如果安装过 Visual studio 的话,应该已经包含了这个。如果没有,也不用安装那么大的东西,安装 Visual Studio 2019 生成工具就可以了。
下载地址:https://visualstudio.microsoft.com/zh-hans/downloads/?utm_medium=post-banner&utm_source=microsoft.com&utm_campaign=channel+banner&utm_content=launch+vs2019
下载路径:Visual Studio 2019 工具 - Visual Studio 2019 生成工具
安装完成后,打开开始菜单,从这里进入命令行,而不是直接通过 cmd。
从这里进去会帮你自动加载好刚刚安装的 Visual Studio 2019 生成工具相关的环境变量,再进入到 Hello.class 所在目录,执行 native-image Hello 重新打包就可以了。
可以看到打包成功了,并且在 Java 程序所在的目录生成了 exe 文件,大小是 4M 左右,这个已经很小了,像 go、python 这些程序打包后,大小也差不多,应该还可以在进一步优化的。
执行 Native 文件并与朋友分享成果
还是回到命令行来,执行 exe 文件,可以看到正确的运行了的代码,与 java Hello 结果一致。
当然这个 exe 文件也是可以双击运行的,不过这段程序你看不到什么效果,里面就一行输出,你双击会一闪而过,其实已经运行了。 要看效果,你可以让程序运行暂停一下。方法很多,比如加一行获取用户输出的代码,或者 sleep 一下。
太棒了,把这个 exe(其它一些如:lib、.pdb、exp 文件不用管)分享给你的朋友吧,在没有安装 JDK/JRE 的电脑上也可以运行咯。