是否可以在Java 9中创建基于继承的(或嵌套的)模块?
这样的事情:
module a
|
├── module a1
|
└── module a2
在此示例中,a1
和a2
模块都是a
的子项。
如果我导入其中一个子模块,我将获得父模块(a
)的功能以及该子模块中定义的任何功能。也就是说,我可以导入a1
,并明确获取a
和a1
(但不是a2
)的功能。
a1
和a2
都是a
,可以访问a
的所有软件包,而无需将a
的软件包公开给它们。
答案 0 :(得分:5)
您可以使用requires transitive
和exports to
语法的组合模仿您要求的内容:
requires transitive
:指定导入此模块将固有地导入另一个模块。您可以使用此功能确保a1
和a2
导致a
导入。exports to
:这样您就可以将功能导出到特定模块;这样,您就可以a
授予a1
和a2
功能,以便公开导出这些功能。所以,例如:
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
,但会从务实的角度来看更接近),并且模块中不存在允许它的其他语法。