我正在尝试获取一个 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 的捆绑/分发方式可能发生了变化。