我的项目依赖于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
由于native
关键字在Java9中是保留的,所以我不能将此模块作为依赖项添加到我的项目中:
module core {
requires netty.transport.native.epoll;
}
由于:
module not found: netty.transport.<error>
此外,jar工具--describe-module
还会报告以下内容:
Java无法派生以下各项的模块描述符: netty-transport-native-epoll-4.1.17.Final-SNAPSHOT-linux-x86_64.jar本机:无效的模块名称:‘
’不是netty.transport.native.epoll标识符
有什么变通方法吗?(当然,除了“发布正确的netty工件”)。
作为维护人员的快速解决方案-您可以添加下一行来构建:
<manifestEntries>
<Automatic-Module-Name>netty.transport.epoll</Automatic-Module-Name>
</manifestEntries>
发布于 2017-09-30 18:21:23
解决这个问题的办法似乎是:
将相同的工件名称与新的(不同的)模块名称不间断地使用的一种方法是,使用属性Automatic-Module-Name打包工件的META-INF/MANIFEST.MF,该属性控制转换为自动模块时由模块描述符使用的模块的名称。
或
module-info.java
将模块声明添加到其JAR中。(这可能导致缓慢的自下而上迁移)由于module declaration在规范中定义为:
模块声明引入了可以在其他模块声明中使用的模块名称,以表达模块之间的关系。模块名称由一个或多个组成,以".“分隔。代币。
有趣的是,declarations建议-
在某些情况下,互联网域名可能不是有效的包名。以下是处理这些情况的一些建议约定:
但请记住,在这样做时,Underscore is a keyword in Java9
int _; // is would throw an error on javac based out of JDK9
int _native; // works fine
发布于 2021-05-05 16:10:20
从现在开始,您还可以使用这个小的Maven插件自动修改本地Maven存储库中的Scala jar中的清单文件:https://github.com/makingthematrix/scala-suffix
在链接下面,你会发现整个问题的概述,以及你需要添加到你的pom.xml
中的东西,但我被要求在这里解释,所以它是这样的:
如前所述,Java不会将_2.13
等模块名称中的后缀识别为版本号,并将其视为模块名称的组成部分。因此,当您的项目尝试使用Scala依赖项中的类时,它将查找your.scala.dependency.2.13
,而不仅仅是your.scala.dependency,它将无法做到这一点,并且会崩溃。
要在您的一侧修复此问题(即不需要库创建者的任何操作),请将此代码添加到pom.xml
的<plugins>
部分
<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>
标记)。这应该与<dependency>
部分中的artifactId
相同。
该插件修改本地Maven存储库中的依赖项的JAR文件。它打开jar,读取META-INF/MANIFEST.MF
并添加一行:
Automatic-Module-Name: your-scala-dependency
如果属性Automatic-Module-Name
已经存在,插件什么也不做--我们假设在这种情况下,依赖项应该已经起作用了。这可以防止插件多次修改相同的JAR文件。
https://stackoverflow.com/questions/46501388
复制相似问题