JavaFX 11: "JavaFX 运行时组件缺失"

3

我正在尝试在Windows 10下使用jGRASP 2运行取自《Java Illuminated》第五版的JavaFX代码,该代码适用于JavaFX 11和Java 11。

我已经广泛阅读了“JavaFX入门指南”(https://openjfx.io/openjfx-docs/),虽然有一些进展,但现在卡住了。

我下载了最新的ZIP文件,解压后更新了CLASSPATH以包含编译所需的jar文件路径。 我可以成功地编译文件。 但是,当我尝试运行时,出现以下错误消息:

错误:缺少JavaFX运行时组件,需要这些组件才能运行此应用程序

“入门”指南说,这可以通过将以下选项添加到运行时调用中来修复:

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

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

以前的StackOverflow文章通常以上面的选项设置结束; 不幸的是,我无法弄清楚还要做什么。


在运行时选项中,您是否更改了路径以指向包含JavaFX库的文件夹:"[path]\lib" 另外一个问题:当您说您添加了classpath以包括jar时,您是将其添加到Windows classpath还是IDE classpath? - sorifiend
是的,[path] 将被实际库路径所替代 --- 在我的情况下,字面上是 "C:\Program Files\Java\javafx-sdk-11.0.2\lib"。 - Jim Huggins
我改变了 IDE 的类路径。 - Jim Huggins
2个回答

4
作为第一次使用者,我设法让它工作了,但对我来说并不简单明了。
我猜想不太多人熟悉这个IDE,所以我会发布我所遵循的步骤作为基本教程:
  • 下载并安装jGRASP 2.0.5_05 Beta版本。

  • 由于我安装了几个JDK,所以默认情况下选择了JDK 10.0.2,因此我的第一步是找到一种方法使用JDK 11。这可以在“设置 -> jGrasp启动设置”中完成,在那里我可以为我的java可执行文件设置路径:

SetJDK 11

然后我重新启动了jGrasp。您可以在工具->系统信息->Java版本中验证IDE正在使用哪个JDK。

  • 打开HelloFX示例类。我从OpenJFX文档中开始使用最基本的示例。代码可以在这里找到。

  • Build -> compile,如预期所述,会抛出一堆错误,因为JavaFX不再是JDK的一部分:

Compile fails

  • 根据OpenJFX文档,我们需要从这里下载JavaFX SDK,然后将库添加到类路径中。进入设置 -> 路径/类路径 -> 工作区,点击新建,然后逐个添加已下载SDK/lib文件夹中的不同JavaFX jar文件(至少包括javafx-base.jarjavafx-graphics.jarjavafx-controls.jar)。

  • 构建 -> 编译现在应该可以工作了。

  • 下一步:构建 -> 运行。这会失败:

----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参数。

  • 第一次尝试:使用运行参数。设置后:
--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参数应该在类名称之前。

总之:运行参数不是VM参数

  • 第二次尝试:为了提供VM参数,我找到的选项是编辑设置 -> 编译器设置 -> 工作区。默认情况下,它使用jdk(集成调试器)- 通用。您可以查看并查看其运行使用的内容:
java %S -ea %S %<FLAGS2> %<MAIN_CLASS> %<ARGS>

所以我们需要找到一种方法来设置FLAGS2,而不是使用ARGS
幸运的是,在Environment选项卡旁边,有一个Flags/Args选项卡,我们可以在其中设置我们的vm参数FLAGS2
--module-path /Users/<user>/Downloads/javafx-sdk-11.0.2/lib --add-modules javafx.controls

VM args

  • 应用更改,关闭对话框,然后 Build -> Run 类,现在它将起作用!

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

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

 ----jGRASP: operation complete.

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


当您输入此内容时,我收到了这个解决方案的独立确认,它对我有效。您打得比我好多了。谢谢! - Jim Huggins
很好知道,希望这个简短的“指南”对其他人也有用! - José Pereda

1

尝试只使用主方法创建一个启动器。它可能看起来像这样:

package application;

import javafx.application.Application;

public class MyAppLauncher {

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

(暂时可以将旧的主方法保留在应用程序中不使用)
这对我来说在Ubuntu下使用JDK 13、JavaFX 13和Eclipse 2019-12有效。
(我使用“新建/ Maven项目/简单项目”创建了该项目,然后只需在pom.xml中添加JavaFX、日志记录和其他依赖项,这些都会落在类路径上。只有JDK位于模块路径上)
无需担心Java模块。

如果这样做有效,您可以花时间学习Java模块化...
...并记得为此答案投票。 :-)


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接