macOS:如何正确安装 JavaFX 以运行 mqtt-spy?

ci7*_*en4 2 macos javafx java-11 macos-mojave

我正在尝试在我的 macOS 10.14 系统上运行mqtt-spy-1.0.0.jar,但它无法启动,返回以下错误消息: 在此处输入图片说明

据开发人员称,如果系统上缺少 JavaFX,则会导致此问题。

如下所示,我的系统上安装了最新版本的 Oracle JDK,但是,我知道 Oracle 已从 v11 中的 JDK 中排除了 JavaFX。 在此处输入图片说明 所以我从 GluonHQ下载了JavaFX并按照他们的说明开始在此处输入图片说明 尽管在 ~/.bash_profile 中正确设置了两个必需的变量,但 mqtt-spy-1.0.0.jar 仍然返回第一个屏幕截图中显示的错误消息......

我还需要做什么或者我需要做什么不同的事情来运行 mqtt-spy?

Jos*_*eda 5

已经有一个关于此的问题,但没有解决方案。

我还没有真正尝试让它完全工作,但这些是在 Java 11 上运行需要 JavaFX 11 但不捆绑它的 jar 所需的步骤:

  1. 转到OpenJFX 文档并阅读有关如何开始使用 JavaFX 11 的信息。

  2. 这里下载适用于您平台的 JavaFX 11 。解压

  3. 假设您已安装 Java 11,并设置为 JAVA_HOME:

使用mqtt-spy-1.0.0.jar(作为最新版本),您可以运行:

java --module-path /path-to/javafx-sdk-11.0.1/lib \
    --add-modules javafx.controls,javafx.fxml -jar mqtt-spy-1.0.0.jar
Run Code Online (Sandbox Code Playgroud)

运行此程序后,您将收到此异常:

Exception in Application start method
java.lang.reflect.InvocationTargetException
at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
...
Caused by: java.lang.ClassNotFoundException: javax.xml.bind.JAXBException
at java.base/jdk.internal.loader.BuiltinClassLoader.loadClass(BuiltinClassLoader.java:583)
Run Code Online (Sandbox Code Playgroud)

从 Java 9 开始,JAXB 也不是 JDK 的一部分。因此,您可以添加尝试从此处下载依赖项)并将其添加到类路径中。但这将需要一些迭代(还有一些其他需要的 jars,请参阅)。

那么为什么不使用最新的可用快照,其中包括依赖项:mqtt-spy-1.0.1-beta-b18-jar-with-dependencies.jar.

有了这个:

java --module-path /path-to/javafx-sdk-11.0.1/lib \
    --add-modules javafx.controls,javafx.fxml -jar mqtt-spy-1.0.1-beta-b18-jar-with-dependencies.jar
Run Code Online (Sandbox Code Playgroud)

我得到:

mqtt-spy 上 11

警告:但这并不意味着该应用程序将完全运行。鉴于它是一个 Java 8 应用程序,JavaFX 11 中发生了一些变化,主要与控件外观有关。如果应用程序使用的是私有 API (com.sun.javafx....),那现在将不起作用,因为它已被移动到公共包中,或者因为模块无法访问它。对于后者,您可以使用--add-opens,但对于前者,除了将应用程序依赖项更新为 Java 9+ 之外,没有其他解决方案。