相关疑难解决方法(0)

从 maven 使用 JavaFX11 构建可执行 JAR

我制作了一个使用 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)

maven java-11 javafx-11

8
推荐指数
1
解决办法
8271
查看次数

尝试运行JavaFX程序时发生InvocationTargetException

我刚刚从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)

java javafx

7
推荐指数
0
解决办法
2982
查看次数

使用 Gradle 在 IntelliJ 中运行 JavaFX 项目

我在 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)

java javafx intellij-idea gradle

5
推荐指数
1
解决办法
5385
查看次数

java.lang.IllegalAccessException:模块javafx.base无法访问类sample.model.Artists,因为模块未将sample.model打开到javafx.base

即使我使用了 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)

java javafx thread-safety

5
推荐指数
1
解决办法
8705
查看次数