Подтвердить что ты не робот

Не удалось получить дескриптор модуля для автоматически сгенерированных имен модулей в Java 9?

Мой проект зависит от транспорта Netty Epoll. Вот зависимость:

<dependency>
    <groupId>io.netty</groupId>
    <artifactId>netty-transport-native-epoll</artifactId>
    <version>${netty.version}</version>
    <classifier>${epoll.os}</classifier>
</dependency>

Автогенерируемое имя модуля для этой зависимости:

netty.transport.native.epoll

И поскольку ключевое слово native зарезервировано в Java 9, я не могу добавить этот модуль в качестве зависимости к моему проекту:

module core {
    requires netty.transport.native.epoll;
}

Из-за:

module not found: netty.transport.<error>

Дополнительно инструмент jar --describe-module сообщает следующее:

Невозможно получить дескриптор модуля для: Нетти-транспортно-нативной Epoll-4.1.17.Final-ПАНОРАМА-линукс-x86_64.jar netty.transport.native.epoll: Недопустимое имя модуля: "native" не является Идентификатор Java

Есть ли способы обхода? (за исключением, конечно, "исправления исходного нетто-артефакта" ).

ИЗМЕНИТЬ:

В качестве быстрого исправления для сопровождающих - вы можете добавить следующую строку для сборки:

<manifestEntries>
   <Automatic-Module-Name>netty.transport.epoll</Automatic-Module-Name>
</manifestEntries>
4b9b3361

Ответ 1

Ну, решение для этого похоже: -

  • переименование самого артефакта (может не понравиться всем владельцам)

    ИЛИ

  • Другим способом непрерывного использования одного и того же имени артефакта с новым (другим) именем модуля может быть упаковка META-INF/MANIFEST.MF артефакта с атрибутом Automatic-Module-Name, который определяет имя модуля, которое будет использоваться дескриптором модуля при преобразовании в качестве автоматического модуля.

    ИЛИ

  • Владелец Artifact может добавлять объявления модуля с помощью module.info.java к их JAR. (это может привести к медленной миграции снизу вверх)


Поскольку объявление модуля, определенное в спецификациях как:

В объявлении модуля вводится имя модуля, которое может использоваться в другие объявления модуля для выражения отношений между модулями. имя модуля состоит из одного или нескольких Java-идентификаторов (§3.8) разделенных от "." лексемы.


В межсекторальном режиме объявления предлагает -

В некоторых случаях имя домена Интернета не может быть действительным пакетом имя. Вот некоторые предлагаемые соглашения для решения этих проблем. ситуации:

  • Если имя домена содержит дефис или любой другой специальный символ не разрешается в идентификаторе (§3.8), преобразуйте его в символ подчеркивания.

  • Если какой-либо из полученных компонентов имени пакета - это ключевые слова (§3.9), добавьте для них подчеркивание.

  • Если какой-либо из полученных компонентов имени пакета начинается с цифры или любой другой символ, который не допускается как начальный символ идентификатор, имеют подчеркивание, префиксное для компонента.

Но имейте в виду, что вы Underscore - это ключевое слово в Java9

введите описание изображения здесь

int _;  // is would throw error on javac based out of JDK9
int _native; // works fine