Модульная система добавляет более сильную инкапсуляцию.Другими словами, это уже не тот случай, когда все классы отражательно доступны для всех остальных классов.
При обычном запуске 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;
}