【问题标题】:JavaFX 11: "JavaFX runtime components are missing"JavaFX 11:“缺少 JavaFX 运行时组件”
【发布时间】:2019-07-06 19:27:46
【问题描述】:

我正在尝试使用 Windows 10 下的 jGRASP 2 在 JavaFX 11 和 Java 11 下运行示例 JavaFX 代码(取自 Java Illuminated 的第 5 版)。

我已广泛阅读“JavaFX 入门”指南 (https://openjfx.io/openjfx-docs/),虽然取得了一些进展,但还是被卡住了。

我已经下载了最新的 ZIP 文件,将其解压缩,并更新了 CLASSPATH 以包含编译所需的 jar 文件的路径。我可以成功编译该文件。但是,当我尝试运行时,我收到以下错误消息:

错误:JavaFX 运行时组件丢失,是运行此应用程序所必需的

“入门”指南说,可以通过在运行时调用中添加以下选项来解决此问题:

--module-path "[path]\lib" --add-modules=javafx.controls,javafx.fxml

我已添加选项,但仍然收到错误消息。

以前的 StackOverflow 文章通常以上面的选项设置结束;唉,我不知道还能做什么。

【问题讨论】:

  • 在运行时选项中,您是否更改了指向带有 JavaFX 库的文件夹的路径:"[path]\lib" 附加问题:当您说您添加了类路径以包含 jar 时,您是否将其添加到windows 类路径,还是 IDE 类路径?
  • 1) 是的,[path] 被库的实际路径替换 --- 在我的例子中,字面意思是“C:\Program Files\Java\javafx-sdk-11.0.2\lib "
  • 2) 我更改了 IDE 类路径。

标签: java javafx jgrasp javafx-11


【解决方案1】:

作为第一次使用,我已经设法让它工作,但这对我来说并不简单。

我想熟悉这个IDE的人不多,所以我将发布我遵循的步骤,作为基础教程:

  • Download 并安装 jGRASP 版本 2.0.5_05 Beta。

  • 1234563为我的java 可执行文件设置路径:

然后我重新启动了 jGrasp。您可以在Tools -> System Info -> Java Version 中验证 IDE 使用的是哪个 JDK。

  • 打开 HelloFX 示例类。我从the OpenJFX docs 的最基本示例开始。代码可以在here找到。

  • Build -> compile,正如预期的那样,将抛出一堆错误,因为 JavaFX 不再是 JDK 的一部分:

  • 按照 OpenJFX 文档,我们需要从 here 下载 JavaFX SDK,然后将库添加到类路径中。转到Settings -> PATH/CLASSPATH -> Workspace,按新建,然后从下载的SDK/lib 文件夹(至少javafx-base.jarjavafx-graphics.jarjavafx-controls.jar)中一一添加不同的JavaFX jar。

  • Build -> compile 现在应该可以工作了。

  • 下一步:Build -> Run。这失败了:

----jGRASP exec: java HelloFX
Error: JavaFX runtime components are missing, and are required to run this application

 ----jGRASP wedge: exit code for process is 1.
 ----jGRASP: operation complete.

这是意料之中的。根据文档,我们需要设置 module-path 和 add-modules 参数。

  • 第一次尝试:使用Run arguments。设置后:
--module-path /Users/<user>/Downloads/javafx-sdk-11.0.2/lib --add-modules javafx.controls

再次运行失败并显示与上述完全相同的错误消息,但控制台日志中存在一个差异:

----jGRASP exec: java HelloFX --module-path /Users/<user>/Downloads/javafx-sdk-11.0.2/lib --add-modules javafx.controls

这有什么问题!?好吧...如果你在命令行上尝试,它也会失败,因为参数的顺序是错误的,vm参数应该放在类名之前

结论:Run arguments 不是VM arguments

  • 第二次尝试:为了提供 VM 参数,我发现的选项是编辑 Settings -&gt; Compiler settings -&gt; Workspace。默认情况下,它使用jdk (integrated debugger) - generic。您可以查看它并查看它使用的Run
java %S -ea %S %<FLAGS2> %<MAIN_CLASS> %<ARGS>

所以我们需要找到一种方法来设置FLAGS2,而不是ARGS

幸运的是,在Environment 选项卡旁边,有一个Flags/Args 选项卡,我们可以在FLAGS2 中设置我们的vm 参数:

--module-path /Users/<user>/Downloads/javafx-sdk-11.0.2/lib --add-modules javafx.controls

  • 应用,关闭对话框,然后Build -&gt; Run 类,现在它可以工作了!

如果您看到控制台日志,它包含的正是您在命令行上运行时将使用的命令:

----jGRASP exec: java --module-path /Users/<user>/Downloads/javafx-sdk-11.0.2/lib --add-modules javafx.controls HelloFX

 ----jGRASP: operation complete.

我猜下一步将是运行一个更复杂的项目...

【讨论】:

  • 当您输入此内容时,我收到了对此解决方案的独立确认,这对我有用。你打得比我要好得多。谢谢!
  • 很高兴知道,希望这个简短的指南对其他人也有用!
【解决方案2】:

尝试简单地创建一个只有一个主要方法的启动器。它可能看起来像这样:

package application;

import javafx.application.Application;

public class MyAppLauncher {

    public static void main(final String[] args) {
        Application.launch(MyApp.class, args);
    }
}

(您可以暂时将旧的 main 方法留在您的应用程序中)
这对我在 Ubuntu 下使用 JDK 13 & JavaFX 13 & Eclipse 2019-12 有效。
(我使用“new/Maven Project/Simple Project”创建了项目,然后在 pom.xml 中添加了 JavaFX、Logging 和其他东西作为依赖项,它们都落在 Classpath 上。只有 JDK 在 Modulepath 上)
无需担心 Java 模块。

如果可行,您可以改天花时间了解 Java 模块化...
...并记得投票给这个答案。 :-)

【讨论】:

    猜你喜欢
    • 2019-09-09
    • 2021-01-11
    • 1970-01-01
    • 2021-08-21
    • 2021-09-03
    相关资源
    最近更新 更多