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

3
考虑以下情况。我有两个名为“A”和“B”的Gradle(子)项目。 A定义了一些被B引用的类/接口。因此,B对A有编译依赖关系。现在A是一个Web服务器,应该在类路径上与B一起启动。 如何使用Gradle实现这一点? 当然,不可能将B作为编译依赖项添加到A中,因为这意味着A和B之间存在循环依赖关系。即使将B作为运行时依赖项添加到A中也不起作用,因为B中的编译错误会指出来自A的引用类不存在。 但为什么? 一种解决方案是将B中的代码移动到A中,但我真的想将该代码分开,因为稍后可能会有另一种我想要轻松交换A中的B的实现(例如通过在运行时类路径中交换jar包)。
我考虑的另一种解决方案是将B引用的A中的类分离到一个新模块中,并使A和B都依赖于该新模块。这听起来是有效的,但这将意味着将持久性层从A移到该新模块中,这感觉不对。
附加信息:A是一个具有持久性层、Web服务等的Spring Boot Web应用程序,B生成JAR。

最终我将代码从B移动到A,这是最简单的方法。 - Steffen Harbich
2个回答

3
循环依赖是在尝试进行依赖注入时遇到的众所周知的问题。在这种情况下,您面临类似但在模块级别的问题。我认为解决问题的唯一方法是创建一个包含通用代码(可能是由B引用的A接口)的第三个模块C。这样,您可以编译C(它没有任何依赖项),A(它依赖于C)和B(它也依赖于C),并将A与B一起在类路径中启动。

1
我很好奇:当我试图将B作为A的运行时依赖项添加时,为什么没有起作用?我的意思是模块A没有对B进行编译依赖。所以感觉不是真正的循环依赖关系。Gradle可以先编译A,然后编译B,然后将结果放在一起,在类路径上运行A和B。 - Steffen Harbich

2

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接