23

我的项目依赖于 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

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

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

由于:

module not found: netty.transport.<error>

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

无法为以下各项派生模块描述符:netty-transport-native-epoll-4.1.17.Final-SNAPSHOT-linux-x86‌_64.jar netty.transport.native.epoll:无效的模块名称:'native' 不是 Java 标识符

有什么解决方法吗?(当然,“发布正确的网络工件”除外)。

编辑

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

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

2 回答 2

11

对此的解决方案似乎是: -

  • 一种可能不间断地使用具有新(不同)模块名称的相同工件名称的方法是通过使用属性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 an error on javac based out of JDK9
int _native; // works fine
于 2017-09-30T10:21:23.237 回答
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>

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

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

Automatic-Module-Name: your-scala-dependency

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

于 2021-05-05T08:10:20.280 回答