6

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

  • A 依赖于 B
  • B 依赖于 C
  • C 依赖于 A

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

4

1 回答 1

8

前言

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

处理循环依赖的方式是拆分模块并重复此操作,直到循环结束(或使用下面给出的替代方案)。

算法

  1. 初始点:

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

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

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

  3. 假设 D stil 有一个 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是无依赖的,我们就完成了。这意味着Aused by的问题部分C已被提取到D ─► E ─► F子图中。

选择

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

于 2019-10-01T14:13:08.677 回答