我的项目取决于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>
答案 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
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 文件。