В Java 9 циклы между модулями не разрешены, поэтому A требует B, но B не может требовать A.
Однако, просматривая базу кода JDK, я вижу, что модуль java.management
содержит exports com.sun.jmx.remote.util to java.management.rmi;
, а в модуле java.management.rmi
я вижу экспорт com.sun.jmx.remote.protocol.rmi to java.management;
.
Почему это циклическое правило ослаблено для операторов экспорта?
module java.management {
exports javax.management.remote;
exports javax.management.timer;
exports sun.management.counter to jdk.management.agent;
exports com.sun.jmx.remote.util to java.management.rmi;
exports com.sun.jmx.remote.security to jdk.management.agent, java.management.rmi;
exports sun.management to jdk.management, jdk.management.agent, jdk.jconsole;
exports javax.management.modelmbean;
exports com.sun.jmx.remote.internal to jdk.management.agent, java.management.rmi;
exports java.lang.management;
exports sun.management.counter.perf to jdk.management.agent;
exports javax.management;
exports javax.management.relation;
exports sun.management.spi to jdk.management;
exports javax.management.openmbean;
exports javax.management.monitor;
exports javax.management.loading;
uses javax.management.remote.JMXConnectorProvider;
uses javax.management.remote.JMXConnectorServerProvider;
uses sun.management.spi.PlatformMBeanProvider;
provides javax.security.auth.spi.LoginModule with com.sun.jmx.remote.security.FileLoginModule;
}
а также
module java.management.rmi {
requires transitive java.management;
requires transitive java.rmi;
requires java.naming;
exports javax.management.remote.rmi;
exports com.sun.jmx.remote.protocol.rmi to java.management;
exports com.sun.jmx.remote.internal.rmi to jdk.management.agent;
provides javax.management.remote.JMXConnectorServerProvider with com.sun.jmx.remote.protocol.rmi.ServerProvider;
provides javax.management.remote.JMXConnectorProvider with com.sun.jmx.remote.protocol.rmi.ClientProvider;
}