GraalVM 在 Linux 上的安装与 Native Image 工具链配置指南
【免费下载链接】graalGraalVM compiles applications into native executables that start instantly, scale fast, and use fewer compute resources 🚀项目地址: https://gitcode.com/gh_mirrors/gr/graal
本指南以 GraalVM 官方 Linux 安装文档(仓库内 docs/getting-started/linux.md)为核心骨架,系统讲解在 Linux(x64 与 AArch64)上安装 GraalVM 的三种主流方式——SDKMAN!、归档解压、脚本友好 URL——并深入剖析 Native Image 构建对本地 C 工具链的依赖与前置条件。读完本文,你将掌握完整的 GraalVM 安装、环境变量配置、安装验证方法,以及在不同 Linux 发行版上为 Native Image 准备编译工具链的实操方案。
支持的平台
GraalVM 为 Linux 提供x64与AArch64两种架构的发行包,覆盖绝大多数主流服务器与开发者机器。你可以根据实际硬件选择对应架构的安装包,安装流程本身与架构无关,差异仅体现在下载包名中的架构标识(x64或aarch64)。
方式一:使用 SDKMAN! 安装
SDKMAN! 是面向 Unix 系系统的 JDK 版本管理工具,它能帮助你安装并轻松地在多个 JDK 之间切换,是日常开发中最省心的 GraalVM 安装方式。
安装 Oracle GraalVM:
sdk install java <version>-graal其中<version>是你要安装的 GraalVM 版本号(如23.0.2)。若要安装 GraalVM Community Edition,只需把发行版标识从graal改为graalce:
sdk install java <version>-graalce常用管理命令:
| 命令 | 作用 |
|---|---|
sdk list java | 列出 SDKMAN! 当前可安装的全部 JDK 发行版,包括所有 GraalVM 版本 |
sdk use java <version>-graal | 仅为当前终端会话切换到指定 GraalVM 版本 |
sdk default java <version>-graal | 将指定版本设为所有新终端会话的默认 JDK |
use与default的区别在于作用域:前者只影响当前 shell 会话,适合临时验证;后者写入 SDKMAN! 的全局配置,适合长期使用。
方式二:从归档(.tar.gz)安装
归档安装适用于希望将 GraalVM 安装在任意自定义目录、且不影响机器上其他 JDK 的场景,无需 root 权限即可完成。
前往 GraalVM 官方 Downloads 页面,选择目标 Java 版本、操作系统Linux、架构x64或aarch64,下载对应的
.tar.gz压缩包。切换到希望安装 GraalVM 的目录,将
.tar.gz文件移动至该目录。解压归档:
tar -xzf graalvm-jdk-<version>_linux-<architecture>.tar.gz机器上可能同时存在多个 JDK,需要配置运行时环境以指向新安装的 GraalVM:
将
JAVA_HOME环境变量设置为 GraalVM 安装目录:export JAVA_HOME=/path/to/<graalvm>将 GraalVM 的
bin/目录加入PATH环境变量:export PATH=/path/to/<graalvm>/bin:$PATH
上述
export仅对当前终端会话生效。若希望永久生效,可将这两行追加到~/.bashrc或~/.zshrc等 shell 配置文件末尾。
安装完成后,运行java -version验证安装是否成功。如有需要,还可以在 IDE 中将 GraalVM 指定为默认 JRE/JDK 安装。
安装验证与首次运行
安装成功后,可以参照仓库内的 docs/getting-started/get-started.md 完成一次完整的"编译字节码 → 构建原生可执行文件"流程。GraalVM 自带完整的 JDK 与 Graal 编译器,java启动器以 Graal 作为最后一层(last-tier)编译器运行 JVM,因此任何现有 Java 应用都可以不加修改地直接运行:
public class HelloWorld { public static void main(String[] args) { System.out.println("Hello, World!"); } }javac HelloWorld.java native-image HelloWorld ./helloworldnative-image命令会在当前目录生成名为helloworld的可执行文件,它以毫秒级启动速度运行HelloWorld类的原生编译代码。注意:这一步依赖本地 C 工具链,请确保系统满足下文"Native Image 的 Linux 前置条件"一节所列的依赖。
方式三:脚本友好 URL 下载
脚本友好 URL 允许你在命令行中直接下载 GraalVM,或将下载步骤自动集成到脚本和 Dockerfile 中。使用时将<version>替换为 JDK 版本号,将<architecture>替换为aarch64或x64:
# 使用 wget 下载 wget https://download.oracle.com/graalvm/<version>/latest/graalvm-jdk-<version>_linux-<architecture>_bin.tar.gz # 使用 curl 下载 curl https://download.oracle.com/graalvm/<version>/latest/graalvm-jdk-<version>_linux-<architecture>_bin.tar.gz # 从归档地址下载 curl https://download.oracle.com/java/<version>/archive/jdk-<version>_linux-<architecture>_bin.tar.gzlatest/路径始终指向该版本的最新发布,适合在 CI 流水线中保持自动更新;archive/路径则可用于固定拉取历史归档版本。更多安装选项请参考 GraalVM 官方 Downloads 页面。
容器场景下的安装路径约定
如果是在容器镜像(尤其是 Oracle Linux 系镜像)中使用 GraalVM,可以留意仓库内 docs/getting-started/container-images/oracle-graalvm-container-images.md 记录的路径约定:Oracle GraalVM 容器镜像将运行时安装在/usr/lib64/graalvm/graalvm-java<$FeatureVersion>/(例如 Oracle GraalVM 25.3 安装在/usr/lib64/graalvm/graalvm-java25i3/),且所有二进制(java、javac、native-image等)通过alternatives机制注册为全局命令,因此在容器内可以直接调用而无须手动设置PATH。
Native Image 的 Linux 前置条件
native-image工具(位于 GraalVM 安装目录的bin/下)会将 Java 字节码提前编译(ahead-of-time)为平台相关的原生可执行文件,因此它依赖本地 C 工具链,包括 C 库的头文件(glibc-devel)、zlib、gcc,以及部分发行版需要的libstdc++-static。
最小版本要求
官方文档明确列出的构建最低版本要求如下:
| 依赖项 | 最低版本 | 说明 |
|---|---|---|
| glibc | 2.17 | 基础 C 运行库 |
| zlib | 1.2.3 | 压缩库 |
| GNU Compiler Collection (GCC) | 10.3.0 | C 编译器 |
| cmake | 3.22.2 | 仅当从源码构建时需要 |
注意:版本低于 10.x 的 GCC 可能导致构建失败。如果编译失败,请优先检查本机 GCC 版本是否满足要求。
工具链检查的源码级原理
native-image在构建时会主动探测并验证本机 C 编译器,这一逻辑实现在 CCompilerInvoker.java 中。从源码可以看到,CCompilerInvoker.create()会根据宿主操作系统分发对应的编译调用器(Linux 对应LinuxCCompilerInvoker,macOS 对应DarwinCCompilerInvoker,Windows 对应WindowsCCompilerInvoker,见 CCompilerInvoker.java#L83-L95),并在verifyCompiler()中执行实际校验(CCompilerInvoker.java#L97-L105)。
当工具链检查失败时,错误信息会提示可以通过命令行选项关闭检查(见 CCompilerInvoker.java#L107-L112 中SubstrateOptions.CheckToolchain的用法),对应native-image的-H:-CheckToolchain选项。可以推断:当你确信工具链配置正确、但检测环节误报时,可临时关闭该检查以继续构建;不过官方强烈建议保持检查开启,因为工具链缺失或版本过旧会直接导致链接阶段失败。
使用包管理器安装依赖
如果这些依赖尚未安装,可以按发行版使用对应的包管理器进行安装。
Oracle Linux(使用yum):
sudo yum install gcc glibc-devel zlib-devel部分 Linux 发行版可能额外需要libstdc++-static。它要求对应的可选软件源处于启用状态:Oracle Linux 7 为ol7_optional_latest,Oracle Linux 8 为ol8_codeready_builder,Oracle Linux 9 为ol9_codeready_builder。启用后执行:
sudo yum install libstdc++-staticUbuntu Linux(使用apt-get):
sudo apt-get install build-essential zlib1g-devbuild-essential元包会一并带入gcc、g++、make及libc6-dev(即 glibc 头文件),一条命令即可满足大部分构建需求。
其他 Linux 发行版(使用dnf,如 Fedora、RHEL 8+):
sudo dnf install gcc glibc-devel zlib-devel libstdc++-static安装完成后,可通过gcc --version、ldd --version分别验证 GCC 与 glibc 的版本是否满足上表的最低要求。同一套前置条件与安装命令也完整记录在 docs/reference-manual/native-image/README.md 的 Prerequisites 章节中,可供交叉核对。
安装方式对比与选型建议
| 安装方式 | 适用场景 | 是否需要 root | 优点 |
|---|---|---|---|
| SDKMAN! | 日常开发、多 JDK 频繁切换 | 否 | 一条命令安装/切换/卸载,管理成本最低 |
| 归档解压 | 自定义目录安装、离线环境、生产服务器 | 否 | 完全可控,不污染系统其他 JDK |
| 脚本友好 URL | CI/CD 流水线、Dockerfile 自动化 | 否 | 可脚本化,支持固定版本与 latest 跟随 |
后续学习路径
安装完成后,推荐按以下路径继续深入:
- 初次接触 GraalVM 的读者,可先阅读 docs/getting-started/get-started.md 完成 HelloWorld 全流程,再阅读 docs/reference-manual/native-image/NativeImageBasics.md 理解 Native Image 技术原理;
- 想了解 GraalVM 整体能力、发行版与特性概览,可阅读 docs/introduction.md;
- 需要系统了解 Native Image 构建配置、第三方库集成与更进一步指南的读者,可进入 docs/reference-manual/reference-manuals.md 查阅各参考手册;
- 以容器为部署目标的读者,可继续阅读 Oracle GraalVM 容器镜像文档 与 GraalVM CE 容器镜像文档,其中介绍了
jdk与native-image两类镜像仓库、muslib静态链接变体以及标签命名规范,可直接用于多阶段构建(multistage build)的 Dockerfile 编写。
【免费下载链接】graalGraalVM compiles applications into native executables that start instantly, scale fast, and use fewer compute resources 🚀项目地址: https://gitcode.com/gh_mirrors/gr/graal
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考