10

我有一个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

4

2 回答 2

9

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

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

相同的语法适用于exportsopens:包名中不允许使用通配符。也许将来可以改进,但我认为这将是一个不好的做法,类似于在 import 语句中使用此类通配符的坏做法。

于 2017-12-18T10:58:43.800 回答
3

您可以使用 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 的评论)

于 2019-08-21T18:36:03.747 回答