2

假设有一个模块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 ab1...b100
  • 添加requires transitive xb1...b100
  • 添加requires xc1...c100

虽然在这种特殊情况下所有都可以工作,但尚不清楚应该使用哪一个以及它们各自的副作用是什么。此外,这只是 3 级深层次结构 - 层次越多,它就越复杂。

如果requires transitive对所有依赖项都是可传递的(正如传递这个词所暗示的那样),这将自动解决。如果没有transitive,就只有一种方法可以解决这个问题。仅限于直接家属,有transitive一些“选项”需要考虑,但似乎没有提供足够的信息供人们做出正确的选择。

4

1 回答 1

1

如果一个模块(你的b)使用另一个模块的(你的x)类型独立于散布的需要传递(ba),他们应该直接要求它们而不依赖于隐含的可读性。

在您的情况下,b应该是绝对的requires transitive x

于 2018-04-30T13:35:27.063 回答