Eclipse не может найти модуль, даже если путь к модулю указан явно - PullRequest
0 голосов
/ 14 ноября 2018

Я создал модуль com.company.ep, который находится в исходной папке com.company.ep (да, я удалил src из Build Path и удалил его). Внутри папки с исходным кодом у меня есть несколько пакетов:

com.company.ep    <--- root source folder
    com.company.ep.main    <--- package 1
    com.company.ep.model   <--- package 2
    com.company.ep.view    <--- package 3
    // ... more packages
    module-info.java

Основной класс находится в пакете com.company.ep.main.Main. В моем module-info.java я настроил зависимости:

module com.company.ep {
    exports com.company.ep.main;
    exports com.company.ep.model;
    exports com.company.ep.view;
    // ... more exports
    requires javafx.controls;
    requires javafx.graphics;
}

Когда я попытался запустить свою программу, Eclipse сказал мне, что:

Error occurred during initialization of boot layer
java.lang.module.FindException: Module javafx.controls not found, required by com.company.ep

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

java -p d:\Applications\openjfx-sdk-11\lib;bin -m com.company.ep/com.company.ep.main.Main

bin - это выходная папка Eclipse, а работает .

Итак, я пошел на Properties->Run/Debug Settings->Main->Show Command Line, там показывалось:

D:\Applications\openjdk-11.0.1\bin\javaw.exe -Dfile.encoding=UTF-8 -p "D:\Development\Eclipse-Workspace\MyProject\bin" -classpath "D:\Applications\openjfx-sdk-11\lib\javafx.base.jar;D:\Applications\openjfx-sdk-11\lib\javafx.controls.jar;D:\Applications\openjfx-sdk-11\lib\javafx.fxml.jar;D:\Applications\openjfx-sdk-11\lib\javafx.graphics.jar;D:\Applications\openjfx-sdk-11\lib\javafx.media.jar;D:\Applications\openjfx-sdk-11\lib\javafx.swing.jar;D:\Applications\openjfx-sdk-11\lib\javafx.web.jar;D:\Applications\openjfx-sdk-11\lib\javafx-swt.jar" -m com.company.ep/com.company.ep.main.Main

Я создал пользовательскую библиотеку со всеми добавленными JAR-файлами, и библиотека добавлена ​​в Modulepath проекта .

Затем я попытался явно указать путь к модулю в VM arguments в Run/Debug Settings: -p D:\Applications\openjfx-sdk-11\lib, но все равно не повезло.

Мои вопросы:

  • Почему javaw.exe?
  • Почему classpath? Поскольку моя библиотека добавлена ​​как запись пути модуля.
  • Как настроить зависимости модуля в Eclipse.

Я не уверен, правильно ли я настроил Eclipse, или это, вероятно, проблема OpenJDK, потому что он работал, когда я работал на другом компьютере с установленным Oracle Java SE.

Спасибо.

1 Ответ

0 голосов
/ 14 ноября 2018

Объяснение причины сбоя 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 \
    ...

eclipse module-path

Тогда с этим больше нет необходимости переопределять зависимости.

РЕДАКТИРОВАТЬ 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 

Eclipse 4.10

...