GraalVM与Java静态编译:原理与应用
上QQ阅读APP看书,第一时间看更新

4.1 获取GraalVM JDK

我们可以通过3种方法获取GraalVM JDK:

  • 从官方的发布页面[1]上直接下载;
  • 下载GraalVM的官方Docker镜像;
  • 从GraalVM的GitHub主页下载源代码,然后编译。

这三种方法有着各自适合的场景。前两种相对简单,并且拿到的总是经过测试的稳定版本;最后一种稍微复杂一些,但总是能获得最新的特性和Bug修复版本,而无须等待正式版的发布(有些特性从提交到代码库,再到最终出现在发布版中可能会经过几个月的时间)。使用哪种方式还要从自己的需求出发。如果只是普通的使用者,希望简单便捷地使用静态编译的功能,那么可以下载发布版,但即使使用了发布版也需要自己准备静态编译的工具链环境;如果希望直接使用官方的统一环境,则可以采取第二种方法;如果需要深入了解GraalVM的实现,希望亲自动手为其增加新特性或者修复Bug,那么就需要采用第三种下载源码的方法了。

4.1.1 下载发布版

GraalVM里的内容可以分为核心组件和可选组件,它们在发布页面上也是单独列出的。GraalVM 20.1.0(撰写本节内容时的最新版)的发布页面如图4-2所示,图中“核心组件压缩包”框中的是核心组件,其他jar包均为可选组件,需要单独下载安装。

048-01

图4-2 GraalVM 20.1.0社区版的发布页面

核心组件包括了JDK、HotSpot运行时、GraalVM编译器、Node.js运行时、多语言API解释器和GraalVM Updater升级工具等。它们被按照JDK版本、操作系统类型和CPU类型分别编译为不同的版本,然后打包成多个压缩包。从图4-2“核心组件压缩包”框中可见,目前GraalVM支持JDK 8和11,操作系统支持Linux、Windows和Mac,CPU则只支持x86 64位平台。其实GraalVM也支持AArch64平台,但是并不够成熟,所以没有作为正式版发布出来。用户需按照自己的JDK、操作系统和CPU平台下载对应的版本,然后解压使用。

社区标准版GraalVM中已经包含了静态编译框架Substrate VM的全部功能,作为可选组件单独发布的native-image安装包里只有native-image的启动器部分和用于在运行时抓取编译配置信息的native-image-agent程序。图4-2的“静态编译组件升级包”画框部分标出了native-image的所有安装包,从中可以看到native-image启动器也是按照JDK版本、操作系统和CPU类型分别打包发布的,此处选择的升级包必须和之前下载的核心组件包的各项版本保持一致。

假设核心组件包下载后解压到了$GRAALVM_HOME目录,我们选择与核心组件包版本一致的native-image升级安装包,并下载到了$INSTALL_FILE位置,那么只需要执行命令$GRAALVM_HOME/bin/gu install -L $INSTALL_FILE即可将native-image安装到$GRAALVM_HOME目录中,安装完成后执行$GRAALVM_HOME/bin/native-image-version,如返回类似GraalVM Version 20.1.0 (Java Version 1.8.0_252)的版本信息,则说明静态编译组件已安装成功。

4.1.2 下载Docker镜像

GraalVM官方提供的GraalVM Docker镜像中包括编译好的最新的GraalVM发布版和静态编译所需的编译工具链环境。虽然GraalVM是纯Java编写的,编译本身并不需要其他工具链的支持,但是因为需要将编译好的对象文件与系统库及JDK中的本地库进行链接,所以依然要用到外部的链接器(比如GCC)。镜像文件中已经提前准备好了这些外部依赖,用户只需要执行一条简单的docker pull命令就可以获得一个开箱即用的GraalVM JDK:

docker pull ghcr.io/GraalVM/GraalVM-ce:latest

GraalVM支持Linux、Windows和Mac三个操作系统平台,Linux上支持x86和AArch64两种指令集,在Windows和Mac上则只支持x86指令集。在用docker pull下载镜像时,系统会根据用户的宿主机架构自动选择对应的版本,进一步减轻了用户的负担。

latest标签对应的是基于JDK11编译的最新发布版的GraalVM,如果需要其他JDK和历史发布版本组合的镜像,可以在官方的Docker镜像列表[2]中查找、使用。


[1]参见https://github.com/GraalVM/GraalVM-ce-builds/releases

[2]参见https://github.com/orgs/GraalVM/packages/container/GraalVM-ce/versions