Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/318.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何解决gradle多项目构建中的循环依赖_Java_Gradle - Fatal编程技术网

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

Java 如何解决gradle多项目构建中的循环依赖,java,gradle,Java,Gradle,考虑以下情况。我有两个毕业(子)项目叫做“A”和“B”。A定义了一些被B引用的类/接口。因此B对A有编译依赖关系。现在A是一个web服务器,应该在类路径上以B启动你如何通过gradle实现这一目标? 当然,不可能将B作为编译依赖项添加到A,因为这意味着A和B之间存在循环依赖项。甚至将B作为运行时依赖项添加到A也不起作用,因为在B状态下,引用A中的类的编译错误不存在但是为什么呢? 一种解决方案是将代码从B移动到A,但我确实希望将代码分开,因为以后可能会有另一个B实现,我希望在A中轻松交换(例如,通

考虑以下情况。我有两个毕业(子)项目叫做“A”和“B”。A定义了一些被B引用的类/接口。因此B对A有编译依赖关系。现在A是一个web服务器,应该在类路径上以B启动你如何通过gradle实现这一目标?

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

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

我考虑的另一个解决方案是将B引用的A类分离到一个新模块中,并使A和B都依赖于该新模块。这听起来很有道理,但这意味着将持久性层从一个新模块移动到一个感觉不正确的新模块


附加信息:A是一个具有持久层、web服务等的Spring boot web应用程序,B生成一个JAR。

当您尝试进行依赖项注入时,循环依赖项是一个众所周知的问题。在本例中,您有一些类似的功能,但属于模块级别

我认为解决问题的唯一方法是使用通用代码创建第三个模块
C
(可能是B引用的
a
接口)


通过这种方式,您可以编译
C
(它没有任何依赖项),
A
(它取决于
C
)和
B
(它取决于
C
),并在其类路径中启动
A
,循环依赖项是您尝试进行依赖项注入时的一个众所周知的问题。在本例中,您有一些类似的功能,但属于模块级别

我认为解决问题的唯一方法是使用通用代码创建第三个模块
C
(可能是B引用的
a
接口)


通过这种方式,您可以编译
C
(它没有任何依赖关系)、
A
(它取决于
C
)和
B
(它取决于
C
)并在类路径中启动
A
B

每次您以循环依赖结束时,您可能应该引入另一个实体来打破循环


请看我在另一篇QA文章中的解释(它涉及包和类,但想法是一样的):

每当您以循环依赖结束时,您可能应该引入另一个实体来打破循环


看看我在另一篇QA文章中的解释(它涉及包和类,但想法是一样的):

我很好奇:当我试图将B作为运行时依赖项添加到a时,为什么不起作用?我的意思是模块A和B之间没有编译依赖关系,所以感觉它不是一个真正的循环依赖关系。Gradle可以先编译A,然后编译B,然后将结果放在一起,以便在类路径上使用B运行A。我很好奇:当我试图将B作为运行时依赖项添加到A时,为什么不起作用?我的意思是模块A和B之间没有编译依赖关系,所以感觉它不是一个真正的循环依赖关系。Gradle可以编译A,然后编译B,然后将结果放在一起,在类路径上运行A和B。我最终将代码从B移动到A,这是最简单的方法。我最终将代码从B移动到A,这是最简单的方法。