web-dev-qa-db-fra.com

Impossible de dériver le descripteur de module pour les noms de module générés automatiquement dans Java 9?

Mon projet dépend du transport de Netty Epoll. Voici la dépendance:

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

Le nom du module généré automatiquement pour cette dépendance est:

netty.transport.native.epoll

Et comme le mot clé native est réservé dans Java 9 Je ne peux pas ajouter ce module comme dépendance à mon projet:

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

En raison de:

module not found: netty.transport.<error>

De plus, l'outil jar --describe-module signale ce qui suit:

Impossible de dériver le descripteur de module pour: netty-transport-native-epoll-4.1.17.Final-SNAPSHOT-linux-x86‌_64.jar netty.transport.native.epoll: nom de module non valide: 'native' n'est pas un Java

Existe-t-il des solutions de contournement? (sauf "libérer l'artefact netty correct", bien sûr).

MODIFIER :

Comme solution rapide pour les responsables - vous pouvez ajouter la ligne suivante à construire:

<manifestEntries>
   <Automatic-Module-Name>netty.transport.epoll</Automatic-Module-Name>
</manifestEntries>
19
Dmitriy Dumanskiy

Eh bien, la solution à cela semble être: -

  • renommer l'artefact lui-même (pourrait ne pas être préféré par tous les propriétaires)

    [~ # ~] ou [~ # ~]

  • Une autre façon possible d'utiliser sans interruption le même nom d'artefact avec un nouveau nom de module (différent) pourrait être en empaquetant META-INF/MANIFEST.MF de l'artefact avec un attribut Automatic-Module-Name qui régit le nom du module à utiliser par le descripteur de module lorsque converti en module automatique.

    [~ # ~] ou [~ # ~]

  • Le propriétaire de l'artefact peut ajouter des déclarations de module à l'aide de module.info.Java à leur JAR. (cela pourrait entraîner une migration ascendante lente)


Puisque la déclaration de module définie dans les spécifications comme:

Une déclaration de module introduit un nom de module qui peut être utilisé dans d'autres déclarations de module pour exprimer les relations entre les modules. Un nom de module se compose d'un ou plusieurs identificateurs Java (§3.8) séparés par "." jetons.


De façon entrecoupée, les déclarations suggèrent -

Dans certains cas, le nom de domaine Internet peut ne pas être un nom de package valide. Voici quelques conventions suggérées pour faire face à ces situations:

  • Si le nom de domaine contient un trait d'union ou tout autre caractère spécial non autorisé dans un identifiant (§3.8), convertissez-le en trait de soulignement.

  • Si l'un des composants de nom de package résultants sont des mots clés (§3.9), ajoutez-y un trait de soulignement.

  • Si l'un des composants de nom de package résultant commence par un chiffre ou tout autre caractère non autorisé comme caractère initial d'un identificateur, un trait de soulignement est préfixé au composant.

Mais gardez à l'esprit que vous faites ainsi que nderscore est un mot clé en Java9

enter image description here

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