java - "Required filename-based automodules detected."警告是什么意思?

标签 java maven java-9 java-platform-module-system maven-compiler-plugin

在我的多模块项目中,我只为几个模块创建了 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 发布。现在有人将你的库与我的框架一起使用,突然他们需要模块路径上的模块 guavacom.google.guava。这个问题没有无痛的解决方案,因此需要预防!

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

关于java - "Required filename-based automodules detected."警告是什么意思?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46501047/

相关文章:

java - 在接口(interface)中返回等于无的东西

java - Maven 正在尝试从不同目标的中心下载父 pom

git - 如何正确使用mvn release :prepare?

lombok - Project Lombok 是否支持 Java 9?

java - 是否可以在使用 Java 9 的 Eclipse IDE 中使用没有类和主要方法的 sysout?

java - 从 Java 9 到 Java 8 的兼容性和迁移

java - Java7中方法句柄的用途是什么?

带有 BufferedWriter 和二进制数据的 Java ssl

java - 应用程序名称或小程序名称?

java - 无法执行目标...maven-install-plugin ...无法安装 Artifact ...(拒绝访问)