首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >无法为Java 9中自动生成的模块名称派生模块描述符?

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

Stack Overflow用户
提问于 2017-09-30 17:17:38
回答 2查看 13.2K关注 0票数 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

由于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>
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2017-09-30 18:21:23

解决这个问题的办法似乎是:

将相同的工件名称与新的(不同的)模块名称不间断地使用的一种方法是,使用属性Automatic-Module-Name打包工件的META-INF/MANIFEST.MF,该属性控制转换为自动模块时由模块描述符使用的模块的名称。

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

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

模块声明引入了可以在其他模块声明中使用的模块名称,以表达模块之间的关系。模块名称由一个或多个组成,以".“分隔。代币。

有趣的是,declarations建议-

在某些情况下,互联网域名可能不是有效的包名。以下是处理这些情况的一些建议约定:

  • 如果域名包含连字符或标识符中不允许的任何其他特殊字符(§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
票数 11
EN

Stack Overflow用户

发布于 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文件。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/46501388

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档