“检测到所需的基于文件名的自动模块。” 警告是什么意思?

发布于 2021-01-30 17:43:10

在我的多模块项目中,我module-info.java仅创建了几个模块。在编译过程中,maven-compiler- plugin:3.7.0我收到下一个警告:

[警告] 检测到必需的基于文件名的自动模块。请不要将此项目发布到公共工件资源库!

这是什么意思?那是因为我只有几个模块,module-info.java而不是整个项目吗?

关注者
0
被浏览
204
1 个回答
  • 面试哥
    面试哥 2021-01-30
    为面试而生,有面试问题,就找面试哥。

    自动模块回顾

    一个显式模块(即带有的模块module- info.java)只能访问其所需模块的代码(暂时忽略隐含的可读性)。如果所有依赖项都模块化,那就太好了,但是如果没有将它们模块化怎么办?如何引用非模块化的JAR?

    自动化模块就是答案:任何在模块路径上结束的JAR都将变成一个模块。如果JAR不包含模块声明,则模块系统将创建具有以下属性的自动模块:

    • 推断的名称(这是这里的重要位)
    • 读取所有其他模块
    • 导出所有包裹

    Maven依赖于该机制,一旦创建了一个机制,module-info.jar它将所有依赖项放在模块路径上。

    自动名称

    有两种方法可以推断自动模块的名称:

    • 清单中的条目
    • 从JAR文件名猜测

    在第一种情况下,名称是由维护者故意选择的,因此可以假定它是稳定的(例如,在项目模块化时,它不会更改)。第二个显然在整个生态系统中是不稳定的-
    并非所有项目设置都导致其依赖项的文件名完全相同。

    这是什么意思?

    警告的原因是您的某些依赖项是自动模块, 并且 未在清单中定义其将来的模块名称。而是,它们的名称是从文件名派生的,这使它们不稳定

    稳定的名字

    那么,为什么不稳定的名称会带来问题?假设您的库与发布,requires guava而我的框架与发布requires com.google.guava。现在有人将您的库与我的框架一起使用,突然他们在模块路径上需要模块 guava
    com.google.guava 。没有一个无痛的解决方案可以解决这个问题!

    怎么样?例如,通过阻止开发人员发布依赖于基于文件名的自动模块的工件。😉



知识点
面圈网VIP题库

面圈网VIP题库全新上线,海量真题题库资源。 90大类考试,超10万份考试真题开放下载啦

去下载看看