Основной метод не запускается внутри модуля - PullRequest
0 голосов
/ 13 октября 2018

Нужно ли запускать мой метод main внутри модуля или снаружи?

Я новичок в использовании модульной системы Java.Я пытаюсь создать простую программу с JavaFX на Java 10, так как это последняя версия Java, которая поддерживает JavaFX.

Я импортировал необходимые зависимости на свой module-info.java для JavaFX, который показывает просто окно.

sample.fxml код:

<?import javafx.scene.layout.GridPane?>
<GridPane fx:controller="com.gui.Controller"
          xmlns:fx="http://javafx.com/fxml" alignment="center" hgap="10" vgap="10">
</GridPane>

Когда я строю свой код, он говорит:

Warning:(4, 27) java: module not found: com.main

Когда я пытаюсь запустить свой код, я получаю:

Exception in Application constructor Exception in thread "main" 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:564)
    at java.base/sun.launcher.LauncherHelper$FXHelper.main(LauncherHelper.java:941)

Может ли кто-нибудь дать мне совет по этому поводу или каким-нибудь реальным советам приложения о создании проектов с модульной системой.

Ниже я приложил пару скриншотов.

Предупреждение о сборке:

enter image description here

Ошибка выполнения:

enter image description here

Ответы [ 3 ]

0 голосов
/ 13 октября 2018

Я исправил эту проблему, убедившись, что:

модули, для которых требуются зависимости javafx, также экспортируют сами себя, поскольку некоторым пакетам или модулям javafx требуются модули, которым это требуется.

ex,javafx.graphics

Также убедитесь, что ресурс fxml указан правильно.

1.) Исправление для ресурса fxml:

enter image description here

2.) Экспорт модуля, для которого требуются зависимости javafx:

Ошибка: (Чтение)

Caused by: java.lang.IllegalAccessException: class com.sun.javafx.application.LauncherImpl (in module javafx.graphics) cannot access class com.gui.GUI (in module com.gui) because module com.gui does not export com.gui to module javafx.graphics
    at java.base/jdk.internal.reflect.Reflection.newIllegalAccessException(Reflection.java:360)
    at java.base/java.lang.reflect.AccessibleObject.checkAccess(AccessibleObject.java:589)
    at java.base/java.lang.reflect.Constructor.newInstance(Constructor.java:479)
    at javafx.graphics/com.sun.javafx.application.LauncherImpl.lambda$launchApplication1$8(LauncherImpl.java:875)
    at javafx.graphics/com.sun.javafx.application.PlatformImpl.lambda$runAndWait$11(PlatformImpl.java:449)
    at javafx.graphics/com.sun.javafx.application.PlatformImpl.lambda$runLater$9(PlatformImpl.java:418)
    at java.base/java.security.AccessController.doPrivileged(Native Method)
    at javafx.graphics/com.sun.javafx.application.PlatformImpl.lambda$runLater$10(PlatformImpl.java:417)
    at javafx.graphics/com.sun.glass.ui.InvokeLaterDispatcher$Future.run(InvokeLaterDispatcher.java:96)
    at javafx.graphics/com.sun.glass.ui.win.WinApplication._runLoop(Native Method)
    at javafx.graphics/com.sun.glass.ui.win.WinApplication.lambda$runLoop$3(WinApplication.java:175)

Решение: module-info.java

module com.gui {
    requires javafx.graphics;
    requires javafx.fxml;
    exports com.gui;
}
0 голосов
/ 14 октября 2018

Модульная система добавляет более сильную инкапсуляцию.Другими словами, это уже не тот случай, когда все классы отражательно доступны для всех остальных классов.

При обычном запуске JavaFX для вас создается экземпляр вашего подкласса Application.Это делается с помощью рефлексии, что означает, что модуль, отвечающий за создание экземпляра подкласса (javafx.graphics), должен иметь рефлексивный доступ, необходимый для создания экземпляра открытого класса с помощью открытого конструктора без аргументов.Чтобы предоставить этот доступ, модуль, содержащий подкласс Application, должен exports соответствующий пакет для как минимум javafx.graphics.

Это описано в документации of Application:

...

Подкласс Application должен быть объявлен открытым и должен иметь открытый конструктор без аргументов.

...

Развертывание приложения в виде модуля

Если подкласс Application находится в именованном модуле, то этот класс должен быть доступен для модуля javafx.graphics.В противном случае при запуске приложения будет сгенерировано исключение.Это означает, что в дополнение к тому, что сам класс объявлен как открытый, модуль должен экспортировать (или открыть) содержащий пакет как минимум в модуль javafx.graphics.

Например, если com.foo.MyApplication находится в *Модуль 1035 *, module-info.java может выглядеть так:

module foo.app {
    exports com.foo to javafx.graphics;
}

Вы также, похоже, используете FXML.При необходимости вы должны убедиться, что соответствующие пакеты отражательно доступны для javafx.fxml (например, класс контроллера).Это задокументировано в Введение в FXML :

Развертывание приложения в виде модуля

Если для загрузки типов используется FXMLLoaderв именованном модуле приложение должно обеспечить, чтобы все типы, на которые имеются ссылки в файлах FXML, включая класс контроллера и любые пользовательские классы Node, были отражательно доступны для модуля javafx.fxml.Тип является отражательно доступным, если модуль opens содержит пакет, по крайней мере, для модуля javafx.fxml.

Например, если com.foo.MyController находится в модуле foo.app, module-info.java может выглядетькак это:

module foo.app {
    opens com.foo to javafx.fxml;
}
0 голосов
/ 13 октября 2018

Возможное подозрение здесь заключается в том, что вы используете com.main в качестве имени модуля в module-info.java, который, по утверждению IDE, не найден в проекте.

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

...