【问题标题】:Cannot execute JavaFX sample on macOS: No toolkit found无法在 macOS 上执行 JavaFX 示例:未找到工具包
【发布时间】:2019-12-23 23:08:05
【问题描述】:

尝试启动 JavaFX“Hello world”示例时,找不到本机库 - 或者,它们被拒绝。症状是“未找到工具包”异常。 macOS 似乎有一些特殊性,因为在某些时候提到了签名。

我做了什么(在 macOS 10.14.6 上):

  1. https://adoptopenjdk.net 安装了 Java 12
  2. http://gluonhq.com/download/javafx-12-0-2-sdk-mac 下载了适用于 macOS 的 JavaFX 12 SDK。解压为$WRK_DIR/javafx-sdk-12.0.2
  3. https://github.com/openjfx/samples 下载了JavaFX“hello world”示例。解压为$WRK_DIR/samples-master

然后我按照入门指南(herehere)的说明进行操作。我选择了最简单的路径:没有 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_PATHDY LD_LIBRARY_PATH,但没有更好的结果。在this comment之后,我在命令行中添加了-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.
   <...>

现在已找到该库,但认为该库无效。

【问题讨论】:

  • 如果您使用System.out.println("Hello World") 创建包含主类的新简单项目,它是否有效?
  • 对我来说,这个版本的 JDK 和 JFX 在与您的 macOS 版本相同的 macOS 上工作没有问题,我不必弄乱库路径。可能的区别:我使用 Oracle 通过 Maven 提供的 OpenJDK 和 JavaFX。你检查过你的环境吗?也许你已经定义了一些会干扰你的命令行选项的变量。
  • AdoptOpenJDK 11.0.4 中有一个 issue(12.0.2 可能也是如此),并且无法提取本机库并显示消息 no suitable image found...mapped file has no cdhash, completely unsigned。你可以试试OpenJDK 12吗?
  • @bakero98 是的,一个简单的非 JavaFX 程序可以工作。
  • @JoséPereda 这确实是完全相同的错误。我下载了问题中提到的测试程序,我得到了相同的(错误的)行为。感谢您指出这一点。我会尽快尝试使用 OpenJDK 12。

标签: java macos javafx java-11


【解决方案1】:

在你的命令行中:

$ 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.

有一个bug 报告给 AdoptOpenJDK 11.0.4 关于在 Mac 上无法使用 11.0.4+11.2 加载的本机库,并产生完全相同的错误消息。

但是,您正在运行 AdoptOpenJDK 12.0.2,并且您的项目使用 OpenJDK 12 为您工作,所以看来这个错误也延伸到 AdoptOpenJDK 12.0.2+10。

因此,虽然这个问题已修复,但您可以使用 OpenJDK 12。请注意,已经有 reported 表示 12 失败。

编辑

我可以确认最新的 Mac 版 11 prerelease 可以正常工作(实际上是 Java 版本 11.0.5)。

最新的12 prerelease for Mac 也是如此,它运行良好。

【讨论】:

    【解决方案2】:

    很遗憾,AdoptOpenJDK 12.0.2 的发布版本不能正常工作

    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)
    

    【讨论】:

    • 是的,但是最新的预发布版可以使用。请参阅上面的编辑。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-01-10
    • 2021-08-30
    • 2014-08-13
    • 1970-01-01
    • 2012-11-21
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多