无法访问类 com.sun.javafx.util.Utils(在模块 javafx.graphics 中)-JavaFX 和 Eclipse
Posted
技术标签:
【中文标题】无法访问类 com.sun.javafx.util.Utils(在模块 javafx.graphics 中)-JavaFX 和 Eclipse【英文标题】:Cannot access class com.sun.javafx.util.Utils (in module javafx.graphics) - JavaFX & Eclipse 【发布时间】:2019-10-11 23:04:30 【问题描述】:我已经按照guide 将 JavaFX 设置到 Linux 机器上。 首先我安装了 Java 11
asus@asus-pc:/usr/share/openjfx/lib$ java -version
openjdk version "11.0.3" 2019-04-16
OpenJDK Runtime Environment (build 11.0.3+7-Ubuntu-1ubuntu219.04.1)
OpenJDK 64-Bit Server VM (build 11.0.3+7-Ubuntu-1ubuntu219.04.1, mixed
mode, sharing)
asus@asus-pc:/usr/share/openjfx/lib$
然后我通过命令sudo apt-get install openjfx
安装了OpenJFX
asus@asus-pc:/usr/share/openjfx/lib$ ls
javafx.base.jar javafx.graphics.jar javafx.swing.jar
javafx.controls.jar javafx.media.jar javafx.web.jar
javafx.fxml.jar javafx.properties src.zip
asus@asus-pc:/usr/share/openjfx/lib$
然后在 Eclipse 中创建了一个库。
然后我将它包含到我的 java 项目中。我尝试运行这段代码:
package se.danielmartensson.start;
import javafx.application.Application;
import javafx.fxml.FXMLLoader;
import javafx.scene.Parent;
import javafx.scene.Scene;
import javafx.stage.Stage;
public class Main extends Application
/*
* Start the start(Stage front)
*/
public static void main(String[] args)
launch();
@Override
public void start(Stage front) throws Exception
Parent root = FXMLLoader.load(getClass().getResource("/JUSBPlotter/src/se/danielmartensson/fxml/front.fxml"));
Scene scene = new Scene(root);
front.setScene(scene);
front.setTitle("Fracken");
front.show();
我已将运行配置更改为:
但是当我编译代码时。我得到这个错误:
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: class com.sun.javafx.fxml.FXMLLoaderHelper (in unnamed module @0x1ff6d2c7) cannot access class com.sun.javafx.util.Utils (in module javafx.graphics) because module javafx.graphics does not export com.sun.javafx.util to unnamed module @0x1ff6d2c7
at com.sun.javafx.fxml.FXMLLoaderHelper.<clinit>(FXMLLoaderHelper.java:38)
at javafx.fxml.FXMLLoader.<clinit>(FXMLLoader.java:2056)
at se.danielmartensson.start.Main.start(Main.java:20)
at javafx.graphics/com.sun.javafx.application.LauncherImpl.lambda$launchApplication1$9(LauncherImpl.java:846)
at javafx.graphics/com.sun.javafx.application.PlatformImpl.lambda$runAndWait$12(PlatformImpl.java:455)
at javafx.graphics/com.sun.javafx.application.PlatformImpl.lambda$runLater$10(PlatformImpl.java:428)
at java.base/java.security.AccessController.doPrivileged(Native Method)
at javafx.graphics/com.sun.javafx.application.PlatformImpl.lambda$runLater$11(PlatformImpl.java:427)
at javafx.graphics/com.sun.glass.ui.InvokeLaterDispatcher$Future.run(InvokeLaterDispatcher.java:96)
at javafx.graphics/com.sun.glass.ui.gtk.GtkApplication._runLoop(Native Method)
at javafx.graphics/com.sun.glass.ui.gtk.GtkApplication.lambda$runLoop$11(GtkApplication.java:277)
... 1 more
Exception running application se.danielmartensson.start.Main
问题:
有没有人知道如何解决这个错误?我之前已经设置了 JavaFX,但是这一次,它对我不起作用。
编辑 1: 如果我将运行配置更改为:
--module-path="/usr/share/openjfx/lib" --add-modules=javafx.controls,javafx.fxml
我收到此错误
【问题讨论】:
重复这个问题:IntelliJ IDEA - Error: JavaFX runtime components are missing, and are required to run this application @JoséPereda 我已经尝试过该解决方案,但对我不起作用。 您可能还有其他错误,但您需要在 VM 参数中包含javafx.fxml
。
@JoséPereda 如果我将--module-path="/usr/share/openjfx/lib" --add-modules=javafx.controls,javafx.fxml
应用于我的运行配置,错误就会改变。现在我得到Caused by: java.lang.NullPointerException: Location is required.
,因为它找不到 .fxml 文件,即使我已将位置粘贴到代码中。
您永远不会将 src
添加到 getResource()
... 因为它会从那里开始精确地查找您的文件...
【参考方案1】:
在带有 JDK 14 的 IntelliJ IDEA 2020.1 中遇到同样的问题。
如果你使用maven,最后通过在src/main/java
下面添加一个module-info.java
来解决:
module sample
requires javafx.controls;
requires javafx.graphics;
opens sample;
【讨论】:
我们必须在哪里添加这个? @VasilValchev 在 src/main/java 下,如果你使用的是 maven。【参考方案2】:谢谢,为我工作如下
public void start(Stage primaryStage) throws Exception
Parent root = FXMLLoader.load(getClass().getResource("sample.fxml"));
模块信息.java:
module sample
requires javafx.controls;
requires javafx.graphics;
requires javafx.fxml;
opens sample ;
【讨论】:
【参考方案3】:谢谢你igonejack。我按照你说的做了,但在那之后我遇到了其他一些异常,所以我想出了以下代码:
module pkg
requires javafx.controls;
requires javafx.graphics;
requires javafx.fxml;
exports pkg of Application class;
opens pkg;
之后,您可能因为 Kotlin 的一些异常而需要重新构建您的项目。 然后我看到异常“未设置位置”。要解决此问题,您必须以“/”开头 fxml 位置,例如:
App.class.getResource("/form.fxml");
编辑
我使用 Gradle 在JavaFxHelloWorld 创建了一个 HelloWorld 项目。
【讨论】:
【参考方案4】:转到 Run>Run Configurations 然后 Arguments 选项卡并转到 VM Arguments 并粘贴以下代码以添加模块 “--module-path /path/to/lib --add-modules javafx.controls,javafx.fxml” 请记住将 /path/to/lib 修改为您的库路径 然后点击应用,你就设置好了
【讨论】:
以上是关于无法访问类 com.sun.javafx.util.Utils(在模块 javafx.graphics 中)-JavaFX 和 Eclipse的主要内容,如果未能解决你的问题,请参考以下文章