平台模块之间是否允许循环?

时间:2017-05-22 04:32:14

标签: java java-9 jigsaw

这是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.rmijava.base之间存在循环依赖关系,对吗?是否允许platform modules之间的周期?

1 个答案:

答案 0 :(得分:10)

模块系统禁止使用requires子句静态声明循环。这适用于平台和应用程序模块,您提供的示例不违反该规则。

要求子句只是模块图中可读性边缘的一个来源。其他是命令行标志,反射,requires transitive,我确信还有更多。添加所有这些可能会导致模块图中的循环,并且不会被禁止。

在您的具体示例中,只有在 java.base 读取 java.rmi 时才会创建循环,如果它在com.sun.rmi.rmid中的类上使用反射,则可能会发生这种情况