Допустим, есть модуль 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
ограничено прямыми иждивенцами, существуют «варианты», которые необходимо рассмотреть, но в них недостаточно информации для того, чтобы сделать правильный выбор.