如何修复“错误:缺少 JavaFX 运行时组件,需要运行此应用程序”

Hil*_*oro 5 javafx-11

我的JavaFx应用程序从源代码运行得很好,但是当我编译为单个 jar 文件时,出现错误:

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

我正在Maven用作我的存储库管理器,并且我的 Maven 安装成功。

注意:在我的Intellij构建工件中,我可以看到Intellij包含JavaFx及其所有库

Ste*_*fan 14

a) 对于我的 maven 项目,诀窍是使用一个不从 javafx.application.Application 继承的额外入门类

public class GUIStarter {

    public static void main(final String[] args) {
        GUI.main(args);
    }

}
Run Code Online (Sandbox Code Playgroud)

JavaFx 依赖项包含在我的 pom.xml 中,如下所示:

<!-- JavaFx -->
        <dependency>
            <groupId>org.openjfx</groupId>
            <artifactId>javafx-base</artifactId>
            <version>12</version>
        </dependency>

        <dependency>
            <groupId>org.openjfx</groupId>
            <artifactId>javafx-controls</artifactId>
            <version>12</version>
        </dependency>

        <dependency>
            <groupId>org.openjfx</groupId>
            <artifactId>javafx-graphics </artifactId>
            <version>12</version>
            <classifier>win</classifier>
        </dependency>

        <dependency>
            <groupId>org.openjfx</groupId>
            <artifactId>javafx-fxml</artifactId>
            <version>12</version>
        </dependency>

        <dependency>
            <groupId>org.openjfx</groupId>
            <artifactId>javafx-web</artifactId>
            <version>12</version>
        </dependency>

        <dependency>
            <groupId>org.openjfx</groupId>
            <artifactId>javafx-media</artifactId>
            <version>12</version>
        </dependency>

         <dependency>
            <groupId>org.openjfx</groupId>
            <artifactId>javafx-swing</artifactId>
            <version>12</version>
        </dependency>
Run Code Online (Sandbox Code Playgroud)

为了在构建中包含 fxml 文件,您可能需要将它们定义为资源:

!-- define JavaFx files as resources to include them in the jar -->
<resource>
      <directory>${basedir}/src/main/java/foo/baa/view</directory>
      <filtering>false</filtering>  
      <targetPath>foo/baa/view</targetPath>            
</resource>
Run Code Online (Sandbox Code Playgroud)

b) 作为替代方案,可以使用额外的 maven 插件“javafx-maven-plugin”来构建 javafx 应用程序,请参阅https://openjfx.io/openjfx-docs/#maven 上的示例项目(这不适用于我。我有几个 pom 文件,想在子项目中引用 javafx 依赖项。javafx-maven-plugin 找不到我的主类。)

  • @Doc在此处查看有关“sun.launcher.LauncherHelper”的信息:https://mail.openjdk.java.net/pipermail/openjfx-dev/2018-June/021977.html (2认同)

geo*_*kal -1

在 Java 11 中,JavaFX 组件已被删除到它们自己的 SDK 中,因此当您运行它时,它将无法在运行时找到它们。

JavaFX 页面提供了使用说明:https://openjfx.io/openjfx-docs/#install-javafx

简而言之,您必须通过添加 javafx 模块来编译/运行,或者作为命令行上传递的选项,或者使用模块化项目。

我发现 Maven 和 IntelliJ 的模块化项目最适合我。https://openjfx.io/openjfx-docs/#IDE-Intellij

在模块化方法中,您有一个module-info.java文件描述您的项目“需要”的所有模块,并允许您将它们“打开”到其他模块。如果你有一堆 Maven 依赖项,你也必须将它们添加到需求列表中。(IntelliJ 可以使这变得简单 - 找到代码中有关 no require 的错误并按 alt-enter)

一旦一切都与模块等一起工作,我必须使用 Maven 阴影插件制作一个 Fat Jar,将所有东西放在一起。然后就可以从命令行运行 jar 了。

然而,在我的 Java 11 代码 @#$%@# 经过 2 天的痛苦后,我回到了 Java 8(使用最新版本的 correto SDK),因为 Java 11 没有打包,IntelliJ 无法做到这一点为你。