Невозможно получить доступ к классу com.sun.javafx.util.Utils (в модуле javafx.graphics) - JavaFX и Eclipse

Я следую этому руководству по настройке 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$ 

Затем я установил OpenJFX с помощью команды sudo apt-get install 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

Я получаю эту ошибку  введите описание изображения здесь


person Daniel Mårtensson    schedule 25.05.2019    source источник
comment
@ JoséPereda Я пробовал это решение, но оно не сработало.   -  person Daniel Mårtensson    schedule 25.05.2019
comment
У вас могут быть другие ошибки, но вам необходимо включить javafx.fxml в аргументы вашей виртуальной машины.   -  person José Pereda    schedule 25.05.2019
comment
@ JoséPereda Если я применю --module-path="/usr/share/openjfx/lib" --add-modules=javafx.controls,javafx.fxml к моей конфигурации запуска, ошибки изменятся. Теперь я получаю Caused by: java.lang.NullPointerException: Location is required., потому что он не может найти файл .fxml, даже если я вставил его местоположение в код.   -  person Daniel Mårtensson    schedule 25.05.2019
comment
Именно это я и сказал: у вас есть другие ошибки. Но первым делом добавьте модуль FXML. Затем устраните следующую ошибку: удалите /JUSBPlotter/src/ из пути для загрузки файла FXML.   -  person José Pereda    schedule 25.05.2019
comment
@ JoséPereda Теперь он работает. Как вы могли узнать, что /JUSBPlotter/src/ вызывает эту проблему?   -  person Daniel Mårtensson    schedule 25.05.2019
comment
Вы никогда не добавляете src к _2 _..., поскольку он начинает искать ваш файл именно оттуда ...   -  person José Pereda    schedule 25.05.2019
comment
Если вы удалите /JUSBPlotter/src/ из пути к ресурсу, вы удалите на одну букву слишком много. Если вы указываете путь к ресурсу, начиная с корня пути к классам, путь должен начинаться с /; следующая часть соответствует структуре пакета с заменой . на /, за исключением расширения файла. Я настоятельно рекомендую использовать модуль самостоятельно и добавлять правильные операторы requires вместо использования аргументов vm для добавления доступа к модулям.   -  person fabian    schedule 26.05.2019
comment
Вам не нужно указывать путь к модулю при запуске приложения. Eclipse позаботится об этом за вас.   -  person Johannes Kuhn    schedule 19.09.2019
comment
@JohannesKuhn Спасибо за информацию.   -  person Daniel Mårtensson    schedule 19.09.2019


Ответы (4)


Такая же проблема с IntelliJ IDEA 2020.1 с JDK 14.

Наконец, решено добавлением module-info.java, подобного этому, под src/main/java, если вы используете maven:

module sample {
    requires javafx.controls;
    requires javafx.graphics;

    opens sample;
}
person igonejack    schedule 24.04.2020
comment
и где это добавить? - person Vasil Valchev; 14.05.2020
comment
@VasilValchev в src / main / java, если вы используете maven. - person igonejack; 15.05.2020

спасибо, у меня работает следующим образом

public void start(Stage primaryStage) throws Exception{
        Parent root = FXMLLoader.load(getClass().getResource("sample.fxml"));

module-info.java:

module sample {
    requires javafx.controls;
    requires javafx.graphics;
    requires javafx.fxml;
    opens sample ;
}
person sveta    schedule 18.06.2020

Спасибо, 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");

Изменить

Я сделал проект HelloWorld на JavaFxHelloWorld с помощью Gradle.

person user2971399    schedule 13.05.2020

Перейдите в меню «Выполнить» ›« Выполнить конфигурации », затем на вкладку« Аргументы », перейдите в раздел« Аргументы виртуальной машины »и вставьте следующий код для добавления модулей --module-path / path / to / lib --add-modules javafx.controls, javafx.fxml не забудьте изменить / path / to / lib на свой путь к вашей библиотеке, затем нажмите `` Применить '', и вы настроены

person cyrus korir    schedule 24.01.2021