【发布时间】:2018-04-27 22:26:25
【问题描述】:
假设有模块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 需要各自的 bs
module c1 {
requires b1;
}
...
module c100 {
requires b100;
}
假设c1 ... c100 不需要知道来自a 的包。这些仅由 b1 ... b100 在内部使用,因此不需要传递。
但是b1 ... b100 导出的API 使用x 导出的包中的类。
模块 c1 ... c100 看不到这些。尝试编译它们,结果是
Compilation failure:
(package x.y.z is declared in module x, but module c1 does not read it)
为什么requires transitive 仅限于直接需要包含它的模块的模块?如果不编辑 100 个module-info 文件,如何解决上述问题?
更新: 至少有 3 种方法可以“解决”这个问题:
- 将
requires transitive a添加到b1...b100 - 将
requires transitive x添加到b1...b100 - 将
requires x添加到c1...c100
虽然在这种特殊情况下所有方法都可以工作,但尚不清楚应该使用哪一种以及每种方法的副作用是什么。此外,这只是 3 级深层次结构 - 层次越多,它就越复杂。
如果requires transitive 对所有家属都是可传递的(正如传递这个词所暗示的),这将自动解决。如果没有transitive,则只有一种方法可以解决该问题。 transitive 仅限于直接家属,因此需要考虑“选项”,但似乎没有提供足够的信息供人们做出正确选择。
【问题讨论】:
-
听起来你在寻找increase the module readability?
-
也许吧!我只是想了解这个限制背后的设计决策来自哪里。我找不到任何解释。我知道根据 Java 语言规范的第 7.7.1 节,“正确”的方法是将
requires transitive a添加到所有b模块中。然而,这看起来违反直觉。此外,出于任何其他原因,它根本没有必要,而是使x在不止一个级别上具有传递性。
标签: java java-9 java-platform-module-system java-module module-info