2017-09-30 1 views
17

Mein Projekt hängt von Netty Epoll Transport ab. Hier ist die Abhängigkeit:Kann Moduldeskriptor für automatisch generierte Modulnamen in Java 9 nicht abgeleitet werden?

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

Die automatisch generierten Modulnamen für diese Abhängigkeit ist:

netty.transport.native.epoll 

Und wie das native Schlüsselwort in Java 9 reserviert Ich kann dieses Modul nicht als Abhängigkeit hinzufügen mein Projekt:

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

Aufgrund:

module not found: netty.transport.<error> 

Zusätzlich wird die JAR-Tool --describe-module berichtet folgendes: netty-Transport-native-epoll-4.1.17.Final-snapshot-linux-x86_64.jar netty:

Unable Modulbeschreibers für abzuleiten. transport.native.epoll: Ungültige Modulname: 'native' ist kein Java Kennung

gibt es Workarounds? (außer "release korrekt netty artifact", natürlich).

EDIT:

Als schnelle Lösung für Maintainer - Sie nächste Zeile hinzufügen können, bauen:

<manifestEntries> 
    <Automatic-Module-Name>netty.transport.epoll</Automatic-Module-Name> 
</manifestEntries> 
+0

Haben Sie den 'jar versuchen --file = --describe-module', um herauszufinden, sein automatischer Modulname? Wurde das auch von jar tool vorgeschlagen? – nullpointer

+0

'Der Moduldeskriptor kann nicht abgeleitet werden für: netty-transport-native-epoll-4.1.17.Final-SNAPSHOT-linux-x86_64.jar netty.transport.native.epoll: Ungültiger Modulname: 'native' ist kein Java Identifier' –

+1

Ya Ich erinnere mich an eine Diskussion über die Mailing-Liste Ich habe über die Schlüsselwörter Einschränkung in Modulnamen Syntax gelesen. – nullpointer

Antwort

9

Nun, die Lösung dieses Problems zu sein scheint: -

  • Umbenennung th e Artefakt selbst (möglicherweise nicht von allen Eigentümern bevorzugt werden)

    ODER

  • Ein anderen Weg möglich ohne Unterbrechung der gleichen Artefakt Namen mit einem neuen (anderen) Modulnamen von Verpackung könnte mit META-INF/MANIFEST.MF des Artefakts mit einem Attribut Automatic-Modul-Name, der den Namen des Moduls steuert, das vom Moduldeskriptor verwendet wird, wenn es als automatisches Modul konvertiert wird.

    ODER

  • Artifact Eigentümer kann Modul Erklärungen mit module.info.java ihrer JAR hinzufügen.(Dies in einer langsamen Bottom-up-Migration führen könnte)


Da die module declaration in den Spezifikationen definiert als:

eine Modul Erklärung stellt einen Modulnamen, die in verwendet werden können, andere Moduldeklarationen, um Beziehungen zwischen Modulen auszudrücken. Ein Modulname besteht aus einem oder mehreren Java identifiers (§3.8) getrennten von "." Token.


Intersetingly die declarations schon sagt -

In einigen Fällen kann die Internet-Domain-Namen kein gültiges Paket Name sein kann. Hier einige Vorschläge Konventionen für den Umgang mit diesen Situationen :

  • Wenn der Domain-Name einen Bindestrich enthält, oder andere Sonderzeichen nicht in einer Kennung (§3.8) erlaubt, wandelt es in einen Unterstrich.

  • Wenn eine der resultierenden Paketnamen-Komponenten Schlüsselwörter (§3.9) sind, fügen Sie an sie einen Unterstrich an.

  • Wenn eine der daraus resultierenden Paketnamen Komponenten mit einer Ziffer beginnen, oder jedes andere Zeichen, die nicht als ein Anfangszeichen eines Identifikator erlaubt ist, haben einen Unterstrich auf die Komponente vorangestellt.

Aber denken Sie daran, wie Sie so tun, dass Underscore is a keyword in Java9

enter image description here

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

Danke Mann. 'Nety.transport.epoll 'während nety build hinzugefügt und funktioniert. –

Verwandte Themen