当前位置: 首页 > 知识库问答 >
问题:

IntelliJ不从Maven依赖项加载javafx包(JavaFX17)

公西繁
2023-03-14

我试图从javafx-archetype-fxml原型创建一个未经编辑的Maven/JavaFX项目,以在IntelliJ的最新版本中运行。明确地说,该项目是该原型的直接复制;我只是想让一个例子起作用。

可以说我是一个完全的Maven初学者,所以我可能只是在这里错过了一个明显的步骤。

Maven构建进行得很顺利,项目的pom.xml看起来与JavaFX文档所说的一样。
除了将Maven.compiler.sourceMaven.compiler.target属性以及maven-compiler-plugin中的release属性更新为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库已经添加到项目的外部库(pic)中:

然而,当我试图运行项目的主类时,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()

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

    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();
        }
    
    }
    null

然而,这些都没有产生任何变化。

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

编辑:我假设我不需要设置模块-info.java,因为JavaFX文档从未提到它是创建Maven+JavaFK项目的一个步骤:https://openjfx.io/openjfx-docs/.
文档中的JavaFX and IntelliJ>Non-modular with Maven一节只是声明,在加载项目时,“将识别JavaFX类”。

编辑2:我设法解决了包错误,并通过将pom.xml中的JavaFX依赖项更改为版本16,而不是17来运行程序。虽然我怀疑JavaFX的捆绑/分发方式可能发生了变化,但我不确定为什么一个版本会像以前那样破坏程序。

共有1个答案

微生毅
2023-03-14

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

使用Maven在JavaFX 17上定义依赖项时,确保为JavaFX依赖项定义的版本不是17,至少是17.0.0.1。下面是JavaFX17.0.0.1Maven模块的工作依赖定义示例。

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

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

这是一个已知的问题,只影响依赖于Maven central Repository中当前可用的初始JavaFX17发布构件的项目。

见相关问题:

  • JavaFX 17之后无法再构建JavaFX lib
    null
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
    null
  • 选择新项目
  • 在左侧选项卡中选择JavaFX。
  • 选择语言:Java、Build System:Maven、Project SDK:16
  • 选择下一步->完成
  • 右键单击HelloApplication并选择Run'HelloApplication.main()'
  • 应用程序应该运行并显示一个带有“hello!”的JavaFX应用程序窗口按钮。
  • 编辑pom.xml
  • 将JavaFX依赖项版本从16更改为17
  • maven-compiler-plugin版本可以保持在16。
  • 在Maven选项卡中,单击刷新图标以“重新加载所有Maven项目”
java: package javafx.fxml does not exist 
 类似资料:
  • 如何从其 GitHub 存储库(该库使用 Maven 作为构建系统)添加 Java 库作为依赖项添加到我的 Maven 项目中?我可以在不下载和编译库的情况下执行此操作吗?

  • 从我读到的内容来看,我似乎需要一个pom.xml文件。也许我应该先以某种方式将maven添加到项目中?

  • 我正在尝试分发一个包含alle maven依赖项的JavaFX jar文件。然而,我的唯一工作的构建将maven依赖项提取为.jar文件。 我的pom文件包含以下行: http://maven.apache.org/xsd/maven-4.0.0.xsd“>4.0.0

  • 我在使用Maven 3,IntelliJ IDEA的最新版本,java 8和kotlin 1.5时遇到了一些奇怪的行为: 我有一个静态编程语言jar作为本地文件系统的依赖项。 当创建一个新的Java项目,添加maven框架并将依赖项(带有系统范围)添加到我的POM时,它会正确加载到我的IntelliJ类路径中,我可以在我的代码中使用它。 创建静态编程语言项目时,添加maven框架并将具有相同POM

  • 一个月前,我可以在IntelliJ的基础上从头开始成功地构建Java应用程序,现在,我必须升级spring boot以获得一些新功能。但是,在我将spring boot的版本从2.2.2更改之后。发布到其他版本,然后单击“重新加载所有Maven项目”按钮,我会收到以下消息: 一个月前下载2.2.2还可以。释放。为什么此时更新失败?我的信息如下:MacOS 12.2,捆绑(Maven 3),Java

  • 问题内容: 是否可以在pom.xml中将JavaFX 2.0引用为Maven中的依赖项,以便一切顺利进行? 我在这个问题中看到可以在本地安装jfxrt.jar,但是理想情况下,我希望使用一种更简单的方法,在该方法中可以正确解决依赖关系并下载它,而无需任何本地黑客。 问题答案: 不,目前还没有这样的解决方案。我怀疑它会永远存在,因为从Java 1.7更新2开始,JavaFX与JVM一起安装了。从Ja