使用Maven检测循环依赖关系

时间:2009-10-22 15:41:06

标签: java maven-2

在我的应用程序中,我使用的是由多个模块组成的外部库(Batik 1.7)。模块之间具有多个循环依赖关系。这不会影响构建,但是某些工具(例如M2Eclipse依赖关系图或依赖关系报告)将不再起作用。

有没有一种很好的方法来诊断哪些周期,以及一种简单的方法来摆脱它们?

更新:问题在于POM,例如: batik-bridge取决于batik-gvt,{{3}}依赖于batik-bridge

我想我可以通过手动排除某些依赖项来解决这个问题,但我不确定要排除什么。我想要的是清楚地概述图中的周期。

3 个答案:

答案 0 :(得分:4)

我不确定这是否与maven相关(你不能在带有maven的模块之间存在循环依赖)但是我可能没有得到什么。也就是说,您可以使用JDepend来分析一段代码并找到循环依赖关系(请参阅Interpreting Dependency Cycles)。如果您更喜欢使用Eclipse中的JDepend,那么就有JDepend4Eclipse插件。

从它的subversion repository查看Batik,在其来源上运行JDepend,看看你是否找到了什么(我想你会发现)。但是,说实话,这很容易。摆脱循环依赖是另一回事,可能并不那么容易。这可能涉及诸如将类从一个包移动到另一个包,重新打包模块,理解Batik的构建如何工作(请注意其Ant构建脚本有2220行)等任务。换句话说,这将需要对您的库进行一些艰苦的工作最初只想使用(除非您提供这些更改,否则您可能必须在以后的版本中再次应用它们)。我的建议:在开始朝这个方向挖掘之前再考虑两次。

仅为了您的信息,还有一个jdepend-maven-plugin,只有在您的项目(即您的代码)上运行JDepend时才有用。

答案 1 :(得分:2)

尝试从最顶层项目的根目录中的命令行运行:

mvn dependency:tree

答案 2 :(得分:1)

尝试使用UCDetector它有助于在开发时在类级别中查找依赖关系循环。另一个有用的工具是Tattletale

它为您提供可以帮助您的报告

  • 识别JAR文件之间的依赖关系
  • 从类路径中查找缺少的类
  • 如果一个类位于多个JAR文件中,则发现
  • 如果相同的JAR文件位于多个位置,则发现
  • 列出每个JAR文件所需的内容并提供
  • 验证类的SerialVersionUID
  • 查找具有不同版本号的类似JAR文件
  • 查找没有版本号
  • 的JAR文件
  • 在JAR文件中找到一个类
  • 获取项目的OSGi状态
  • 删除黑名单的API使用

我故意使用maven解决方案,而不是将其他回复加倍。