“检测到所需的基于文件名的自动模块。” 警告是什么意思?
在我的多模块项目中,我module-info.java
仅创建了几个模块。在编译过程中,maven-compiler-
plugin:3.7.0
我收到下一个警告:
[警告] 检测到必需的基于文件名的自动模块。请不要将此项目发布到公共工件资源库!
这是什么意思?那是因为我只有几个模块,module-info.java
而不是整个项目吗?
-
自动模块回顾
一个显式模块(即带有的模块
module- info.java
)只能访问其所需模块的代码(暂时忽略隐含的可读性)。如果所有依赖项都模块化,那就太好了,但是如果没有将它们模块化怎么办?如何引用非模块化的JAR?自动化模块就是答案:任何在模块路径上结束的JAR都将变成一个模块。如果JAR不包含模块声明,则模块系统将创建具有以下属性的自动模块:
- 推断的名称(这是这里的重要位)
- 读取所有其他模块
- 导出所有包裹
Maven依赖于该机制,一旦创建了一个机制,
module-info.jar
它将所有依赖项放在模块路径上。自动名称
有两种方法可以推断自动模块的名称:
- 清单中的条目
- 从JAR文件名猜测
在第一种情况下,名称是由维护者故意选择的,因此可以假定它是稳定的(例如,在项目模块化时,它不会更改)。第二个显然在整个生态系统中是不稳定的-
并非所有项目设置都导致其依赖项的文件名完全相同。这是什么意思?
警告的原因是您的某些依赖项是自动模块, 并且 未在清单中定义其将来的模块名称。而是,它们的名称是从文件名派生的,这使它们不稳定
稳定的名字
那么,为什么不稳定的名称会带来问题?假设您的库与发布,
requires guava
而我的框架与发布requires com.google.guava
。现在有人将您的库与我的框架一起使用,突然他们在模块路径上需要模块 guava 和
com.google.guava 。没有一个无痛的解决方案可以解决这个问题!怎么样?例如,通过阻止开发人员发布依赖于基于文件名的自动模块的工件。😉