module-info.java'opens'语句可以包含一个包和所有子包吗?

TK.*_*TK. 8 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.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;
}
Run Code Online (Sandbox Code Playgroud)

我希望有可能允许Spring访问所有内部包,而无需将每个包显式添加到module-info.java.

有没有办法让一个更通用的opens语句允许所有我的内部包(和子包)可访问spring.beans

rue*_*ste 8

您可以使用 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;
}
Run Code Online (Sandbox Code Playgroud)

(摘自阿列克谢·罗曼诺夫的评论)


man*_*uti 7

目前没有,因为JLS将模块声明定义为指令列表,其中每个指令具有以下语法:

ModuleDirective:
     requires {RequiresModifier} ModuleName ;
     exports PackageName [to ModuleName {, ModuleName}] ;
     opens PackageName [to ModuleName {, ModuleName}] ;
     uses TypeName ;
     provides TypeName with TypeName {, TypeName} ; 
Run Code Online (Sandbox Code Playgroud)

同样的语法都同时适用于exportsopens:没有允许使用通配符的包名.也许这可以在将来得到改善,但我认为这将是一种不好的做法,类似于在导入语句中使用这种通配符的不良做法.

  • 另外一个用于JLS链接. (2认同)
  • 答案是正确的,但我想补充一点,这不一定被视为不幸.恰恰相反,我认为应始终明确且有意地导出/打开包.此外,这将促使具有相同前缀的误解包以某种方式相关,但它们不是. (2认同)