Безымянные модули не могут быть прочитаны
У меня действительно неприятная проблема, которую я не понимаю...
У нас есть полный набор утилит-библиотек, написанных с использованием jdk8, и мы не имеем отношения к Jigsaw, поэтому мы также не установили Automatic-Module-Name в файле META-INF.
Теперь нам нужно перенести продукт на java11, который использует эти библиотеки утилит.
- Я создал module-info.java и ввел все необходимые модули, но есть некоторые проблемы с утилитами-библиотеками.
- Некоторые из утилитных библиотек загружаются как неназванные модули, и их можно добавлять как необходимые модули. Но для некоторых других этих утилитарных библиотек их невозможно добавить, потому что они не получают имя модуля на основе своего jar-файла.
Из моей IDE я получаю следующую ошибку:
Пакет 'x' объявлен в неназванном модуле, но модуль 'y' не читает его.
Пакет x находится в одной из наших утилит-библиотек, а модуль y - это продукт, который должен быть перенесен в java11.
Есть идеи, чтобы я мог понять эту проблему?
С уважением
0 ответов
Решением этой конкретной проблемы стала моя IDE. IntelliJ не поддерживает чтение "безымянных модулей" или "автоматических модулей" из импортированных "проектов" в среде IDE. Я уже начал сообщать об ошибках в jetbrains.
Я использую AdoptOpenJDK jdk-11.0.3.7-hotspot и получаю следующее сообщение об исключении во время выполнения
class A (in module A) cannot access class B (in unnamed module @0x12345678) because module A does not read unnamed module @0x12345678
и решил это с помощью аргумента --add-reads vm
--add-reads iamdsim.heat.adapter=ALL-UNNAMED
Я где-то читал, что по умолчанию безымянный модуль "читают" только автоматические модули. Но я не смог найти его в пакете java.lang.module.
Изменить: это задокументировано в Состояние модульной системы
jar-файлы с именами, для которых невозможно получить автоматическое имя модуля, всегда являются проблемой. Это происходит с числами или зарезервированными словами, такими как "интерфейс" в имени (например, "db-interface-1.0.0.jar").