【问题标题】:Why does javac complain about named automatic-modules?为什么 javac 抱怨命名的自动模块?
【发布时间】:2017-10-14 23:51:37
【问题描述】:

如果module-info.java 引用设置了“Automatic-Module-Name”的自动模块,为什么 Java 9 编译器会警告“需要自动模块的指令”?这样的模块有什么风险?

这个问题与What is an automatic module? 并不完全相同,因为后者没有解决我所引用的编译器警告背后的具体原因(问题的上下文很重要)。也就是说,这是一个有用的后续阅读链接。

【问题讨论】:

  • 虽然不是完全重复,但恕我直言,What is an automatic module? 涵盖了这个问题的答案。只是它没有具体包括雷米的前景。
  • 顺便说一句,您可以通过使用 javac 的额外选项“-Xlint”来禁用此警告,例如“-Xlint:all,-requires-automatic”,这意味着“启用所有警告,但有关使用的警告requires 子句中的自动模块”。
  • 我认为这个问题有点误导。如果你 requires transitive 一个自动模块或者你用 -Xlint:requires-automatic 编译,javac 只会发出警告。

标签: java-9


【解决方案1】:

引用Remi Forax:

主要问题是自动模块可以看到类路径中的类,但它也会导出其所有包,因此没有封装,并且一旦您需要一个自动模块,模块路径中的所有自动模块都是可见的。

因此,当您过渡到模块世界时,自动模块是一个很好的工具,但总的来说,您不希望在依赖图中出现任何自动模块。

【讨论】:

  • 不要误会我的意思,但每次我阅读这个答案时,我都觉得这已经包含在重复的链接问题中。这里有什么区别,你能把它也放在答案中吗?
  • @nullpointer 已接受的链接问题的答案详细讨论了自动模块。如果我们将这个问题作为重复问题关闭,则不清楚 2 页答案的哪个子集解决了有问题的编译器警告。这就像在问“为什么我会收到这个 Java 编译器错误?”有人发布 Java 语言规范作为答案。当然,答案就在某处,但祝你好运:)
  • 如果您知道,它就在那里并且有一件好事需要指出,您可以建议(评论)以及编辑答案以显示信息。问另一个问题以从中放置特定列也是不合理的。
【解决方案2】:

嗯,问题是自动模块需要传递所有其他模块。所以,通过要求它,你会用很多东西污染依赖图,然后你可能会得到非常令人惊讶的行为。

想象一下: 您有一个自动模块com.logging,这是您的(显式)模块my.app 所需要的。但是,您还有另一个名为 com.dbconnectors 的自动模块(my.app 不需要,只是驻留在模块路径中)。它将被加载,因为当需要一个自动模块时,所有其他模块也将被解析。 my.app 也可以访问它,因为 com.logging 需要传递它。

然后,当您的模块 my.app 需要 com.logging 时,您的代码使用来自 com.dbconnectors 的东西“神奇地”有效,而当您从模块描述符中删除 requires com.logging 时它不会。

一般而言,应谨慎使用传递依赖关系。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-08-03
    • 2015-06-09
    • 2020-08-12
    • 2016-02-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多