我试图从javafx-archetype-fxml原型创建一个未经编辑的Maven/JavaFX项目,以在IntelliJ的最新版本中运行。明确地说,该项目是该原型的直接复制;我只是想让一个例子起作用。
可以说我是一个完全的Maven初学者,所以我可能只是在这里错过了一个明显的步骤。
Maven构建进行得很顺利,项目的pom.xml看起来与JavaFX文档所说的一样。
除了将Maven.compiler.source
和Maven.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();
}
}
然而,这些都没有产生任何变化。
在以前也使用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的捆绑/分发方式可能发生了变化,但我不确定为什么一个版本会像以前那样破坏程序。
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发布构件的项目。
见相关问题:
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
pom.xml
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