【问题标题】:Resolve circular dependency in gradle解决gradle中的循环依赖
【发布时间】:2020-01-30 08:49:11
【问题描述】:

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

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

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

【问题讨论】:

  • 你可能想看看this answer
  • 当我使用它配置 gradle 时,我无法转到项目文件。并且源目录的内容显示为空。但它不是空的。

标签: java gradle cyclic-dependency


【解决方案1】:

前言

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

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

算法

  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 中的代码。

【讨论】:

    猜你喜欢
    • 2016-10-29
    • 2020-11-12
    • 1970-01-01
    • 2013-02-04
    • 2010-10-27
    • 1970-01-01
    相关资源
    最近更新 更多