如何正确地抑制“需要自动模块的传递指令”警告?

将Maven项目升级到Java 9并添加模块描述符后, javac抱怨自动模块传递依赖:

[警告] /…/scrc/main/java/module-info.java:[3,35] requires transitive指令用于自动模块

重现问题的示例module-info.java

 module com.example.mymodule { exports com.example.mymodule.myexportedpackage; requires transitive com.google.common; } 

这个警告的含义是完全清楚的,这里有一些相关的链接:

  • 需求和需要Java 9中的传递语句有什么区别?
  • 为什么javac抱怨命名的自动模块?
  • 相关的OpenJDK问题

问题是 – 如何在不修复实际问题的情况下抑制此警告 ,并且不禁用所有其他javac警告?

我尝试了以下选项,但没有一个工作:

  • @SuppressWarnings("module")
  • @SuppressWarnings("all")
  • -Xlint:all,-module命令行选项

不幸的是,我无法解决实际问题(现在),因为“my”模块具有来自第三方(自动)模块(例如Guava)的返回类型和注释。 因此,如果我使用“require com.google.common”(不具有transitive ),则会出现不同的警告,例如:

[警告] … / MyClass.java:[25,20]类com.google.common.collect.Table 。模块com.google.common中的表没有使用requires transitive间接导出

当然,我无法为第三方库(现在是自动模块)定义模块描述符。

我正在使用-Werror ,我宁愿保留,所以警告不仅仅是烦人的……


PS我不打算将我的工件发布到任何公共存储库。

您可以尝试使用关闭警告的选项

 -Xlint:-requires-transitive-automatic 

与JDK-8178011合并的更改说明: –

应该有两个新的警告:

  • 当一个命名模块“需要传递”一个自动模块时(默认开启)
  • 当命名模块“需要”自动模块时(默认关闭)

从这里所做的更改以及从编辑到JEP 261:模块系统推断这一点,确认(强调我的): –

在两种模块化模式中,编译器默认会生成与模块系统相关的各种警告; 这些可以通过-Xlint:-module选项禁用。

通过-Xlint选项exports,opens,requires-automatic和requires-transitive-automatic键可以更精确地控制这些警告。