Eclipse не может запустить java-проект с предупреждением о модуле

#java #eclipse #module #swt

#java #eclipse #модуль #swt

Вопрос:

Я запускаю eclipse 4.16 с OpenJDK-14. У меня есть простой Java-проект, в котором есть папка lib с swt.jar в нем. Он был добавлен в modulepath в диалоговом окне Свойства проекта > Путь сборки Java > Библиотеки. Когда я импортирую и использую swt-класс в своем классе, мне предлагается добавить запись в мой файл module-info. Он добавляет «swt» с предупреждением:

 Name of automatic module 'swt' is unstable, it is derived from the module's file name.
  

Когда я пытаюсь запустить проект как java-приложение, я получаю эту ошибку в консоли, и ничего не запускается:

 Error occurred during initialization of boot layer
java.lang.module.FindException: Module swt not found, required by ca.footeware.swt.converter
  

Если я экспортирую проект как исполняемый файл jar с вложенными зависимостями, он работает с аналогичным предупреждением. Экспортированный jar действительно запускается (но это не удобный цикл разработки 🙂

Я где-то читал, что для немодульных jars можно использовать заголовок MANIFEST.MF, Automatic-Module-Name. Я приоткрыл дверь swt.jar и добавил заголовок со значением org.eclipse.swt, корневой пакет jar. Я удалил Requires swt; из моего module-info.java и снова было предложено добавить запись из моего класса с помощью импорта swt. На этот раз, однако, он ввел Requires org.eclipse.swt; и никакого предупреждения выдано не было. Однако, когда я попытался запустить проект, я получил ту же ошибку:

 Error occurred during initialization of boot layer
java.lang.module.FindException: Module org.eclipse.swt not found, required by ca.footeware.swt.converter
  

Комментарии:

1. «jar с вложенными зависимостями» не работает с использованием modulepath, поскольку каждый модуль должен находиться в отдельном JAR (это ограничение Java, а не Eclipse). Предупреждение о нестабильном имени модуля можно игнорировать (это просто предупреждение), но указывает на то, что вы используете устаревшую версию библиотеки SWT (есть в более новых версиях Automatic-Module-Name ). Самым простым решением было бы удалить ваш module-info.java . В противном случае покажите командную строку (в конфигурации запуска есть кнопка Показать командную строку ) и ваш module-info.java .

2. Значит, больше нет fat jars? Это отстой.

3. Fat JARS только тогда, когда не используется modulepath (разные module-info.class файлы модулей перезаписывают друг друга в JAR, поскольку они находятся в пакете по умолчанию, что означает, что в корневой папке внутри JAR).

4. Спасибо @howlger. Моя командная строка: /usr/lib/jvm /java-14-openjdk-amd64/bin/java —module-path /home/craig/Downloads/swt.jar ;/home/craig/workspace/ca.footeware.converter -Dfile.encoding=UTF-8 -p /home/craig/workspace/ca.footeware.converter/modules:/home/craig/Downloads/swt.jar —limit-modules java.desktop -m ca.footeware.converter / ca.footeware.converter. Конвертер и мой модуль-информация о модуле ca.footeware.converter { экспортирует ca.footeware.converter.spi; требуется swt; }

5. Эта командная строка для меня не имеет смысла: оба, --module-path и -p ; ` —limit-modules java.desktop`. Пожалуйста, покажите в вашей конфигурации запуска вкладки Аргументы и зависимости , а также Проект> Свойства: Путь сборки Java вкладки Библиотеки и зависимости модуля .

Ответ №1:

У меня получилось! Аргументы виртуальной машины моей конфигурации запуска теперь:

 --module-path ca.footeware.converter:ca.footeware.converter.temperature:/home/craig/Downloads/swt.jar -m ca.footeware.converter/ca.footeware.converter.Converter
  

Я на Linux, и разделитель —module-path должен быть:, а не;.

Обратите внимание, что я установил для рабочего каталога конфигурации запуска значение $ {workspace_loc} вместо значения по умолчанию $ {workspace_loc: ca.footeware.converter}, чтобы я мог получить доступ к обоим проектам модуля по простому имени, а не по полному имени, например /home / craig / workspace /ca.footeware.converter.temperature.

Комментарии:

1. По-прежнему используются аргументы виртуальной машины — не используется вкладка Зависимости Run Config.