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

时间:2017-09-30 09:17:38

标签: 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>

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

netty.transport.native.epoll

由于{9}中保留了native关键字,我无法将此模块添加为项目的依赖项:

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

由于:

module not found: netty.transport.<error>

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

  

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

有任何变通方法吗? (除了&#34;发布正确的netty工件&#34;当然)。

EDIT

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

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

2 个答案:

答案 0 :(得分:9)

嗯,解决方法似乎是: -

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

  • 另一种可以通过打包 META-INF / MANIFEST.MF 来不间断地使用具有新(不同)模块名称的相同工件名称的方法具有属性自动模块名称的工件,它控制模块描述符在转换为自动模块时要使用的模块的名称。

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

由于规范中定义的module declaration为:

  

模块声明引入了可以使用的模块名称   其他模块声明来表达模块之间的关系。 甲   模块名称由一个或多个Java identifiers (§3.8)分隔而成   通过“。”令牌。

临时declarations建议 -

  

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

     
      
  • 如果域名包含连字符或任何其他特殊字符   不允许使用标识符(§3.8),将其转换为下划线。

  •   
  • 如果任何生成的包名称组件是关键字(§3.9),   在他们附加一个下划线。

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

  •   

但请记住,Underscore is a keyword in Java9

enter image description here

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

答案 1 :(得分:1)

从现在开始,您还可以使用这个小型 Maven 插件来自动修改本地 Maven 存储库中 Scala jar 中的清单文件:https://github.com/makingthematrix/scala-suffix

在链接下,您会找到整个问题的概述以及您需要添加的内容pom.xml,但我也被要求在此处进行解释,所以在这里:

正如已经提到的,Java 不会将模块名称中的后缀(如 _2.13)识别为版本号,并将它们视为模块名称的组成部分。因此,当您的项目尝试使用 Scala 依赖项中的类时,它会查找 your.scala.dependency.2.13 而不仅仅是 your.scala.dependency,它会失败,并且会崩溃。

要在您这边解决此问题(即无需图书馆创建者的任何操作),请将其添加到您的 <plugins>pom.xml 部分:

<plugin>
  <groupId>io.github.makingthematrix</groupId>
  <artifactId>scala-suffix-maven-plugin</artifactId>
  <version>0.1.0</version>
  <configuration>
    <libraries>
      <param>your-scala-dependency</param>
    </libraries>
  </configuration>
  <executions>
    <execution>
      <goals>
        <goal>suffix</goal>
      </goals>
    </execution>
  </executions>
</plugin>

其中 your-scala-dependency 是不带版本后缀的 Scala 依赖项的名称(如果有多个,只需添加更多 <param> 标签)。这应该与 artifactId 部分中的 <dependency> 相同。

该插件会在您的本地 Maven 存储库中修改依赖项的 JAR 文件。它打开 jar,读取 META-INF/MANIFEST.MF 并添加一行:

Automatic-Module-Name: your-scala-dependency

如果属性 Automatic-Module-Name 已经存在,插件什么都不做——我们假设在这种情况下依赖应该已经工作了。这可以防止插件多次修改同一个 JAR 文件。