Apple M1(硅)芯片下Eclipse运行JavaFX17应用架构不兼容问题求解
Apple M1设备Eclipse运行JavaFX 17架构不兼容问题
更新: 经过多次尝试,我找到了该JavaFX / Apple M1(硅芯片) / Eclipse问题的临时解决方案:安装Eclipse 2021-09时,在安装程序的Java 11+ VM规范表单中使用JRE 17.0.0。
使用该JRE时,JavaFX应用可在Eclipse内成功启动。但若将项目JRE切换回其他Java 17版本,仍会出现下述问题。
问题描述
在全新Apple M1(硅芯片)笔记本上通过Eclipse运行JavaFX 17应用时,右键执行Hello World应用会抛出架构不匹配错误,其他运行场景则正常。
报错栈信息
Loading library prism_es2 from resource failed: java.lang.UnsatisfiedLinkError: /Users/due1/.openjfx/cache/17.0.0.1/libprism_es2.dylib: dlopen(/Users/due1/.openjfx/cache/17.0.0.1/libprism_es2.dylib, 1): no suitable image found. Did find: /Users/due1/.openjfx/cache/17.0.0.1/libprism_es2.dylib: mach-o, but wrong architecture /Users/due1/.openjfx/cache/17.0.0.1/libprism_es2.dylib: mach-o, but wrong architecture ...
缓存库架构检查结果
Eclipse运行报错时的缓存文件架构:
due1@host 17.0.0.1 % file * libglass.dylib: Mach-O 64-bit dynamically linked shared library arm64 libjavafx_font.dylib: Mach-O 64-bit dynamically linked shared library arm64 libprism_es2.dylib: Mach-O 64-bit dynamically linked shared library x86_64 libprism_sw.dylib: Mach-O 64-bit dynamically linked shared library x86_64
可以看到libprism_es2.dylib和libprism_sw.dylib为x86_64架构,不符合M1的arm64要求。
正常运行的场景
- 通过Eclipse的Maven命令执行,应用可正常运行:
... [INFO] --- javafx-maven-plugin:0.0.6:run (default-cli) @ hellomvn --- [INFO] Toolchain in javafx-maven-plugin null [INFO] ------------------------------------------------------------------------ [INFO] BUILD SUCCESS [INFO] ------------------------------------------------------------------------
- 导入IntelliJ 2021.2.x后可正常运行,此时缓存的prism库为arm64架构:
due1@host 17.0.0.1 % file * libglass.dylib: Mach-O 64-bit dynamically linked shared library arm64 libjavafx_font.dylib: Mach-O 64-bit dynamically linked shared library arm64 libprism_es2.dylib: Mach-O 64-bit dynamically linked shared library arm64
问题根源
- Eclipse版本架构适配缺陷:Eclipse 2021-09及更早版本没有原生Apple Silicon适配,默认通过Rosetta 2转译以x86_64架构运行。IDE自带的Java运行逻辑会继承主进程的架构标识,拉取对应x86_64版本的JavaFX prism相关原生库写入缓存,导致和项目JRE的arm64架构不匹配。你找到的JRE 17.0.0是专门适配Eclipse运行环境的原生arm64版本,能让Eclipse主进程以原生arm64运行,拉取正确架构的依赖库。
- JavaFX缓存的架构匹配逻辑:JavaFX加载原生库时,会根据当前触发加载的进程架构拉取对应版本存到本地缓存,只要触发加载的进程是x86架构,就会写入x86版本的库,后续arm64架构的JVM读取缓存时就会报错。
- 运行方式的进程隔离差异:Maven插件运行、IntelliJ的运行配置都会启动独立的JVM进程,不受IDE自身架构的影响,所以会拉取正确的arm64版本库。
其他解决方案
除了你提到的临时方案,还可以选择以下方式彻底解决问题:
- 升级Eclipse到2022-03及更高版本,这些版本已经提供原生Apple Silicon适配包,安装对应arm64版本的Eclipse后,即可正常使用任意arm64版JRE 17+运行JavaFX项目。
- 不升级Eclipse的前提下,在项目的运行配置中添加JVM参数
-Djavafx.platform=macos-aarch64,强制JavaFX拉取arm64架构的原生库,每次修改配置后建议先删除~/.openjfx/cache/目录下的对应版本缓存避免复用旧的错误文件。 - 统一使用Maven的javafx:run命令启动项目,完全规避IDE主进程架构的影响。
内容的提问来源于stack exchange,提问作者Eric D.
相关产品推荐
相关产品推荐

