假设有一个模块x
可以导出一些东西。然后是模块a
:
module a {
exports some.package.from.a
requires transitive x;
}
然后有 100 个模块b
需要a
:
module b1 {
exports some.package.from.b1
requires a;
}
...
module b100 {
exports some.package.from.b100
requires a;
}
然后有100个模块c
需要各自b
的s
module c1 {
requires b1;
}
...
module c100 {
requires b100;
}
假设c1
...c100
不需要了解来自a
. 这些仅由b1
...b100
内部使用,因此不需要传递。
b1
然而,由...导出的 APIb100
使用由 . 导出的包中的类x
。
模块c1
...c100
看不到那些。试图编译它们,结果是
Compilation failure:
(package x.y.z is declared in module x, but module c1 does not read it)
为什么requires transitive
仅限于直接需要包含它的模块的模块?module-info
如果不编辑 100 个文件,如何解决上述问题?
更新:至少有 3 种方法可以“解决”这个问题:
- 添加
requires transitive a
到b1
...b100
- 添加
requires transitive x
到b1
...b100
- 添加
requires x
到c1
...c100
虽然在这种特殊情况下所有都可以工作,但尚不清楚应该使用哪一个以及它们各自的副作用是什么。此外,这只是 3 级深层次结构 - 层次越多,它就越复杂。
如果requires transitive
对所有依赖项都是可传递的(正如传递这个词所暗示的那样),这将自动解决。如果没有transitive
,就只有一种方法可以解决这个问题。仅限于直接家属,有transitive
一些“选项”需要考虑,但似乎没有提供足够的信息供人们做出正确的选择。