如何在Gradle中解决循环依赖

ord*_*lex 10 java gradle

我正在将Java项目从Ant迁移到Gradle.我认为最好的解决方案是使用Gradle的多项目支持,但我找不到摆脱循环依赖的方法.

原始项目设置为具有以下布局:

- project/
  - common/
  - product-a/
  - product-b/
Run Code Online (Sandbox Code Playgroud)

之间的关系common,product-a并且,product-b是棘手的.将common取决于product-aproduct-b根据配置文件.同样地,product-aproduct-b取决于common,无论配置属性的.product-aproduct-b绝不会在同一时间建成.

我认为一个快速的解决方案是在以下方面使用这样的东西project/build.gradle:

project(':product-a') {
    dependencies {
        compile project(':common')
    }
}

project(':product-b') {
    dependencies {
        compile project(':common')
    }
}
Run Code Online (Sandbox Code Playgroud)

接下来,我想到了一个方法,让它更接近公正的工作product-a.这导致我这样:

project(':common') {
    dependencies {
        compile project(':product-a')
    }
}
Run Code Online (Sandbox Code Playgroud)

这将引发具有循环依赖性的异常.

我已经考虑过重构,product-a并且product-b通过设置commonproduct-a/ product-b或使用多态来设置类的接口,但在我继续使用其中任何一个之前,是否有更好的方法来实现Gradle?我还没准备好摆脱这种技术债务.

Dav*_*arr 8

使用构建技巧无法解决删除循环依赖关系的问题.您将不得不重构您的模块,因此不再存在循环依赖.从你的模块名称,没有其他信息,我认为你会想要提取依赖于"product-*"的"common"部分并将其放入一个新模块中.

  • 我在这里描述了消除循环的重构过程:/sf/answers/4073068051/ (2认同)