解决 gradle 中的循环依赖

Resolve circular dependency in gradle

我最近开始开发一个 java 项目,其中包含一些子项目。都是gradle。假设有两个项目 A 和 B 已经实施。而我再介绍一个graldle项目C,依赖是这样的

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

前言

当你的依赖图中有一个循环时,没有什么魔法可以让你编译你的项目。您需要进行一些重构以消除循环。

处理循环依赖的方法是拆分模块并重复直到循环消失(或使用下面给出的替代方法)。

算法

  1. 起点:

    A --> B --> C
    ^           |
    |           |
    +-----------+
    
  2. 首先将 A 中被 C 使用的部分提取到一个单独的模块中(我们称之为 D):

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

    如果D 不依赖于任何其他模块,您就完成了。否则继续切断电源线。

  3. 假设 D 仍然具有 B 依赖性:

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

    需要从B中类比提取公共部分(姑且称之为E):

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

    就像以前一样 - 如果 E 仍然存在有问题的依赖项,请重复。

  4. 假设 E 仍然依赖于 C:

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

    我们做什么?明显拆分 C(通过提取 F):

    A --> B --> C --+
    |     |     |   |
    |     v     v   |
    |     E --> F   |
    |     ^         |
    |     |         |
    +---> D <-------+
    
  5. 继续循环,直到新引入的模块在模块图中不再有依赖项。

    例如在第 3 点中,如果我们假设 F 是无依赖性的,我们就完成了。这意味着 C 使用的 A 中有问题的部分已被提取到 D ─► E ─► F 子图中。

备选

请注意,如果在合理的预算范围内完全可行,这可能并不容易。因此,在某些情况下,最好退回到不太可取的替代方案:复制 C 所依赖的 A 中的代码。