gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-04 11:49:51 58 4
gpt4 key购买 nike

我正在尝试让一个从 javafx-archetype-fxml 原型(prototype)创建且未经编辑的 Maven/JavaFX 项目在最新版本的 IntelliJ 中运行。需要明确的是,该项目是该原型(prototype)的直接副本;我只是想让一个例子起作用。
可以说我是一个完整的 Maven 初学者,所以我可能只是在这里遗漏了一个明显的步骤。
Maven 构建进行得很顺利,项目的 pom.xml 看起来就像 JavaFX 文档所说的那样。
除了更新 maven.compiler.source 之外,我保持不变和 maven.compiler.target属性,以及 release属性(property)在maven-compiler-plugin , 至 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库已添加到项目的 External Libraries (pic) :
然而 ,当我尝试运行项目的 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
  • 将项目模块的 Per-module 字节码版本更改为 16
  • 替换 的实例"11"在 pom.xml 中使用 "16"如前所述
  • 在旧版本的 IntelliJ 中打开项目

  • 然而,这些都没有产生任何变化。
    在以前也使用 JavaFX 的非 Maven 项目中,我必须将项目所需的所有包添加到它的 module-info.java 中。这是我能想到的唯一没有采取的步骤,因为我的理解是,如果我在 pom.xml 中将这些包声明为依赖项,则不必处理它?
    编辑:我假设我不需要设置 module-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 的捆绑/分发方式可能发生了变化。

    最佳答案

    JavaFX 17.0.0.1 版本的更新
    JavaFX 17.0.0.1 的发布已经解决了这个问题,当使用 JavaFX 和 Maven 时,应该使用这个版本而不是 17(在 Maven 中仍然存在问题)。
    使用 Maven 定义对 JavaFX 17 的依赖项时,请确保为 JavaFX 依赖项定义的版本 不是 17 至少是 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>
    现在,我将保留原始答案的其余部分,其中讨论了一些背景信息,就像最初创建时一样。
    17(例如 16)之前 JavaFX 版本的 Maven 模块仍然可以继续正常运行。但是,如果您有能力为您的应用程序升级和使用 JavaFX 17.0.0.1 或更高版本,我鼓励这样做。
    JavaFX 17 将作为 JavaFX 的稳定长期版本进行维护。它将保持稳定的功能集并获得错误和安全修复支持多年。

    背景
    我能够复制这个问题。
    这是一个已知问题,仅影响依赖于 Maven 中央存储库中当前可用的初始 JavaFX 17 版本 Artifact 的项目。
    见相关问题:
  • 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

  • 解决方法
    当前的一种解决方法是,如果您的应用程序依赖来自 Maven 中心的 JavaFX Artifact ,则在此问题得到修复之前,使用 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
    复制步骤
  • 在 Idea 中创建一个新的 JavaFX 项目
  • 选择 新 |项目
  • 在左侧选项卡中选择 JavaFX。
  • 选择语言:Java,构建系统:Maven,项目 SDK:16
  • 选择 下一个 -> 完成
  • 测试新项目。
  • 右键单击 HelloApplication 并选择 运行“HelloApplication.main()”
  • 应用程序应该运行并显示一个带有“Hello!”的 JavaFX 应用程序窗口。按钮。
  • 更改 JavaFX 版本
  • 编辑 pom.xml
  • 将 JavaFX 依赖版本从 16 更改为 17
  • maven-compiler-plugin 版本可以保持在 16。
  • 在 Maven 选项卡中,单击刷新图标以“重新加载所有 Maven 项目”
  • 测试更新的项目。
  • 右键单击 HelloApplication 并选择 运行“HelloApplication.main()”
  • 执行现在将失败并显示错误消息:
    java: package javafx.fxml does not exist 
  • 关于java - IntelliJ 不从 Maven 依赖项加载 javafx 包 (JavaFX 17),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/69116905/

    58 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com