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

12

我的JavaFX应用程序从源代码运行得非常完美,但是当我编译成单个jar文件时,出现以下错误:

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

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

注意:在我的IntelliJ构建工件中,我可以看到IntelliJ包括JavaFX及其所有库。


Maven Shade JavaFX运行时组件丢失的副本。 - José Pereda
这个答案详细并且对我很有帮助:https://dev59.com/0rH3oIgBc1ULPQZFJU9t#70809214 - Dmitriy
3个回答

28

a) 对于我的Maven项目,诀窍在于使用一个额外的启动类,该类不继承自javafx.application.Application:


public class GUIStarter {

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

}

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>
为了将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>

b)作为替代方案,可以使用额外的Maven插件“javafx-maven-plugin”来构建JavaFX应用程序,请参见示例项目:https://openjfx.io/openjfx-docs/#maven。(对我来说并没有起作用。我有几个POM文件,并希望在子项目中引用JavaFX依赖项。我的主类无法被javafx-maven-plugin找到。)


1
额外的启动类对我有用。使用Netbeans 11.3,我使用“FXML JavaFX Maven Archetype(Gluon)”创建了一个新项目,可以构建但无法运行。问题是“为什么会这样工作?” - Doc
2
@Doc 在此处查看有关“sun.launcher.LauncherHelper”的信息:https://mail.openjdk.java.net/pipermail/openjfx-dev/2018-June/021977.html - Stefan
@斯特凡,你能给我一个样例项目的链接吗?确保它可以正常运行。 - Md. Asaduzzaman
@Md. Asaduzzaman 不好意思,我不再使用Java,并且旧项目中的在线内容已经没有了。祝你好运。 - Stefan

0

步骤1 - 在你的 src 中,第1步添加一个额外的主程序,我把它称为 Launcher,你可以在第2步图片中看到。

步骤2 - 然后,在 "extra" 类中创建一个主程序,并在其中调用 MainClassJavaFx 的主程序 第2步

步骤3 - 从项目结构中添加新的构件(artifact),并将 "extra class" 选为主程序,将 MANIFEST 文件夹重定位到 src 而非资源文件夹。第3步

步骤4 - 从 javafx sdk 文件夹中添加所有 dll。第4步

步骤5 - 构建构件(artifact)。

这样应该就可以了。


-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可以轻松完成此操作-查找代码中没有要求的错误并按alt-enter键)

一切都已经与模块等配合正常工作,我不得不使用Maven Shade插件来制作一个Fat Jar,将一切组合在一起。然后就可以通过命令行运行jar包。

然而,在经过两天的痛苦后,当我的Java 11代码@#$%@#终于正常工作后,我回到了Java 8(使用Correto SDK进行最新版本),因为Java 11没有打包功能,IntelliJ也无法为您完成该任务。


JavaFx 在我的模块中。 - Hilary Okoro
我已经解决了这个问题。Maven仓库在编译成单个jar文件时没有包含我的库。我不得不停止使用Maven进行编译,将我的源代码移动到另一个项目中,然后手动进行编译。 - Hilary Okoro

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