2017-12-18 218 views
4

我有一个module-info.java文件看起来像 -module-info.java'open'语句是否可以包含一个包和所有的子包?

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访问?

+0

“出口”和“打开”在module-info.java中具有非常不同的功能,所以我没有看到这些问题是重复的。 –

+3

您可以使用'open module'打开所有模块的所有软件包(内部或不是)。我不认为有任何中间粒度。 –

+1

@nullpointer Nicolai的回答解释了为什么不允许“出口”,并指出这个原因不适用于'opens'。所以不,我不认为它回答了为什么不允许“打开”。 –

回答

4

目前国内还没有,因为JLS defines a module declaration作为指令的列表,其中每个指令有以下语法:

ModuleDirective: 
    requires {RequiresModifier} ModuleName ; 
    exports PackageName [to ModuleName {, ModuleName}] ; 
    opens PackageName [to ModuleName {, ModuleName}] ; 
    uses TypeName ; 
    provides TypeName with TypeName {, TypeName} ; 

同样的语法都同时适用于exportsopens:没有允许使用通配符的包名。也许这可能会在未来得到改善,但我认为这将是一种不好的做法,类似于在进口报表中使用这种通配符的不良做法。

+2

加上一个用于JLS链接的相同。 – nullpointer

+2

答案是正确的,但我想补充一点,这不必被视为不幸。恰恰相反,我认为应始终明确故意导出/打开软件包。此外,这将促进具有相同前缀的误解包在某种程度上是相关的,但它们不是。 – Nicolai

相关问题