无法在Java 9中为自动生成的模块名称派生模块描述符?

Dmi*_*kiy 19 java netty java-9 java-module module-info

我的项目依赖于Netty Epoll传输.这是依赖:

<dependency>
    <groupId>io.netty</groupId>
    <artifactId>netty-transport-native-epoll</artifactId>
    <version>${netty.version}</version>
    <classifier>${epoll.os}</classifier>
</dependency>
Run Code Online (Sandbox Code Playgroud)

此依赖项的自动生成的模块名称为:

netty.transport.native.epoll
Run Code Online (Sandbox Code Playgroud)

由于native关键字是在Java 9中保留的,我无法将此模块作为依赖项添加到我的项目中:

module core {
    requires netty.transport.native.epoll;
}
Run Code Online (Sandbox Code Playgroud)

由于:

module not found: netty.transport.<error>
Run Code Online (Sandbox Code Playgroud)

此外,jar工具--describe-module报告以下内容:

无法导出模块描述符:网状输送本地-epoll的-4.1.17.Final-快照Linux的x86_64.jar netty.transport.native.epoll:无效的模块名称:"天然"是不是Java标识符

有没有解决方法?(当然,除了"发布正确的网络工件").

编辑:

作为维护者的快速修复 - 您可以添加下一行来构建:

<manifestEntries>
   <Automatic-Module-Name>netty.transport.epoll</Automatic-Module-Name>
</manifestEntries>
Run Code Online (Sandbox Code Playgroud)

Nam*_*man 10

那么,解决方案似乎是: -

  • 重命名工件本身(可能不是所有业主首选)

    要么

  • 另一种可能的不间断地使用相同的工件名称与新的(不同的)模块名的方式可以是由包装META-INF/MANIFEST.MF与属性的工件自动-模块-名称支配的模块的名称被使用由模块描述符转换为自动模块时.

    要么

  • 工件所有者可以将模块声明添加module.info.java到其JAR中.(这可能导致自下而上的缓慢迁移)


由于规范中规定的模块声明为:

模块声明引入了一个模块名称,可以在其他模块声明中使用它来表示模块之间的关系.模块名称由一个或多个由"."分隔的Java标识符(§3.8)组成.令牌.


声明中的相反声明表明 -

在某些情况下,Internet域名可能不是有效的包名称.以下是处理这些情况的一些建议惯例:

  • 如果域名包含连字符或标识符(第3.8节)中不允许的任何其他特殊字符,请将其转换为下划线.

  • 如果任何生成的包名称组件是关键字(第3.9节),请在它们后面附加下划线.

  • 如果任何生成的包名称组件以数字或任何其他不允许作为标识符的初始字符的字符开头,则在组件前面加上下划线.

但请记住,Underscore是Java9中的关键字

在此输入图像描述

int _;  // is would throw an error on javac based out of JDK9
int _native; // works fine
Run Code Online (Sandbox Code Playgroud)

  • 谢啦.在netty构建期间添加了`<Automatic-Module-Name> netty.transport.epoll </ Automatic-Module-Name>`并且它可以工作. (4认同)