如何正确地抑制“需要自动模块的传递指令”警告?
将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键可以更精确地控制这些警告。