解决 gradle 中的循环依赖
Resolve circular dependency in gradle
我最近开始开发一个 java 项目,其中包含一些子项目。都是gradle。假设有两个项目 A 和 B 已经实施。而我再介绍一个graldle项目C,依赖是这样的
- A 依赖于 B
- B 依赖于 C
- C 依赖于 A
所以我需要在没有循环依赖错误的情况下实现这个项目 C,因为它是在我尝试使用 gradle 构建项目时给出的。我看到一些答案,Interface 是一个解决方案。但就我而言,项目 A 和 B 是大型项目,我什至无法考虑如何为它们引入接口。我唯一能做的就是为项目C引入接口。那么有没有办法解决我这些案例的问题呢?如果没有,有什么方法可以拥有这样的一个?请注意,这些 A、B、C 项目是单独的项目,因此不能合并为一个项目。
前言
当你的依赖图中有一个循环时,没有什么魔法可以让你编译你的项目。您需要进行一些重构以消除循环。
处理循环依赖的方法是拆分模块并重复直到循环消失(或使用下面给出的替代方法)。
算法
起点:
A --> B --> C
^ |
| |
+-----------+
首先将 A
中被 C
使用的部分提取到一个单独的模块中(我们称之为 D
):
A --> B --> C
| |
| |
+---> D <---+
如果D
不依赖于任何其他模块,您就完成了。否则继续切断电源线。
假设 D 仍然具有 B 依赖性:
A --> B --> C
| ^ |
| | |
+---> D <---+
需要从B
中类比提取公共部分(姑且称之为E
):
A --> B --> C
| | |
| v |
| E |
| ^ |
| | |
+---> D <---+
就像以前一样 - 如果 E
仍然存在有问题的依赖项,请重复。
假设 E 仍然依赖于 C:
A --> B --> C --+
| | ^ |
| v | |
| E ----+ |
| ^ |
| | |
+---> D <-------+
我们做什么?明显拆分 C
(通过提取 F
):
A --> B --> C --+
| | | |
| v v |
| E --> F |
| ^ |
| | |
+---> D <-------+
继续循环,直到新引入的模块在模块图中不再有依赖项。
例如在第 3 点中,如果我们假设 F
是无依赖性的,我们就完成了。这意味着 C
使用的 A
中有问题的部分已被提取到 D ─► E ─► F
子图中。
备选
请注意,如果在合理的预算范围内完全可行,这可能并不容易。因此,在某些情况下,最好退回到不太可取的替代方案:复制 C
所依赖的 A
中的代码。
我最近开始开发一个 java 项目,其中包含一些子项目。都是gradle。假设有两个项目 A 和 B 已经实施。而我再介绍一个graldle项目C,依赖是这样的
- A 依赖于 B
- B 依赖于 C
- C 依赖于 A
所以我需要在没有循环依赖错误的情况下实现这个项目 C,因为它是在我尝试使用 gradle 构建项目时给出的。我看到一些答案,Interface 是一个解决方案。但就我而言,项目 A 和 B 是大型项目,我什至无法考虑如何为它们引入接口。我唯一能做的就是为项目C引入接口。那么有没有办法解决我这些案例的问题呢?如果没有,有什么方法可以拥有这样的一个?请注意,这些 A、B、C 项目是单独的项目,因此不能合并为一个项目。
前言
当你的依赖图中有一个循环时,没有什么魔法可以让你编译你的项目。您需要进行一些重构以消除循环。
处理循环依赖的方法是拆分模块并重复直到循环消失(或使用下面给出的替代方法)。
算法
起点:
A --> B --> C ^ | | | +-----------+
首先将
A
中被C
使用的部分提取到一个单独的模块中(我们称之为D
):A --> B --> C | | | | +---> D <---+
如果
D
不依赖于任何其他模块,您就完成了。否则继续切断电源线。假设 D 仍然具有 B 依赖性:
A --> B --> C | ^ | | | | +---> D <---+
需要从
B
中类比提取公共部分(姑且称之为E
):A --> B --> C | | | | v | | E | | ^ | | | | +---> D <---+
就像以前一样 - 如果
E
仍然存在有问题的依赖项,请重复。假设 E 仍然依赖于 C:
A --> B --> C --+ | | ^ | | v | | | E ----+ | | ^ | | | | +---> D <-------+
我们做什么?明显拆分
C
(通过提取F
):A --> B --> C --+ | | | | | v v | | E --> F | | ^ | | | | +---> D <-------+
继续循环,直到新引入的模块在模块图中不再有依赖项。
例如在第 3 点中,如果我们假设
F
是无依赖性的,我们就完成了。这意味着C
使用的A
中有问题的部分已被提取到D ─► E ─► F
子图中。
备选
请注意,如果在合理的预算范围内完全可行,这可能并不容易。因此,在某些情况下,最好退回到不太可取的替代方案:复制 C
所依赖的 A
中的代码。