Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/305.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Can模块-info.java';打开';语句是否包括一个包和所有子包?_Java_Spring_Java 9_Module Info - Fatal编程技术网

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链接。答案是正确的,但我想补充一点,这不必被视为不幸。恰恰相反,我认为包应该总是显式地、故意地导出/打开。此外,这会导致误解,即前缀相同的包在某种程度上是相关的,而它们不是相关的。