IntelliJ 中的 JavaFX Maven 项目。 JavaFX 运行时组件仅在 IntelliJ 中缺失。 JAR 通过 mvn 包执行没有问题

JavaFX Maven project in IntelliJ. JavaFX runtime components are missing only in IntelliJ. JAR through mvn package executes without issues

我有一个 Java 项目,通过 Maven 添加了 Spring 引导和 JavaFX。代码编译,甚至我可以在计算机中没有 JavaFX SDK 的情况下执行 fat jar。但是当我尝试在 IntelliJ 中执行它时,它会导致

Error: JavaFX runtime components are missing, and are required to run this application

我在很多问题中都看到过这个输出,在大多数情况下根本没有构建 jar 或者代码编译失败。

但在这种情况下,mvn package 可以正常工作,我可以使用 java -jar <jar_name> 执行 JAR,以消除我可能在某处安装了 javafx sdk 的事实,我在仅安装了 JRE 的 VM。

pom.xml

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

至于插件 spring-boot-maven-pluginmaven-compiler-plugin

尝试的解决方案

--1--

我试过说要添加

的解决方案
<plugin>
    <groupId>org.openjfx</groupId>
    <artifactId>javafx-maven-plugin</artifactId>
    <version>0.0.6</version>
    <executions>
        <execution>
            <id>default-cli</id>
            <configuration>
                <mainClass>com.example.demofx.Starter</mainClass>
            </configuration>
        </execution>
    </executions>
</plugin>

但它所做的是将能力添加到 运行 中:mvn clean javafx:run

需要用IntelliJ执行是为了调试代码,因为用souts调试效率不高。

--2--

尝试使用 module-info.jar 和以下

进行模块构建
module com.example.demofx {
    requires javafx.controls;
    requires javafx.fxml;
    // all other required modules including spring


    opens com.example.demofx to javafx.fxml;
    exports com.example.demofx;
}

这可能行得通,但由于一些旧的依赖项无法与模块化构建一起正常工作,这导致对代码库进行了大量重大更改。

编辑:

  1. 漏提环境
    • JDK - 11.0.8
    • IntelliJ IDEA - 2021.2.2
  2. 已尝试添加第二个解决方案。

与实际修复相比,这更像是故障排除和研究指南。环境问题的修复很难在 Whosebug 上下文中提供。但是,如果您研究此处的信息,它可能会帮助您修复项目。

推荐的故障排除方法

使用Intellij new JavaFX project wizard。确保它在您的环境中工作,然后逐渐将当前项目中的组件添加到工作项目中,检查每次小添加后一切是否仍然有效。

通过JavaFX maven插件执行时调试

我认为上述建议是首选方法,但是,您也可以使用以下方法:

run with: mvn clean javafx:run The need to execute with IntelliJ is to debug the code"

参见:

我还认为您可以右键单击 javafx:run 和 select 调试的 Maven 目标。我不确定,我没有使用 JavaFX maven 插件。

为 JavaFX 应用程序创建 fat jar

the fat jar

这不是推荐的配置,但如果你真的必须这样做,你可以回顾一下:

该答案没有讨论让这样的配置与 Idea run/debug 配置一起工作,因此它可能对您没有帮助。

如果您继续使用 fat jar,我不建议使用模块信息,因为无论如何您都会 运行宁代码离开类路径。

模块化与非模块化 JavaFX 应用程序

如果您不使用 fat jar,为 Spring 获取正确的所有模块依赖关系无论如何都是棘手的,因为 Spring 当前的架构无法很好地直接支持模块。 Spring 6 将被设计为与模块一起工作,但我认为如果你足够努力,你应该能够让 Spring 5 工作(我过去已经让它在某些应用程序中工作).

或者,您可以只将 JavaFX 组件作为模块,运行 将其余部分放在类路径之外。例如,openjfx.io 中的“Non-modular with Maven”方法。请注意,在该方法中,JDK 和 JavaFX 模块仍作为模块从模块路径加载,只有 Spring 您的应用程序未提供模块-info.java 文件,并且运行关闭类路径。

为 JavaFX 应用程序创建运行时间图像

我也建议学习:

  • .