解决gradle中的循环依赖

时间:2019-10-01 05:10:26

标签: java gradle cyclic-dependency

我最近开始开发一个Java项目,该项目中包含一些子项目。他们都是摇摇欲坠的。假设有两个已经实施的项目A和B。而且我将介绍另一个摇摇欲坠的项目C。依赖关系就是这样。

  • A依赖于B
  • B对C有依赖关系
  • C依赖于A

因此,我需要实现此项目C且没有循环依赖项错误,这是我尝试使用gradle构建项目时给出的错误。我看到一些答案,认为Interface是为此的解决方案。但就我而言,项目A和B是大型项目,我无法想到如何为它们引入接口。我唯一能做的就是为项目C引入接口。那么有没有办法解决这些情况下的问题呢?如果没有,拥有这样一个人的方法是什么?并且请注意,这些A,B,C项目是单独的项目,因此它们不能合并为一个项目。

1 个答案:

答案 0 :(得分:1)

前言

在依赖图中出现循环时,没有任何魔术可以让您编译项目。您需要进行一些重构以消除循环。

处理循环依赖关系的方法是将模块拆分为较小的模块,然后重复进行直到消除循环为止。

算法

1)首先将C所使用的A部分提取到一个单独的模块中(我们称其为D):

A -> B -> C
|         |
|         |
 --> D <--

如果D不依赖于任何其他模块,那么您就完成了。如果需要,则需要继续拆分。

2)假设D stil取决于B:

A -> B -> C
|    ^    |
|    |    |
 --> D <--

您需要类似地从B中提取通用部分(我们称其为E):

A -> B -> C
|    |    |
|    v    |
|    E    |
|    ^    |
|    |    |
 --> D <--

再一次,如果E没有依赖性导致循环-您就完成了。如果没有,请继续。

3)假设E stil取决于C:

A -> B -> C --
|    |    ^   |
|    v    |   |
|    E ---    |
|    ^        |
|    |        |
 --> D <------

我们该怎么办? vi虫C(提取F):

A -> B -> C --
|    |    |   |
|    v    v   |
|    E -> F   |
|    ^        |
|    |        |
 --> D <------

后记

请注意,这根本不可能那么容易(在相当长的时间和/或预算之内)。

您还可以考虑复制C依赖的A中的代码。