33

In my multi-module project, I created module-info.java only for few modules. And during compilation with maven-compiler-plugin:3.7.0 I'm getting next warning:

[WARNING] * Required filename-based automodules detected. Please don't publish this project to a public artifact repository! *

What does it mean? Is that because I have only a few modules with module-info.java and not the whole project?

4

3 回答 3

34

自动模块回顾

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

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

  • 推断名称(这是这里的重要部分)
  • 读取所有其他模块
  • 导出所有包

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

自动命名

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

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

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

这是什么意思?

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

稳定的名称

那么为什么不稳定的名称会成为这样的问题呢?假设你的库是用 发布的,requires guava而我的框架是用requires com.google.guava. 现在有人在我的框架中使用你的库,突然他们需要模块路径上的模块guavacom.google.guava 。该问题没有无痛的解决方案,因此需要预防!

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

于 2017-09-30T15:55:04.087 回答
4

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

那是因为我只有几个带有 module-info.java 的模块而不是整个项目吗?

不,这不是因为列出的几个模块,module-info.java而是由模块图中的maven-compiler-plugin所有自动模块生成的。


这是什么意思?

可能坚持不发布当前项目,因为预计自动模块将由其所有者转换为命名或显式模块,然后发布到存储库,这也可能导致其模块名称发生更改。另外需要注意的一点是,根据 Maven ~> Java+9+-+Jigsaw的进度文档,它们还没有完全准备好与 JDK9 兼容的插件版本。


只是为了描绘这样一个用例的例子。考虑这些行 -

  • 我已经发布了一个工件com-foo-bar:1.0.0-SNAPSHOT:jar
  • 我的另一个项目com-xyz:1.0.0依赖于它。
  • 最终你的一个项目依赖于com-foo-bar传递通过com-xyz
  • 您计划模块化您的代码并使用类似的东西

    module your.module {
        requires com.foo.bar;
        requires com.xyz;
    }
    

    (需要在模块声明中单独指定传递依赖)

  • 一切都很好,但直到我决定模块化我的库。
  • 现在,我做的第一件事就是命名我的模块
  • 我做了一些很棒的事情来明确地呼吁我这样的努力:-

    module modular.com.foo.bar {}
    
  • 我最终会破坏任何依赖库的代码,最终以模块化方式破坏任何依赖于你的代码。

注意:我同意不在生产环境中练习使用 SNAPSHOT,但在某些情况下,最终您可能会依赖仍处于开发阶段的工件。


编辑:来自@khmarbaise 的评论

据了解,人们希望发布到神器,但如果他们不知道后果,您将来会被此打败。

Maven 想明确指出,在这种情况下,警告是非常严重的,这可能是一个失败,但这将是一个糟糕的用户体验。

处理这个问题的理想方法是库所有者计划将他们的工件迁移到 JDK9,并且自下而上遍历树,在这种情况下,命名/显式模块将是唯一流行的方面,而不需要自动模块名称和这样的警告。

于 2017-09-30T09:04:08.690 回答
0

maven-compiler-plugin v3.7.0它是一个信息性消息。不知道为什么您将其视为警告...

这是我使用以下代码构建基于 Java 10 的项目时得到的结果module-info.java

[INFO] Required filename-based automodules detected. Please don't publish this project to a public artifact repository!
于 2018-04-19T05:59:21.953 回答