Объяснение причины сбоя Eclipse при запуске вашего модульного проекта можно найти в документации OpenJFX для Eclipse (модульная из раздела IDE).
Как уже упоминалось:
Будучи модульным проектом, и так как мы уже добавили библиотеку JavaFX SDK в путь к модулю, нет необходимости добавлять какие-либо аргументы VM.
Но если вы запуститев Eclipse вы получите указанную ошибку:
Произошла ошибка при инициализации загрузочного слоя java.lang.module.FindException: модуль javafx.graphics не найден, требуется hellofx
Так почему же происходит сбой ??
Как объяснено в документации:
Это исключение происходит, потому что задача муравья Eclipse переопределяет путь к модулю
Как это происходит ??
Проверяя примененную командную строку (Show Command Line
из Run Configurations ...), вы можете узнать, почему:
$JAVA_HOME/bin/java -Dfile.encoding=UTF-8 \
-p bin/hellofx \
-classpath $PATH_TO_FX \
-m hellofx/org.openjfx.MainApp
Если вы скопируете его, вставите и запустите втерминал, он, конечно, не с тем же сообщением.Причина в том, что Eclipse не добавляет библиотеку JavaFX в путь к модулю.
Если задача генерирует неправильные аргументы, давайте попробуем исправить это, добавив собственные аргументы виртуальной машины, отредактировав параметры запуска ... идобавив -p $PATH_TO_FX:bin/hellofx
.
Но если вы запустите его, он снова потерпит неудачу.
Давайте проверим почему, с Show Command Line
из Run Configurations ...
$JAVA_HOME/bin/java -Dfile.encoding=UTF-8 \
-p $PATH_TO_FX:bin/hellofx \
-p bin/hellofx \
-classpath $PATH_TO_FX \
-m hellofx/org.openjfx.MainApp
Как вы можете видеть, аргументы виртуальной машины пользователя добавляются перед аргументами задачи муравья по умолчанию, поэтому есть две опции -p
(--module-path
), а первая (пользовательская с jar-файлами JavaFX) переопределяетсявторой (только модуль проекта), поэтому, опять же, jar-файлы JavaFX не добавляются в путь к модулю, и, следовательно, вы получаете ошибку.
Так как мы можем это исправить ??
Как упомянуто в связанной документации, возможное исправление:
Чтобы избежать этой проблемы, нажмите Выполнить -> Выполнить конфигурации ... -> Приложение Java -> Зависимости, выберите Переопределить зависимости.. и добавьте -p /path-to/javafx-sdk-11/lib:bin/hellofx
и нажмите Переопределить.
С помощью этого решения вы можете увидеть, как оно работает, и вы можете проверить командную строку:
$JAVA_HOME/bin/java -Dfile.encoding=UTF-8 \
-p $PATH_TO_FX:bin/hellofx \
-p bin/hellofx \
-classpath $PATH_TO_FX \
-p /path-to/javafx-sdk-11/lib:bin/hellofx \
-m hellofx/org.openjfx.MainApp
В основном мыдобавив снова «правильный» путь модуля, после всех неудачных.
Пока проект запущен, решение, очевидно, не очень хорошее.
Здесь вы можете найти образец, указанный в документации OpenJFX.
EDIT
Основываясь на комментариях @kleopatra, можно обойти еще один обходной путь:
По какой-то причине библиотека JavaFX11 (которая содержит модульные файлы jar) не сканируется иEclipse не включает эти jar-файлы в свою опцию -p
, но в classpath:
$JAVA_HOME/bin/java -Dfile.encoding=UTF-8 \
-p bin/hellofx \
-classpath $PATH_TO_FX \
...
Но, если вы добавите эти jar-файлы непосредственно в путь к модулю, это сделаетдобавьте их, и это будет работать нормально:
$JAVA_HOME/bin/java -Dfile.encoding=UTF-8 \
-p bin/hellofx:$PATH_TO_FX/javafx.base.jar:...:$PATH_TO_FX/javafx.controls \
...
Тогда с этим больше нет необходимости переопределять зависимости.
РЕДАКТИРОВАТЬ 2
Как указывает @mipa в комментарии, по этому вопросу подана ошибка , и она уже была устранена.Я протестировал его с Eclipse 2018-12 M2 (4.10.0M2) ID сборки: 20181108-1653, и он работает только с библиотекой JavaFX11
(как и должно быть):
$JAVA_HOME/bin/java -Dfile.encoding=UTF-8 \
-p bin/hellofx:$PATH_TO_FX/javafx.base.jar:... \
-m hellofx/org.openjfx.MainApp