如何解决“错误:缺少JavaFX运行时组件,并且是运行此应用程序所必需的”

时间:2019-07-04 22:08:26

标签: javafx-11

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

  

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

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

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

2 个答案:

答案 0 :(得分:1)

a)对于我的Maven项目,诀窍是使用不继承自javafx.application.Application:

额外启动器类
public class GUIStarter {

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

}

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

<!-- 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 :(得分:0)

在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输入)

一旦一切都与模块等一起使用,我必须使用我认为的Maven阴影插件制作一个Fat Jar,以将所有内容组合在一起。然后它将可以从命令行运行jar。

但是,经过2天的痛苦之后,我的Java 11代码@#$%@#工作了之后,我又回到了Java 8(使用最新版本的correto SDK),因为Java 11没有包装,而IntelliJ可以为你做。