Java 9 个嵌套(分层或 Parent/Child)模块

Java 9 Nested (Hierarchical or Parent/Child) Modules

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

像这样:

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

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

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

a1a2都是a,可以访问a的所有包,而不必暴露[=15=的包] 给他们。

您可以 模拟 结合使用 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 供内部使用,不会对消费者在外部可见。

这与您要求的不完全一样。 a1 而不是 a。此外,a1 不能成为 aJLS 不允许在导出中使用通配符(即:exports * to a1,这仍然不会使 a1 成为 a,但从实用的角度来看会使其更接近),并且模块中不存在允许它的其他语法。