Java 9中是否可以使用循环模块依赖?

时间:2016-02-28 22:18:04

标签: java java-9 jigsaw java-module module-info

在Java 9中,是否允许使用循环模块?如果不是,原因是什么?

module com.foo.bar {
    requires com.foo.baz;
    exports com.foo.bar.fizz;
}

module com.foo.baz {
    requires com.foo.bar;
    exports com.foo.baz.buzz;
}

2 个答案:

答案 0 :(得分:16)

不。

文档

有趣的是,State of the Module SystemJigsaw Quick Start Guide都没有解决这个问题。一个来源(由Andy找到)是Alex Buckley的JavaOne演讲(见他解释here)。最近的一个是list of open issues,它明确提到了cyclic dependencies

  

当模块图最初在编译时,链接时和运行时解析时,当前草稿不允许循环。如果为自动模块添加可读性边缘,或者通过反射,则可以在运行时稍后出现循环。 [...]然而,这种约束不是一个记录的要求[...]。

理由

循环依赖很糟糕,mkay。 ;)

当两个实体(方法,类,模块,项目......)协作但没有充分解耦时,它们就会出现。对于用户和维护者而言,这种耦合意味着他们不能在不考虑其他情况下使用或改进。但这正是模块化试图实现的好处。

从上面链接的问题列表中

  

在解决过程中禁止循环的理由是它使模块图更易于推理,它简化了模块系统本身,并且哲学上,循环中涉及的任何模块在逻辑上都是一个模块,所以它们应该是首先是这样定义的。

实验

我创建了一个包含两个周期的小demo project on GitHub:两个 - >一个 - >两个; 三个:三个 - >两个 - >一个 - >三个)。尝试快速入门指南中显示的multi-module compilation,结果如下:

./compile.sh
 > creating clean directories
 > compiling and packaging cycle "pair"
src/org.codefx.demo.cyclic.pair.one/module-info.java:2: error: cyclic dependence involving org.codefx.demo.cyclic.pair.two
        requires org.codefx.demo.cyclic.pair.two;
                                            ^
1 error
 > compiling and packaging cycle "triple"
src/org.codefx.demo.cyclic.triple.three/module-info.java:2: error: cyclic dependence involving org.codefx.demo.cyclic.triple.two
        requires org.codefx.demo.cyclic.triple.two;
                                              ^
1 error

所以你甚至无法编译模块,更不用说在配置中使用它们了。

答案 1 :(得分:-2)

除了自动模块模块外,不会出现问题。 只允许传递依赖,传递依赖永远不会循环。