我制作了一个使用 Maven、JavaFX 和其他一些依赖项的 Java 应用程序。以前,构建一个可执行的 jar 很容易,但由于 Java11 是模块化的并且不包含 JavaFX,我无法构建一个可用的 jar。
我已经尝试了很多东西,但我不知道我现在应该做什么。
我的 pom.xml
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.8.0</version>
<configuration>
<verbose>true</verbose>
</configuration>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-jar-plugin</artifactId>
<version>2.4</version>
<configuration>
<outputDirectory>out/</outputDirectory>
<archive>
<manifest>
<addClasspath>true</addClasspath>
<classpathPrefix>lib/</classpathPrefix>
<mainClass>fr.crosf32.fxtest.Entry</mainClass>
</manifest>
</archive>
</configuration>
</plugin>
</plugins>
</build>
Run Code Online (Sandbox Code Playgroud)
我尝试构建包含所有依赖项的工件,但在运行时出现错误 (java -jar ):
Exception in thread "Thread-0" java.lang.NoClassDefFoundError: javafx/application/Application
at java.base/java.lang.ClassLoader.defineClass1(Native Method)
at java.base/java.lang.ClassLoader.defineClass(ClassLoader.java:1016)
at java.base/java.security.SecureClassLoader.defineClass(SecureClassLoader.java:174)
at java.base/jdk.internal.loader.BuiltinClassLoader.defineClass(BuiltinClassLoader.java:802)
at java.base/jdk.internal.loader.BuiltinClassLoader.findClassOnClassPathOrNull(BuiltinClassLoader.java:700)
at java.base/jdk.internal.loader.BuiltinClassLoader.loadClassOrNull(BuiltinClassLoader.java:623)
at java.base/jdk.internal.loader.BuiltinClassLoader.loadClass(BuiltinClassLoader.java:581)
at java.base/jdk.internal.loader.ClassLoaders$AppClassLoader.loadClass(ClassLoaders.java:178)
at java.base/java.lang.ClassLoader.loadClass(ClassLoader.java:521)
at fr.crosf32.fxtest.SlimForest.lambda$new$0(SlimForest.java:26)
at java.base/java.lang.Thread.run(Thread.java:834)
Caused by: java.lang.ClassNotFoundException: javafx.application.Application
at java.base/jdk.internal.loader.BuiltinClassLoader.loadClass(BuiltinClassLoader.java:583) …
Run Code Online (Sandbox Code Playgroud) 我刚刚从Java 10.0.1迁移到Java 11,我试图创建JavaFX应用程序,但是由于某些原因,即使我使用的这段简单代码只是将TextArea加载到场景并将场景加载到舞台上。它给了我这个错误:
Exception in Application start method
java.lang.reflect.InvocationTargetException
at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.base/java.lang.reflect.Method.invoke(Method.java:566)
at javafx.graphics/com.sun.javafx.application.LauncherImpl.launchApplicationWithArgs(LauncherImpl.java:464)
at javafx.graphics/com.sun.javafx.application.LauncherImpl.launchApplication(LauncherImpl.java:363)
at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.base/java.lang.reflect.Method.invoke(Method.java:566)
at java.base/sun.launcher.LauncherHelper$FXHelper.main(LauncherHelper.java:1051)
Caused by: java.lang.RuntimeException: Exception in Application start method
at javafx.graphics/com.sun.javafx.application.LauncherImpl.launchApplication1(LauncherImpl.java:900)
at javafx.graphics/com.sun.javafx.application.LauncherImpl.lambda$launchApplication$2(LauncherImpl.java:195)
at java.base/java.lang.Thread.run(Thread.java:834)
Caused by: java.lang.IllegalAccessError: superclass access check failed: class com.sun.javafx.scene.control.ControlHelper (in unnamed module @0x84d43ff) cannot access class com.sun.javafx.scene.layout.RegionHelper (in module javafx.graphics) because module javafx.graphics does not export com.sun.javafx.scene.layout to unnamed module @0x84d43ff
at java.base/java.lang.ClassLoader.defineClass1(Native …
Run Code Online (Sandbox Code Playgroud) 我在 IntelliJ IDE 中使用 JavaFX 和 Gradle 运行 Java 程序时遇到问题。我已经研究了许多似乎是同一问题的解决方案,但这些都不起作用。
这个问题:IntelliJ + Gradle + JavaFX Building, but not running与我遇到的问题以及我尝试过的修复非常相似。但是该解决方案对我不起作用。
目前我正在尝试运行一个非常简单的应用程序:
import javafx.application.Application;
import javafx.scene.Scene;
import javafx.scene.control.TextField;
import javafx.scene.layout.BorderPane;
import javafx.stage.Stage;
public class GUI extends Application {
@Override
public void start(Stage primaryStage) throws Exception {
var pane = new BorderPane();
var input = new TextField();
primaryStage.setScene(new Scene(pane));
primaryStage.show();
}
}
Run Code Online (Sandbox Code Playgroud)
使用命令行和“gradlew run”时,此应用程序确实可以运行,但使用 IntelliJ IDEA IDE 时,它不会运行。
奇怪的是,如果我删除 TextField '输入',程序运行就没有问题。这让我相信问题与 java.controls 模块有关。然而,这是导入到我的 build.gradle 中的:
plugins {
id 'java'
id 'application' …
Run Code Online (Sandbox Code Playgroud) 即使我使用了 SimpleStringProperty 和 SimpleIntegerProperty,每次单击“列出艺术家”按钮时都会出现以下错误。
May 03, 2021 9:33:22 PM javafx.scene.control.cell.PropertyValueFactory getCellDataReflectively
WARNING: Can not retrieve property 'name' in PropertyValueFactory: javafx.scene.control.cell.PropertyValueFactory@7bcaa928 with provided class type: class sample.model.Artists
java.lang.RuntimeException: java.lang.IllegalAccessException: module javafx.base cannot access class sample.model.Artists (in module MusicUI) because module MusicUI does not open sample.model to javafx.base
at javafx.base/com.sun.javafx.property.PropertyReference.get(PropertyReference.java:176)
at javafx.controls/javafx.scene.control.cell.PropertyValueFactory.getCellDataReflectively(PropertyValueFactory.java:184)
at javafx.controls/javafx.scene.control.cell.PropertyValueFactory.call(PropertyValueFactory.java:154)
at javafx.controls/javafx.scene.control.cell.PropertyValueFactory.call(PropertyValueFactory.java:133)
at ....
Run Code Online (Sandbox Code Playgroud)
控制器类具有“列出艺术家”按钮的事件处理程序:当我们调用 new Thread(task).start() 时,会出现此错误
public class Controller {
@FXML
public TableView<Artists> artistTable;
@FXML
public void listArtists(){
Task<ObservableList<Artists>> task = new GetAllArtistsTask();
artistTable.itemsProperty().bind(task.valueProperty());
new Thread(task).start(); …
Run Code Online (Sandbox Code Playgroud)