使用Maven检测循环依赖关系

7
在我的应用程序中,我使用了一个外部库(Batik 1.7),它由多个模块组成。这些模块彼此之间存在多个循环依赖。这不会影响构建,但是一些工具(例如M2Eclipse依赖关系图或依赖项报告)将不再起作用。
有没有好的方法来诊断存在哪些循环依赖,并且有没有简单的方法来摆脱它们?
更新:问题出在POM文件上,例如batik-bridge依赖于batik-gvt,而后者又依赖于batik-bridge
我认为我可以通过手动排除某些依赖项来解决这个问题,但我不确定要排除什么。我想要的是清晰地了解图表中的循环依赖情况。

如果您能提供有问题的POM文件,我相信m2eclipse和Maven开发人员会提供解决方案。 - Robert Munteanu
1
@Robert 我认为问题出在Batik的JAR文件中,而不是POM文件中。 - Pascal Thivent
1
我会试一下,也许他们可以提供更好的错误报告。现在对于m2eclipse,你需要查看Eclipse错误日志才能找出它为什么不起作用。而依赖插件则会一直挂起数小时。 - Lóránt Pintér
3个回答

6

尝试在您项目的根目录下从命令行运行以下命令:

mvn dependency:tree

4
我不确定这是否与Maven有关(在Maven中,模块之间不能存在循环依赖),但也许我没有理解清楚。话虽如此,您可以使用JDepend来分析代码并查找循环依赖(请参见解释依赖循环)。如果您喜欢在Eclipse中使用JDepend,则可以使用JDepend4Eclipse插件。

子版本库检查Batik,运行JDepend并查看是否找到问题(我猜你会找到)。但是,说实话,那只是简单的部分。消除循环依赖是另一回事,可能并不容易。这可能涉及任务,例如将类从一个包移动到另一个包,重新打包模块,了解Batik的构建方式(请注意,其Ant构建脚本有2220行),等等。换句话说,在最初只想要使用的库上需要进行一些艰苦的工作(除非您贡献这些更改,否则您可能需要在以后的版本中再次应用它们)。我的建议:在开始深入研究之前,请三思而后行。

仅供您参考,还有一个jdepend-maven-plugin,仅在您想要在项目(即代码)上运行JDepend时才有用,这不是您的要求。


2
尝试使用UCDetector,它可以在开发过程中找到类级别的依赖循环。另一个有用的工具是Tattletale
它会提供报告,帮助您:
- 识别JAR文件之间的依赖关系 - 找到类路径中缺失的类 - 查看类是否位于多个JAR文件中 - 查看同一JAR文件是否位于多个位置 - 列出每个JAR文件需要和提供的内容 - 验证类的SerialVersionUID - 找到版本号不同的相似JAR文件 - 找到没有版本号的JAR文件 - 在JAR文件中定位类 - 获取项目的OSGi状态 - 删除黑名单API使用
我故意跳过了Maven解决方案,以免重复其他回答。

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