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

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

像这样的东西:

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

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

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

a1a2都是a ,并且可以访问a的所有包,而不必将a的包暴露给它们。

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

  • requires transitive :指定导入此模块将固有地导入另一个模块。 您可以使用它来确保a1a2导致导入。
  • export exports to :这将允许您将function导出到特定模块; 这将允许您授予对公开导出危险的a1a2function的访问权限。

所以,举例来说:

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

在这种情况下,如果消费者依赖于a1 ,它们将固有地依赖于(从而获得两者的效用),并且com.internal包虽然对于内部使用可见,但是对于消费者而言在外部是不可见的。

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