如何解决gradle多项目构建中的循环依赖问题

时间:2018-03-27 13:11:34

标签: java gradle

考虑以下情况。我有两个名为“A”和“B”的gradle(子)项目。 A定义了B引用的一些类/接口。因此B对A具有编译依赖性。现在A是应该在类路径上以B启动的Web服务器。 如何使用gradle实现这一目标?

当然不可能将B作为编译依赖项添加到A,因为这意味着A和B之间存在循环依赖。即使将B作为运行时依赖项添加到A也不起作用,因为然后在B状态中编译引用类的错误来自A不存在。 但为什么?

一个解决方案是将代码从B移动到A但是我真的想要将代码分开,因为稍后可能会有另一个B实现,我希望在A中轻松交换(例如,通过在运行时类路径中交换jar)

我想到的另一个解决方案是将B类引用的A类分成新模块,并使A和B都依赖于该新模块。这听起来很有效,但这意味着将持久层从A移动到感觉错误的新模块。

附加信息:A是一个带有持久层,Web服务等的Spring启动Web应用程序,B生成一个JAR。

2 个答案:

答案 0 :(得分:1)

当您尝试获取依赖注入时,循环依赖项是一个众所周知的问题。在这种情况下,您有类似的东西,但在模块级别

我看到你解决问题的唯一方法是创建第三个模块C,其中包含公共代码(可能是B引用的A接口)

这样你可以编译C(它没有任何依赖关系),A(它取决于C)和B(它取决于{{ 1}})并在其类路径中使用C启动A

答案 1 :(得分:1)

每当你最终得到循环依赖时,你可能应该引入另一个实体来打破循环。

看看我在其他QA文章中的解释(它涉及包和类,但想法是一样的):What does it mean and how to fix SonarQube Java issue "Cycles between packages should be removed" (squid:CycleBetweenPackages)