在我的多模块项目中,我只为几个模块创建了 module-info.java
。在使用 maven-compiler-plugin:3.7.0
编译期间,我收到下一个警告:
[WARNING] * Required filename-based automodules detected. Please don't publish this project to a public artifact repository! *
这是什么意思?那是因为我只有几个模块带有 module-info.java
而不是整个项目吗?
最佳答案
自动模块回顾
显式模块(即带有 module-info.java
的模块)只能访问它需要的模块代码(暂时忽略 implied readability)。如果所有依赖项都模块化了,那就太好了,但如果不是呢?如何引用非模块化的 JAR?
Automatic modules答案是:任何在模块路径上结束的 JAR 都会变成一个模块。如果 JAR 不包含模块声明,模块系统会创建一个具有以下属性的自动模块:
- 推断名称(这是这里的重要部分)
- 阅读所有其他模块
- 导出所有包
Maven 依赖于该机制,一旦您创建了 module-info.jar
,它会将所有依赖项放置在模块路径上。
自动命名
有两种方法可以推断出自动模块的名称:
- list 中的条目
- 根据JAR文件名猜测
在第一种情况下,名称是维护者故意选择的,因此可以假定它是稳定的(例如,当项目模块化时它不会改变)。第二个显然在整个生态系统中不稳定 - 并非所有项目设置都会导致其依赖项的文件名完全相同。
What does it mean?
警告的原因是您的一些依赖项是自动模块并且没有在 list 中定义它们 future 的模块名称。相反,它们的名称源自文件名,这使得它们不稳定。
稳定名称
那么为什么不稳定的名字会成为这样的问题呢?假设您的库使用 requires guava
发布,而我的框架使用 requires com.google.guava
发布。现在有人将你的库与我的框架一起使用,突然他们需要模块路径上的模块 guava 和 com.google.guava。这个问题没有无痛的解决方案,因此需要预防!
如何?例如,通过阻止开发人员发布依赖于基于文件名的自动模块的 Artifact 。 😉
关于java - "Required filename-based automodules detected."警告是什么意思?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46501047/