Может ли модуль-info.java "открывать" оператор включать пакет и все подпакеты?

У меня есть 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?

1 ответ

Решение

В настоящее время нет, так как JLS определяет объявление модуля как список директив, где каждая директива имеет следующий синтаксис:

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

Один и тот же синтаксис применяется для обоих exports а также opens: подстановочные знаки не допускаются в имени пакета. Возможно, это может быть улучшено в будущем, но я думаю, что это будет плохая практика, подобная плохой практике использования таких подстановочных знаков в операторах импорта.

Вы можете использовать открытый модуль, чтобы открыть все пакеты (внутренние или нет) для всех модулей. Я не думаю, что есть промежуточная степень детализации.

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;
}

(скопировано из комментария Алексея Романова)

Другие вопросы по тегам