ПРИМЕЧАНИЕ. Начиная с Java 11 JavaFX - это отдельный проект.

я есть два модуля JPMS в двух файлах:modulea.jar а такжеmoduleb.jar, Модуль требуетjavafx.controls модуль. Мне нужно использовать эти модули в новом слое, поэтому я делаю:

ModuleFinder finder = ModuleFinder.of(modAPath, modBPath);
ModuleLayer parent = ModuleLayer.boot();
Configuration cf = parent.configuration().resolveAndBind(finder, ModuleFinder.of(), new HashSet<>());
ClassLoader scl = ClassLoader.getSystemClassLoader();
ModuleLayer newLayer = parent.defineModulesWithOneLoader(cf, scl);

Я думал, что модули JDK будут загружены автоматически, но я получаю

Exception in thread "main" java.lang.module.FindException: Module javafx.controls not found, required by modulea
    at java.base/java.lang.module.Resolver.findFail(Resolver.java:889)
    at java.base/java.lang.module.Resolver.resolve(Resolver.java:191)
    at java.base/java.lang.module.Resolver.bind(Resolver.java:297)
    at java.base/java.lang.module.Configuration.resolveAndBind(Configuration.java:428)
    at java.base/java.lang.module.Configuration.resolveAndBind(Configuration.java:230)

В то же время, когда я делаю:java --list-modules, вывод:

...
[email protected]
[email protected]
[email protected]
[email protected]
[email protected]
[email protected]
[email protected]
[email protected]

Как это исправить?

 VGR21 сент. 2017 г., 20:00
Есть ли причина, по которой вы не просто указалиrequires javafx.controls; в вашем модуле-info.java?
 Naman21 сент. 2017 г., 20:02
К модулям JDK можно получить доступ уже с помощьюparent слой. Как еще вы пытаетесь получить к ним доступ?
 Pavel_K21 сент. 2017 г., 20:02
@VGR Извините, не понял вас. В модуле модуля-инфо естьrequires javafx.controls.
 Alan Bateman21 сент. 2017 г., 20:14
javafx.controls модуль не должен быть в загрузочном слое. Вы можете заставить его в загрузочный слой, запустив с--add-modules javafx.controls но было бы интересно узнать больше о начальном модуле - это ваш собственный модуль запуска / контейнера, который требует только java.base? Если так, то вы можете запустить с--add-modules ALL-SYSTEM чтобы убедиться, что все системные модули находятся на уровне загрузки, поскольку неизвестно, какие приложения могут потребоваться для запуска.
 Pavel_K21 сент. 2017 г., 20:53
@ Алан Бейтман Спасибо за ваш комментарий. Хорошо.javafx.controls не должно быть в загрузочном слое. Однако он мне нужен только для этого слоя, но не для каких-либо других слоев. Как я могу добавить его динамически к этому слою? Отвечая на ваш вопрос - в загрузочном слое у меня есть лаунчер для других слоев, который нуждаетсяjava.base, java.rmi и некоторые другие, но не любыеjavafx.*.

Ответы на вопрос(1)

Решение Вопроса

javafx.controls модуль не загружен по умолчанию. Вы можете заставить его в загрузочный слой, запустив с--add-modules javafx.controls.

ПРИМЕЧАНИЕ. Начиная с Java 11 JavaFX - это отдельный проект.

Ваш ответ на вопрос