JavaFX 23.0.1在Linux aarch64下因GLIBC_2.34缺失无法运行的问题求助
JavaFX 23.0.1 在Linux aarch64下依赖GLIBC_2.34的问题解决
问题背景
将JavaFX版本升级至23.0.1后,程序在Linux x64架构下可正常运行,但在Linux aarch64架构下无法启动,提示缺失GLIBC_2.34版本,错误日志如下:
Loading library prism_es2 from resource failed: java.lang.UnsatisfiedLinkError:/home/nusp/.openjfx/cache/23.0.1+4/aarch64/libprism_es2.so: /usr/lib64/libc.so.6:version 'GLIBC_2.34'not found(required by /home/nusp/.openjfx/cache/23.0.1+4/aarch64/libprism_es2.so) java.lang.UnsatisfiedLinkError: /home/nusp/.openjfx/cache/23.0.1+4/aarch64/libprism_es2.so: /usr/lib64/libc.so.6: version GLIBC_2.34 not found (required by /home/nusp/.openjfx/cache/23.0.1+4/aarch64/libprism_es2.so) at java.base/jdk.internal.loader.NativeLibraries.load(Native Method) at java.base/jdk.internal.loader.NativeLibraries$NativeLibraryImpl.open(NativeLibraries.java:331) at java.base/jdk.internal.loader.NativeLibraries.loadLibrary(NativeLibraries.java:197) at java.base/jdk.internal.loader.NativeLibraries.loadLibrary(NativeLibraries.java:139) at java.base/java.lang.ClassLoader.loadLibrary(ClassLoader.java:2418) at java.base/java.lang.Runtime.load(Runtime.java:852) at java.base/java.lang.System.load(System.java:2025)
通过nm命令分析两个架构下的libprism_es2.so依赖:
Linux x64下执行nm -u libprism_es2.so结果:
w __cxa_finalize U dlsym U fprintf_chk U free U fwrite
Linux aarch64下执行nm -u libprism_es2.so结果:
w __cxa_finalize@GLIBC_2.17 U dlsym@GLIBC_2.34 U fprintf_chk@GLIBC_2.17 U free@GLIBC_2.17 U fwrite@GLIBC_2.17
已定位问题根源:Maven仓库中aarch64架构的JavaFX动态库基于GLIBC_2.34编译,使用Liberica JDK可正常运行。
问题解决方法
以下是几种可行的解决方案:
- 使用Liberica JDK:该JDK自带适配低GLIBC版本的JavaFX库,直接替换现有JDK即可解决启动问题,这是最简便的方案。
- 升级系统GLIBC至2.34及以上:如果系统允许,可升级到自带高版本GLIBC的Linux发行版(如Ubuntu 22.04+、CentOS Stream 9等);若无法升级发行版,也可手动编译安装GLIBC 2.34,但手动编译存在风险,可能影响系统其他依赖低版本GLIBC的程序。
- 降级JavaFX版本:选择aarch64版本依赖更低GLIBC的JavaFX版本(如22.x或更早版本),需提前测试确认该版本的GLIBC依赖情况。
- 自行编译JavaFX aarch64库:从OpenJFX源码编译,指定低版本GLIBC的编译环境(比如用较老的Linux发行版、Docker容器模拟低GLIBC环境),生成适配低版本GLIBC的动态库后,替换Maven仓库中的对应文件。
关于aarch64架构是否必须依赖GLIBC_2.34
不是必须的。aarch64架构本身并不要求GLIBC 2.34,Maven中央仓库的aarch64版JavaFX库依赖高版本GLIBC,只是因为其编译环境使用了高版本GLIBC,导致生成的动态库绑定了该版本的符号。像Liberica提供的JavaFX包就能兼容更低版本的GLIBC,证明架构本身不存在强制依赖。
内容的提问来源于stack exchange,提问作者KaLa
相关产品推荐
相关产品推荐

