解决gradle中的循环依赖

She*_*sha 5 java gradle cyclic-dependency

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

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

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

jan*_*nis 6

前言

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

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

算法

  1. 初始点:

     A ?? B ?? C
     ?         ?
     ???????????
    
    Run Code Online (Sandbox Code Playgroud)
  1. 先从提取的部分A被用来通过C一个单独的模块(我们称之为D):

     A ?? B ?? C
     ?         ?
     ???? D ????
    
    Run Code Online (Sandbox Code Playgroud)

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

  2. 假设 D stil 有 B 依赖:

     A ?? B ?? C
     ?    ?    ?
     ?    ?    ?
     ???? D ????
    
    Run Code Online (Sandbox Code Playgroud)

    您需要类比地从中提取公共部分B(我们称之为E):

     A ?? B ?? C
     ?    ?    ?
     ?    ?    ?
     ?    E    ?
     ?    ?    ?
     ?    ?    ?
     ???? D ????
    
    Run Code Online (Sandbox Code Playgroud)

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

  3. 假设 E stil 依赖于 C:

     A ?? B ?? C ??
     ?    ?    ?  ?
     ?    ?    ?  ?
     ?    E ????  ?
     ?    ?       ?
     ?    ?       ?
     ???? D ???????
    
    Run Code Online (Sandbox Code Playgroud)

    我们做什么?Obvioulsy 分裂C(通过提取F):

     A ?? B ?? C ??
     ?    ?    ?  ?
     ?    ?    ?  ?
     ?    E ?? F  ?
     ?    ?       ?
     ?    ?       ?
     ???? D ???????
    
    Run Code Online (Sandbox Code Playgroud)
  4. 继续循环直到到达新引入的模块在模块图中不再有依赖关系的点。

    例如在第 3) 点中,如果我们假设它F是无依赖的,我们就完成了。这意味着 using Aby的问题部分C已被提取到D ?? E ?? F子图中。

选择

请注意,如果在合理的预算范围内完全可行,它可能并不那么容易。因此,在某些情况下可能会更好回落到不太理想的选择:复制代码AC依赖。