Java 9嵌套(分层或父/子)模块

时间:2018-02-12 13:19:55

标签: java java-9

是否可以在Java 9中创建基于继承的(或嵌套的)模块?

这样的事情:

module a
   |
   ├── module a1
   |   
   └── module a2

在此示例中,a1a2模块都是a的子项。

如果我导入其中一个子模块,我将获得父模块(a)的功能以及该子模块中定义的任何功能。也就是说,我可以导入a1,并明确获取aa1(但不是a2)的功能。

a1a2都是a,可以访问a的所有软件包,而无需将a的软件包公开给它们。

1 个答案:

答案 0 :(得分:5)

您可以使用requires transitiveexports to语法的组合模仿您要求的内容:

  • requires transitive:指定导入此模块将固有地导入另一个模块。您可以使用此功能确保a1a2导致a导入。
  • exports to:这样您就可以将功能导出到特定模块;这样,您就可以a授予a1a2功能,以便公开导出这些功能。

所以,例如:

module a {
    exports com.internal to a1;
    exports com.internal to a2;
}

module a1 {
    requires transitive a;
}

module a2 {
    requires transitive a;
}

在这种情况下,如果消费者依赖a1,他们将固有地依赖a(从而获得两者的效用)和com.internal包,同时a1可见{1}}供内部使用,不会在外部对消费者可见。

这不是你要求的。 a1 a。此外,a1 不能 a; JLS不允许导出中的通配符(IE:exports * to a1,它仍然不会使a1成为a,但会从务实的角度来看更接近),并且模块中不存在允许它的其他语法。