IntelliJ 不会从 Maven 依赖项加载 javafx 包 (JavaFX 17)

2023-12-29

我正在尝试获取一个 Maven/JavaFX 项目,该项目是从javafx-原型-fxml原型且未经编辑,可在最新版本的 IntelliJ 中运行。需要明确的是,该项目是该原型的直接复制;我只是想让一个例子起作用。

可以说我是 Maven 的初学者,所以我可能在这里遗漏了一个明显的步骤。

Maven 构建很顺利,项目的pom.xml看起来就像 JavaFX 文档所说的那样。
除了更新之外我保持不变maven.compiler.source and maven.compiler.target属性,以及release财产在maven-compiler-plugin, to 16,我用于该项目的 JDK 版本:

    <project xmlns="http://maven.apache.org/POM/4.0.0" 
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
      xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven- 
    v4_0_0.xsd">
        <modelVersion>4.0.0</modelVersion>
        <groupId>com.epre</groupId>
        <artifactId>jfx-sandbox</artifactId>
        <version>0.0.1-SNAPSHOT</version>
        
        <properties>
            <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
            <maven.compiler.source>16</maven.compiler.source>
            <maven.compiler.target>16</maven.compiler.target>
        </properties>
        
        <dependencies>
            <dependency>
                <groupId>org.openjfx</groupId>
                <artifactId>javafx-controls</artifactId>
                <version>17</version>
            </dependency>
            <dependency>
                <groupId>org.openjfx</groupId>
                <artifactId>javafx-fxml</artifactId>
                <version>17</version>
            </dependency>
        </dependencies>
        
        <build>
            <plugins>
                <plugin>
                    <groupId>org.apache.maven.plugins</groupId>
                    <artifactId>maven-compiler-plugin</artifactId>
                    <version>3.8.0</version>
                    <configuration>
                        <release>16</release>
                    </configuration>
                </plugin>
                <plugin>
                    <groupId>org.openjfx</groupId>
                    <artifactId>javafx-maven-plugin</artifactId>
                    <version>0.0.6</version>
                    <executions>
                        <execution>
                            <!-- Default configuration for running -->
                            <!-- Usage: mvn clean javafx:run -->
                            <id>default-cli</id>
                            <configuration>
                                <mainClass>com.epre.App</mainClass>
                            </configuration>
                        </execution>
                    </executions>
                </plugin>
            </plugins>
        </build>
    
    </project>

依赖项显示在 Maven 选项卡中,我可以毫无问题地重新加载项目。同样,我可以看到javafx-base, -controls, -fxml, -graphics,以及它们对应的:win库已添加到项目中外部库(图) https://i.stack.imgur.com/Mnja8.png:

However,当我尝试运行该项目时Main类中,IntelliJ 抛出约 15 个错误,告诉我我尝试导入的许多包都不存在。

    java: package javafx.application does not exist  
    java: package javafx.fxml does not exist  
    java: package javafx.scene does not exist  
    java: package javafx.scene does not exist  
    java: package javafx.stage does not exist  
    java: cannot find symbol class Application  
    java: cannot find symbol class Scene  
    java: method does not override or implement a method from a supertype  
    java: cannot find symbol class Stage  
    java: cannot find symbol class Scene  
    java: cannot find symbol class Parent  
    java: cannot find symbol class FXMLLoader  
    java: cannot find symbol class FXMLLoader  
    java: cannot find symbol method launch()

这是Main类,只是为了显示我试图从中导入哪种包:

    package com.epre;
    
    import javafx.application.Application;
    import javafx.fxml.FXMLLoader;
    import javafx.scene.Parent;
    import javafx.scene.Scene;
    import javafx.stage.Stage;
    
    import java.io.IOException;
    
    /**
     * JavaFX App
     */
    public class App extends Application {
    
        private static Scene scene;
    
        @Override
        public void start(Stage stage) throws IOException {
            scene = new Scene(loadFXML("primary"), 640, 480);
            stage.setScene(scene);
            stage.show();
        }
    
        static void setRoot(String fxml) throws IOException {
            scene.setRoot(loadFXML(fxml));
        }
    
        private static Parent loadFXML(String fxml) throws IOException {
            FXMLLoader fxmlLoader = new FXMLLoader(App.class.getResource(fxml + ".fxml"));
            return fxmlLoader.load();
        }
    
        public static void main(String[] args) {
            launch();
        }
    
    }

我做了一些搜索并尝试修复与项目无关的每个问题,只是为了尝试隔离问题,即

  • 将项目语言级别更改为16
  • 将项目模块的每模块字节码版本更改为16
  • 替换实例"11" in the pom.xml with "16"如前面提到的
  • 在旧版本的 IntelliJ 中打开项目

