Разрешены ли циклы между модулями платформы?

Это объявление модуля модуля java.rmi:

module java.rmi {
    requires java.base;
    requires java.logging;

    exports java.rmi.activation;
    exports com.sun.rmi.rmid to java.base; // <-- cycle
    ...
}

Итак, существует циклическая зависимость между java.rmi и java.base, правильно? Разрешены ли циклы между модулями платформы?

Ответ 1

Модульная система запрещает статически объявлять циклы с предложениями requires. Это верно для модулей платформы и приложений, и приведенный вами пример не нарушает это правило.

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

В вашем конкретном примере цикл создается только после того, как java.base читает java.rmi, что может произойти, если оно использует отражение в классах в com.sun.rmi.rmid.