如何解决Maven中的循环依赖问题?

49

我们如何解决Maven的循环依赖问题?

假设A是父项目,B和C是子项目。如果B依赖于C,而C又依赖于B,除了使用不同的项目外,是否有其他方法可以解决这种循环依赖关系呢?


1
你排除了创建一个新项目的可能性,这是我会做的... 有什么原因你不想这样做吗?这将是最好的解决方案。 - NilsH
如果您无法创建新项目,您能否将所有依赖功能仅移动到B或C? - Mehdi
Maven所做的是将“循环依赖不好”的问题提升到项目级别,这非常限制。如果在Java代码(类)级别上存在真正的循环依赖,那么确实是不好的...或者只是愚蠢的。但是在项目级别上???拜托了。这只会限制自己。模块之间存在交叉依赖并不是“完美”的,但它有用例。只要它不会转化为任何不良运行时情况。一些类可能需要遗留代码等。一个愚蠢的Maven约定框架使得易受骗、懒惰的程序员们被束缚了思维。 - niken
4个回答

44

Maven不允许项目之间存在循环依赖,因为这样就不清楚应该先构建哪个项目。所以你需要消除这个循环。一种解决方案是你已经提到过的创建另一个项目。另一种方法是当移动一些类从B到C或反过来时有帮助时,就这样做。或者如果没有必要拥有两个项目,有时正确的做法是将项目B和C合并为一个项目。

但是,如果不知道和分析为什么你的项目彼此依赖,很难建议最好的解决方案。

因此,我建议您可以使用像JDependInteliJ等工具来查找问题类,然后基于它们找到更好的软件设计。

大多数情况下,我创建类似于接口模块和实现模块的东西,这样可以消除大多数循环。 在本主题中查看Dormouse的答案,并搜索“依赖反转原则”以获取更多关于这个主题的来源。


3
定位依赖项的一个简单技巧是删除你遇到问题的依赖项,然后观察编译器在哪里报错。这种方法比较廉价,但可以有效帮助你找出代码中的问题。 - nclark
嗨@mszallbach,您能否更详细地解释一下如何使用接口模块和实现模块来消除循环? - Nathalie
1
@Nathalie,请查看Dormouse的答案以及相应的依赖倒置原则Wiki链接。当您搜索依赖倒置原则时,应该会有很多来源。 - mszalbach

12

创建一个新项目确实是一种解决方案。

依赖反转是另一个可能的解决方案。

有关无环依赖原则,请参见此处

有关依赖反转原则,请参见此处


2

假设Project A依赖于Project B,而Project B又依赖于Project A。

  1. 创建新项目并移动所有公共类。这是首选的选项。如果不行,请选择第二个选项。
  2. 尝试将一个依赖项作为运行时依赖项(例如,A在编译时依赖于B,而B在运行时依赖于A)。这将有助于解决先构建哪个JAR文件的问题。在这种情况下,应先构建B的JAR文件,然后再构建A的JAR文件。在这里,运行时意味着可以通过反射调用API。

1

我将介绍我如何解决循环依赖问题的方法。

我有两个相互包含的模块。我在双方都移除了依赖,并设置了RabbitMQ消息系统并创建了直接交换。因此,当我需要从module1获取某些内容时,我会向RabbitMQ发送消息并获取响应,然后从module2处理数据。我认为这是更好的组件集成方式,它是松散耦合的。


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