但这些都没有产生任何改变。

在以前也使用 JavaFX 的非 Maven 项目中,我必须将项目所需的所有包添加到其模块信息.java。这是我能想到的唯一没有采取的步骤,因为据我所知,如果我将这些包声明为依赖项,我就不必处理它pom.xml?

编辑:我假设我不需要设置模块信息.java因为JavaFX文档从未提及将其作为创建Maven+JavaFK项目的步骤:https://openjfx.io/openjfx-docs/ https://openjfx.io/openjfx-docs/.
The JavaFX 和 IntelliJ > 使用 Maven 进行非模块化文档的部分简单地指出,加载项目后,“JavaFX 类将被识别”。

编辑2:我设法解决了包错误并通过更改JavaFX依赖关系来运行程序pom.xml to 版本16代替17。不知道为什么单个版本会像以前那样破坏程序,尽管我怀疑 JavaFX 的捆绑/分发方式可能发生了变化。


JavaFX 17.0.0.1 版本更新

JavaFX 17.0.0.1 的发布解决了这个问题,当使用 JavaFX 和 Maven 时,应该使用这个版本,而不是 17(在 Maven 中仍然存在问题)。

使用 Maven 定义 JavaFX 17 的依赖项时,请确保为 JavaFX 依赖项定义的版本不是 17 and 至少为 17.0.0.1。以下是 JavaFX 17.0.0.1 Maven 模块的工作依赖项定义的示例。

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

有关发行版本和内容的信息以及当前最新版本的版本号是可在 gluon 托管的 JavaFX 发行说明中找到 https://gluonhq.com/products/javafx/.

现在,我将保留原始答案的其余部分,其中讨论了一些背景信息,就像最初创建时一样。

适用于 17 之前的 JavaFX 版本(例如 16)的 Maven 模块仍然可以继续运行,没有问题。但是,如果您有能力为您的应用程序升级并使用 JavaFX 17.0.0.1 或更高版本,我鼓励您这样做。

JavaFX 17 将作为 JavaFX 的稳定长期版本进行维护。它将保持稳定的功能集,并获得多年的错误和安全修复支持。


背景

我能够复制这个问题。

这是一个已知问题,仅影响依赖于 Maven 中央存储库中当前可用的初始 JavaFX 17 版本工件的项目。

查看相关问题:

  • 自 JavaFX 17 起,无法再构建 JavaFX 库 https://stackoverflow.com/questions/69128172/javafx-lib-can-not-be-build-any-more-since-javafx-17

openjfx-dev 邮件列表上对该问题的讨论:

  • https://mail.openjdk.java.net/pipermail/openjfx-dev/2021-September/031934.html https://mail.openjdk.java.net/pipermail/openjfx-dev/2021-September/031934.html

解决方法

当前的一种解决方法是,如果您的应用程序依赖于 Maven 中心的 JavaFX 工件,请使用 JavaFX 16 而不是 JavaFX 17,直到此问题得到解决。

由于这是 JavaFX 17 版本的一个非常关键的问题,我预计它可能会在不久的将来在 JavaFX 17 版本的更新中得到解决。

环境

Mac OS (Catalina) 10.15.7

$ java -version
openjdk version "16.0.2" 2021-07-20
OpenJDK Runtime Environment Temurin-16.0.2+7 (build 16.0.2+7)
OpenJDK 64-Bit Server VM Temurin-16.0.2+7 (build 16.0.2+7, mixed mode, sharing)

IntelliJ IDEA 2021.2 (Ultimate Edition)
Build #IU-212.4746.92, built on July 27, 2021

复制步骤

  1. 在 Idea 中创建一个新的 JavaFX 项目
  • Select 新 |项目
  • 在左侧选项卡中选择 JavaFX。
  • 选择语言:Java,构建系统:Maven,项目 SDK:16
  • Select Next -> Finish
  1. 测试新项目。
  • 右键单击 HelloApplication 并选择运行“Hello Application.main()”
  • 应用程序应该运行并显示一个带有“Hello!”的 JavaFX 应用程序窗口。按钮。
  1. 更改JavaFX版本
  • Edit pom.xml
  • 将 JavaFX 依赖项版本从 16 更改为 17
  • maven-compiler-plugin 版本可以保持在 16。
  • 在 Maven 选项卡中,单击刷新图标以“重新加载所有 Maven 项目”
  1. 测试更新的项目。
  • 右键单击 HelloApplication 并选择运行“Hello Application.main()”

  • 执行现在将失败并显示错误消息:

    java: package javafx.fxml does not exist 
    
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

IntelliJ 不会从 Maven 依赖项加载 javafx 包 (JavaFX 17) 的相关文章

随机推荐