Почему переходные требования ограничены модулями, которые непосредственно требуют модуль, содержащий его? - PullRequest
0 голосов
/ 28 апреля 2018

Допустим, есть модуль x, который что-то экспортирует. Тогда есть модуль a:

module a {
 exports some.package.from.a
 requires transitive x;
}

Тогда есть 100 модулей b, которые требуют a:

module b1 {
  exports some.package.from.b1
  requires a;
}
...
module b100 {
  exports some.package.from.b100
  requires a;
}

Тогда есть 100 модулей c, которые требуют соответствующих b s

module c1 {
  requires b1;
}

...
module c100 {
  requires b100;
}

Предположим, c1 ... c100 не нужно знать о пакетах из a. Они используются только b1 ... b100 для внутреннего использования и, следовательно, не требуются переходным способом.

Однако API, экспортируемый с помощью b1 ... b100, использует классы в пакетах, экспортируемых с помощью x.

Модули c1 ... c100 НЕ могут их видеть. Попытка их скомпилировать приводит к

Compilation failure:
(package x.y.z is declared in module x, but module c1 does not read it)

Почему requires transitive ограничивается модулями, которым непосредственно требуется модуль, содержащий его? Как решить проблему, описанную выше, без редактирования файлов размером 100 module-info?


UPDATE: Есть как минимум 3 способа «исправить» это:

  • добавить requires transitive a к b1 ... b100
  • добавить requires transitive x к b1 ... b100
  • добавить requires x к c1 ... c100

Хотя все будет работать в этом конкретном случае, не ясно, какой из них следует использовать и каковы побочные эффекты каждого из них. Более того, это только 3 уровня глубокой иерархии - с большим количеством уровней она становится еще более сложной.

Если бы requires transitive должен был быть транзитивным для всех иждивенцев (как следует из слова переходный) это было бы решено автоматически. Если бы не было transitive, был бы только один способ решить проблему. Поскольку transitive ограничено прямыми иждивенцами, существуют «варианты», которые необходимо рассмотреть, но в них недостаточно информации для того, чтобы сделать правильный выбор.

1 Ответ

0 голосов
/ 30 апреля 2018

Если модуль (ваши b ) используют другие типы модулей (ваши x ) независимо от вкрапленных, требуется переходной режим ( b на a s), они должны требовать их напрямую и не полагаться на подразумеваемую читаемость.

В вашем случае b должно быть абсолютно requires transitive x.

...