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

在我的多模块项目中,我只为几个模块创建了。在编译期间,我得到了下一个警告:module-info.javamaven-compiler-plugin:3.7.0

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

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


答案 1

自动模块回顾

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

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

  • 推断出的名字(这是这里重要的一点)
  • 读取所有其他模块
  • 导出所有包

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

自动命名

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

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

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

这是什么意思?

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

稳定名称

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

如何?例如,阻止开发人员发布依赖于基于文件名的自动模块的工件。


答案 2

推荐