首页 » Maven实战 » Maven实战全文在线阅读

《Maven实战》8.6.1 反应堆的构建顺序

关灯直达底部

本节仍然以账户注册服务为例来解释反应堆。首先,为了能更清楚地解释反应堆的构建顺序,将account-aggregator的聚合配置修改如下:

修改完毕之后构建account-aggregator会看到如下的输出:

上述输出告诉了我们反应堆的构建顺序,它们依次为account-aggregator、account-parent、account-email和account-persist。我们知道,如果按顺序读取POM文件,首先应该读到的是account-aggregator的POM,实际情况与预料的一致,可是接下来几个模块的构建次序显然与它们在聚合模块中的声明顺序不一致,account-parent跑到了account-email前面,这是为什么呢?为了解释这一现象,先看图8-4。

图8-4 账户注册服务4模块的反应堆

图8-4中从上至下的箭头表示POM的读取次序,但这不足以决定反应堆的构建顺序,Maven还需要考虑模块之间的继承和依赖关系,图中的有向虚连接线表示模块之间的继承或者依赖(本章以下内容使用依赖泛指这种模块间的依赖或继承关系),该例中account-email和account-persist依赖于account-parent,那么account-parent就必须先于另外两个模块构建。也就是说,这里还有一个从右向左的箭头。实际的构建顺序是这样形成的:Maven按序读取POM,如果该POM没有依赖模块,那么就构建该模块,否则就先构建其依赖模块,如果该依赖还依赖于其他模块,则进一步先构建依赖的依赖。该例中,account-aggregator没有依赖模块,因此先构建它,接着到account-email,它依赖于account-parent模块,必须先构建account-parent,然后再构建account-email,最后到account-persist的时候,由于其依赖模块已经被构建,因此直接构建它。

模块间的依赖关系会将反应堆构成一个有向非循环图(Directed Acyclic Graph,DAG),各个模块是该图的节点,依赖关系构成了有向边。这个图不允许出现循环,因此,当出现模块A依赖于B,而B又依赖于A的情况时,Maven就会报错。