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

Ale*_*rov 8 java javac java-9 java-module

将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;
}
Run Code Online (Sandbox Code Playgroud)

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

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

我尝试了以下选项,但它们都没有奏效:

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

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

[WARNING] .../MyClass.java:[25,20] com.google.common.collect.Table模块中的类com.google.common不是间接导出的requires transitive

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

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


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

Nam*_*man 7

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

-Xlint:-requires-transitive-automatic
Run Code Online (Sandbox Code Playgroud)

其中的更改与JDK-8178011合并,说明: -

应该有两个新的警告:

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

这个推断从这里所做的更改,并从编辑到JEP 261:模块系统这证实了(重点煤矿): -

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

这些警告的更精确的控制是通过提供出口,打开后,需要自动的,需要传递性自动为键-Xlint选项.

  • 我试过`-Xlint:-requires-transitive-automatic`并且它有效.非常感谢. (2认同)

Lai*_*son 7

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

@SuppressWarnings({ "requires-automatic", "requires-transitive-automatic" })
module foo {
 // ...
}
Run Code Online (Sandbox Code Playgroud)

JDK本身就使用了这种技术