Can模块-info.java';打开';语句是否包括一个包和所有子包?
我有一个Can模块-info.java';打开';语句是否包括一个包和所有子包?,java,spring,java-9,module-info,Java,Spring,Java 9,Module Info,我有一个module info.java文件- module foo.microservice { requires spring.core; requires spring.beans; requires spring.context; requires java.sql; // required for Spring Annotation based configuration :( opens foo.microservice.configurat
module info.java
文件-
module foo.microservice {
requires spring.core;
requires spring.beans;
requires spring.context;
requires java.sql; // required for Spring Annotation based configuration :(
opens foo.microservice.configuration to spring.core;
opens foo.microservice.internal.services to spring.beans;
opens foo.microservice.internal.controllers to spring.beans;
exports foo.microservice.configuration;
exports foo.microservice.controllers;
exports foo.microservice.models;
exports foo.microservice.services;
}
我希望有可能允许Spring访问所有内部包,而无需显式地将每个包添加到module-info.java中
是否有一种更通用的opens
语句来允许spring.beans
访问我的所有内部包(和子包)?目前没有,每个指令的语法如下:
ModuleDirective:
requires {RequiresModifier} ModuleName ;
exports PackageName [to ModuleName {, ModuleName}] ;
opens PackageName [to ModuleName {, ModuleName}] ;
uses TypeName ;
provides TypeName with TypeName {, TypeName} ;
同样的语法适用于
导出
和打开
:包名称中不允许使用通配符。这可能在将来会有所改进,但我认为这是一种不好的做法,类似于在导入语句中使用此类通配符的不好做法。您可以使用open module打开所有模块的所有包(内部或非内部)。我认为没有任何中间粒度
open module foo.microservice {
requires spring.core;
requires spring.beans;
requires spring.context;
requires java.sql; // required for Spring Annotation based configuration :(
exports foo.microservice.configuration;
exports foo.microservice.controllers;
exports foo.microservice.models;
exports foo.microservice.services;
}
(摘自Alexey Romanov的评论)'exports'和'opens'在module-info.java中具有非常不同的功能,因此我不认为这些问题与此问题重复。您可以使用
open module
打开所有模块的所有包(内部或非内部)。我不认为有任何中间粒度。@nullpointer Nicolai的回答解释了为什么导出
不允许使用中间粒度,并说明此原因不适用于打开
。因此,不,我不认为它回答了为什么不允许在打开
。加上一个用于相同的JLS链接。答案是正确的,但我想补充一点,这不必被视为不幸。恰恰相反,我认为包应该总是显式地、故意地导出/打开。此外,这会导致误解,即前缀相同的包在某种程度上是相关的,而它们不是相关的。