JavaFx IllegalAccessError, когда я запускаю приложение из основного метода класса приложения и использую fxmloader - PullRequest
0 голосов
/ 20 марта 2020

Я использую JavaFx 11 и gradle для модулей javafx, когда я запускаю приложение из другого класса, кроме самого класса приложения, все работает нормально, но я хочу запустить приложение в главном классе класса Application и затем создать сцена в другом. Это мой рабочий пример

Основной класс, из которого я вызываю запуск:

public class RestaurantApplication{
    public static void main(String[] args) {
        Application.launch(StageManager.class, args);
    }
}

Класс приложения:

public class StageManager extends Application {

    public void start(Stage primaryStage) throws Exception {
        currentStage = initializeFirstLoginStyle(primaryStage);
    }

    private Stage initializeFirstLoginStyle(Stage stage) throws IOException {

        FXMLLoader loader = new FXMLLoader(getClass().getResource("/FXML/login-first.fxml"));
        Pane root = loader.load();
        ...
    }
}

При таком подходе все работает, но когда Я пытаюсь запустить приложение в том же классе, что и приложение, которое оно мне выдает. Ошибка:

Caused by: java.lang.IllegalAccessError: class com.sun.javafx.fxml.FXMLLoaderHelper (in unnamed module @0x71d2156a) 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 @0x71d2156a
at com.sun.javafx.fxml.FXMLLoaderHelper.<clinit>(FXMLLoaderHelper.java:38)

Это подход с ошибкой:

Основной класс, который теперь запускается, который вызов другого класса для создания моей сцены:

public class RestaurantApplication extends Application{

    @Override
    public void start(Stage primaryStage) throws Exception {
        StageManager stageManager = new StageManager();
        stageManager.initializeStages(primaryStage);

    }

    public static void main(String[] args) {
        Application.launch(args);
    }

}

класс сцены:

public class StageManager extends RestaurantApplication {
    public void initializeStages(Stage primaryStage) throws Exception {
        currentStage = initializeFirstLoginStyle(primaryStage);
        currentStage.show();
    }

    private Stage initializeFirstLoginStyle(Stage stage) throws IOException {

        FXMLLoader loader = new FXMLLoader(getClass().getResource("/FXML/login-first.fxml"));
        Pane root = loader.load();
        ...

Также мой gradle:

plugins {
    id 'java'
    id 'application'
    id 'org.openjfx.javafxplugin' version '0.0.7'
}
group 'fda'
version '1.0-SNAPSHOT'

sourceCompatibility = 1.8

repositories {
    mavenCentral()
}

dependencies {
    compile group: 'com.google.code.gson', name: 'gson', version: '2.8.5'
    compile group: 'org.json', name: 'json', version: '20180813'
    compile group: 'com.googlecode.json-simple', name: 'json-simple', version: '1.1.1'
    compile group: 'org.apache.httpcomponents', name: 'httpclient', version: '4.5'
    compile group: 'commons-io', name: 'commons-io', version: '2.6'
    compile group: 'org.kohsuke', name: 'github-api', version: '1.93'
    compile group: 'com.1stleg', name: 'jnativehook', version: '2.1.0'
    compile group: 'org.apache.commons', name: 'commons-collections4', version: '4.3'
    testCompile group: 'org.slf4j', name: 'slf4j-simple', version: '1.6.1'
    compile group: 'com.fasterxml.jackson.datatype', name: 'jackson-datatype-jsr310', version: '2.9.8'


}
javafx {
    modules = [ 'javafx.controls', 'javafx.fxml', 'javafx.media' ]
}

Та же ошибка присутствует, даже если я попробуйте создать этап в классе Application:

public class RestaurantApplication extends Application{

    @Override
    public void start(Stage primaryStage) throws Exception {
        FXMLLoader loader = new FXMLLoader(getClass().getResource("/FXML/login-first.fxml"));
        Pane root = loader.load();
    }

    public static void main(String[] args) {
        Application.launch(args);
    }

}

Так что единственный подход, который работает, - это если я вызову другой класс в launch (). Но в целом это должно работать в обе стороны. Это ошибка Gradle?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...