【问题标题】:JavaFX Maven project in IntelliJ. JavaFX runtime components are missing only in IntelliJ. JAR through mvn package executes without issuesIntelliJ 中的 JavaFX Maven 项目。 JavaFX 运行时组件仅在 IntelliJ 中缺失。 JAR 通过 mvn 包执行没有问题
【发布时间】:2021-12-13 23:25:24
【问题描述】:

我有一个通过 maven 添加了 Spring Boot 和 JavaFX 的 Java 项目。代码编译,甚至我可以在计算机中没有 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. 已尝试添加第二个解决方案。

【问题讨论】:

  • 你的“主要”课程是什么?您是否尝试使用扩展应用程序的类来启动它?我知道有一种使用非模块化 javafx 的解决方法,您需要使用 main 创建一个单独的类,然后从那里启动您的应用程序。
  • 你检查过这里吗? github.com/openjfx/samples#IntelliJ-Non-Modular-Samples你用的是什么版本的javafx?
  • @matt 至于您发送的 lib,我目前在 pom 中具有相同的依赖项和插件,并且 Main 类也与非模块化示例中的类似。正如我在打包工作后提到的代码。只是 IntelliJ 无法将该项目检测为 JavaFX 项目。但是如果我创建了一个新项目并选择了新的 javafx 项目选项,那么具有相同 pom.xml 的相同代码可以工作。

标签: java maven intellij-idea javafx


【解决方案1】:

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

推荐的故障排除方法

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

通过 JavaFX maven 插件执行时的调试

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

运行:mvn clean javafx:ru​​n 用 IntelliJ 执行的需要是调试代码”

见:

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

为 JavaFX 应用程序创建 fat jars

肥罐

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

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

如果你继续使用胖 jar,我不建议使用模块信息,因为无论如何你都会在类路径之外运行代码。

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

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

或者,您可以只将 JavaFX 组件作为模块,并在类路径之外运行其余组件。例如,openjfx.io 的“使用 Maven 的非模块化”方法。请注意,在这种方法中,JDK 和 JavaFX 模块仍然作为模块加载到模块路径之外,只有 Spring 您的应用程序没有提供 module-info.java 文件并在类路径之外运行。

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

我也建议学习:

【讨论】:

  • 这里提到的第二种解决方案允许您远程连接到调试服务器为我完成这项工作
猜你喜欢
  • 1970-01-01
  • 2022-01-18
  • 2021-10-22
  • 2018-03-13
  • 2020-05-21
  • 2020-12-21
  • 2019-03-14
  • 2021-08-21
相关资源
最近更新 更多