GraalVM 将 Java 代码编译为 Native 文件

先看看 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 的电脑上也可以运行咯。

本博客采用 知识共享署名-禁止演绎 4.0 国际许可协议 进行许可

本文标题:GraalVM 将 Java 代码编译为 Native 文件

本文地址:https://dev-tang.com/post/2021/02/graalvm-native-image.html

推荐阅读