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

2022-09-04 20:19:24

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

[警告] /.../src/main/java/module-info.java:[3,35] 需要自动模块的传递指令

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

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

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

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

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

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

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

[警告] .../MyClass.java:[25,20] 模块中的类不会使用com.google.common.collect.Tablecom.google.commonrequires transitive

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

我正在使用我宁愿保留的内容,因此警告不仅仅是令人讨厌的...-Werror


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


答案 1

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

-Xlint:-requires-transitive-automatic

JDK-8178011合并的更改指出:-

应该有两个新的警告:

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

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

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

通过 -Xlint 选项的导出、打开、需要自动和需要传递自动键,可以更精确地控制这些警告。


答案 2

您也可以像这样使用:@SuppressWarnings

@SuppressWarnings({ "requires-automatic", "requires-transitive-automatic" })
module foo {
 // ...
}

JDK 本身也使用这种技术


推荐