无法在Java 9中为自动生成的模块名称派生模块描述符?
我的项目依赖于Netty Epoll传输。 这是依赖:
io.netty netty-transport-native-epoll ${netty.version} ${epoll.os}
此依赖项的自动生成的模块名称为:
netty.transport.native.epoll
由于native
9中保留了native
关键字,因此无法将此模块作为依赖项添加到我的项目中:
module core { requires netty.transport.native.epoll; }
由于:
module not found: netty.transport.
此外,jar工具--describe-module
报告以下内容:
无法导出模块描述符:netty-transport-native-epoll-4.1.17.Final-SNAPSHOT-linux-x86_64.jar netty.transport.native.epoll:无效的模块名称:’native’不是Java标识符
有没有解决方法? (当然,除了“发布正确的网络工件”)。
编辑 :
作为维护者的快速修复 – 您可以添加下一行来构建:
netty.transport.epoll
那么解决方案似乎是: –
-
重命名工件本身(可能不是所有业主首选)要么
-
另一种可以不间断地使用具有新(不同)模块名称的相同工件名称的方法可以是通过使用属性Automatic-Module-Name打包工件的META-INF / MANIFEST.MF来控制要使用的模块的名称。由模块描述符转换为自动模块时。
要么
-
工件所有者可以使用
module.info.java
将模块声明添加到其JAR中。 (这可能导致自下而上的缓慢迁移)
由于模块声明在规范中定义为:
模块声明引入了一个模块名称,可以在其他模块声明中使用它来表示模块之间的关系。 模块名称由一个或多个由“。”分隔的Java标识符(第3.8节)组成 。 令牌。
声明中的相反声明表明 –
在某些情况下,Internet域名可能不是有效的包名称。 以下是处理这些情况的一些建议惯例:
如果域名包含连字符或标识符(第3.8节)中不允许的任何其他特殊字符,请将其转换为下划线。
如果任何生成的包名称组件是关键字(第3.9节),请在它们后面附加下划线。
如果任何生成的包名称组件以数字或任何其他不允许作为标识符的初始字符的字符开头,则在组件前面加上下划线。
但请记住,Underscore是Java9中的关键字
int _; // is would throw error on javac based out of JDK9 int _native; // works fine