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