java - 无法在 macOS 上执行 JavaFX 示例:未找到工具包
问题描述
尝试启动 JavaFX“Hello world”示例时,找不到本机库——或者,它们被拒绝。症状是“未找到工具包”异常。macOS 似乎有一些特殊性,因为在某些时候提到了签名。
我做了什么(在 macOS 10.14.6 上):
- 从https://adoptopenjdk.net安装 Java 12
- 从http://gluonhq.com/download/javafx-12-0-2-sdk-mac下载了适用于 macOS 的 JavaFX 12 SDK 。解压为
$WRK_DIR/javafx-sdk-12.0.2
- 从https://github.com/openjfx/samples下载了 JavaFX“hello world”示例。解压为
$WRK_DIR/samples-master
然后我按照入门指南(此处或此处)的说明进行操作。我选择了最简单的路径:没有 IDE,没有像 Maven 这样的构建系统,没有模块化应用程序,只有简单的 CLI。
$ WRK_DIR=$(pwd)
$ ls -lF
total 0
drwxr-xr-x@ 4 bruno staff 128 19 jul 16:25 javafx-sdk-12.0.2/
drwxr-xr-x@ 8 bruno staff 256 31 jul 10:18 samples-master/
$ PATH_TO_FX=$WRK_DIR/javafx-sdk-12.0.2/lib
$ ls $PATH_TO_FX
javafx-swt.jar javafx.properties libglib-lite.dylib libjfxwebkit.dylib
javafx.base.jar javafx.swing.jar libgstreamer-lite.dylib libprism_common.dylib
javafx.controls.jar javafx.web.jar libjavafx_font.dylib libprism_es2.dylib
javafx.fxml.jar libdecora_sse.dylib libjavafx_iio.dylib libprism_sw.dylib
javafx.graphics.jar libfxplugins.dylib libjfxmedia.dylib src.zip
javafx.media.jar libglass.dylib libjfxmedia_avf.dylib
$ javac -version
javac 12.0.2
$ cd samples-master/CommandLine/Non-modular/CLI/hellofx
$ javac --module-path $PATH_TO_FX --add-modules=javafx.controls -d out $(find src -name "*.java")
$ find . -type f
./out/hellofx/HelloFX.class
./out/hellofx/Launcher.class
./src/hellofx/HelloFX.java
./src/hellofx/Launcher.java
直到尝试启动:
$ java -version
openjdk version "12.0.2" 2019-07-16
OpenJDK Runtime Environment AdoptOpenJDK (build 12.0.2+10)
OpenJDK 64-Bit Server VM AdoptOpenJDK (build 12.0.2+10, mixed mode)
$ java --module-path $PATH_TO_FX --add-modules=javafx.controls -cp out hellofx.HelloFX
Graphics Device initialization failed for : es2, sw
Error initializing QuantumRenderer: no suitable pipeline found
<stack trimmed>
Caused by: java.lang.RuntimeException: Error initializing QuantumRenderer: no suitable pipeline found
<stack trimmed>
Exception in thread "main" java.lang.reflect.InvocationTargetException
<stack trimmed>
Caused by: java.lang.RuntimeException: No toolkit found
<stack trimmed>
我所做的研究让我认为没有找到原生库。所以我尝试添加$PATH_TO_FX
并没有更好的结果LD_LIBRARY_PATH
。DY LD_LIBRARY_PATH
在此评论之后,我添加-Dprism.verbose=true
到命令行:
$ java -Dprism.verbose=true --module-path $PATH_TO_FX --add-modules=javafx.controls -cp out hellofx.HelloFX
Prism pipeline init order: es2 sw
Using Double Precision Marlin Rasterizer
Using dirty region optimizations
Not using texture mask for primitives
Not forcing power of 2 sizes for textures
Using hardware CLAMP_TO_ZERO mode
Opting in for HiDPI pixel scaling
Prism pipeline name = com.sun.prism.es2.ES2Pipeline
Loading ES2 native library ... prism_es2
GraphicsPipeline.createPipeline failed for com.sun.prism.es2.ES2Pipeline
java.lang.UnsatisfiedLinkError: no prism_es2 in java.library.path: [/Users/bruno/Library/Java/Extensions, /Library/Java/Extensions, /Network/Library/Java/Extensions, /System/Library/Java/Extensions, /usr/lib/java, .]
<trimmed the rest of errors that are essentially the above>
所以确实存在(至少)libprism_es2.dylib
没有被发现的问题。然后我尝试添加$PATH_TO_FX
到java.library.path
:
$ java -Dprism.verbose=true -Djava.library.path=$PATH_TO_FX --module-path $PATH_TO_FX --add-modules=javafx.controls -cp out hellofx.HelloFX
Prism pipeline init order: es2 sw
Using Double Precision Marlin Rasterizer
Using dirty region optimizations
Not using texture mask for primitives
Not forcing power of 2 sizes for textures
Using hardware CLAMP_TO_ZERO mode
Opting in for HiDPI pixel scaling
Prism pipeline name = com.sun.prism.es2.ES2Pipeline
Loading ES2 native library ... prism_es2
GraphicsPipeline.createPipeline failed for com.sun.prism.es2.ES2Pipeline
java.lang.UnsatisfiedLinkError: /Users/bruno/try/javafx-sdk-12.0.2/lib/libprism_es2.dylib: dlopen(/Users/bruno/try/javafx-sdk-12.0.2/lib/libprism_es2.dylib, 1): no suitable image found. Did find:
/Users/bruno/try/javafx-sdk-12.0.2/lib/libprism_es2.dylib: code signature in (/Users/bruno/try/javafx-sdk-12.0.2/lib/libprism_es2.dylib) not valid for use in process using Library Validation: mapped file has no cdhash, completely unsigned? Code has to be at least ad-hoc signed.
<...>
现在找到了该库,但认为该库无效。
解决方案
在您的命令行中:
$ java -Dprism.verbose=true --module-path $PATH_TO_FX \
--add-modules=javafx.controls -cp out hellofx.HelloFX
一切看起来都很好,所以它应该可以正常工作。事实上,你让它运行,直到它失败:
GraphicsPipeline.createPipeline failed for com.sun.prism.es2.ES2Pipeline
java.lang.UnsatisfiedLinkError: /Users/bruno/try/javafx-sdk-12.0.2/lib/libprism_es2.dylib: \
dlopen(/Users/bruno/try/javafx-sdk-12.0.2/lib/libprism_es2.dylib, 1): no suitable image found. \
Did find: /Users/bruno/try/javafx-sdk-12.0.2/lib/libprism_es2.dylib: \
code signature in (/Users/bruno/try/javafx-sdk-12.0.2/lib/libprism_es2.dylib) \
not valid for use in process using Library Validation: \
mapped file has no cdhash, completely unsigned? Code has to be at least ad-hoc signed.
向 AdoptOpenJDK 11.0.4报告了一个关于无法在 Mac 上使用 11.0.4+11.2 加载的本地库的错误,并产生完全相同的错误消息。
但是,您正在运行 AdoptOpenJDK 12.0.2,并且您的项目适用于您的OpenJDK 12,因此看来这个错误也延伸到 AdoptOpenJDK 12.0.2+10。
因此,虽然这是固定的,但您可以使用 OpenJDK 12。请注意,已经报告12 失败。
编辑
我可以确认 Mac 的最新11 预发行版可以正常工作(它实际上是 Java 版本 11.0.5)。
Mac的最新12 预发行版也是如此,它运行良好。
推荐阅读
- applescript - AppleScript 设置文件名
- arduino - Serial.printf 宏的类型警告
- python - 如何通过迭代正确地将数据上传到 AdafruitIO(Python 新手)
- c# - 将多个 IEnumerable 转换为 Tuple 的 IEnumerable
- jquery - 如何将设置应用于所有相同的选择元素?
- python - 模型名称而不是 product_id 值
- html - React.js - 仅在页面处于活动状态(页面加载或重新加载)时触发“useEffect”
- api - 根据 Restful 实践,REST API 端点中的 URI
- mysql - 如何在单行中获得合并的输出表
- python - 在 Pandas Dataframe 中对重复方法使用“和”操作