如何在maven多项目中找到不必要的依赖项?

时间:2010-03-31 15:27:00

标签: maven-2 dependencies module modularity

如果您正在开发一个大型的不断发展的多模块maven项目,似乎不可避免地会在poms中给出一些不必要的依赖关系,因为它们被其他依赖项传递包含在内。例如,如果你有一个最初包含C的模块A,就会发生这种情况。稍后你重构并让A依赖于模块B,而模块B又取决于C.如果你不够小心,你最终会同时使用B和C A的依赖列表。但是当然你不需要将C放入A的pom中,因为无论如何它都是可传递的。是否有工具可以找到这种不必要的依赖项?

(这些依赖关系实际上并没有受到伤害,但是它们可能会模糊你的实际模块结构,并且pom中的东西通常更好。: - )

3 个答案:

答案 0 :(得分:12)

在某种程度上,您可以使用dependency:analyze,但它并没有太大帮助。另请查看JBoss Tattletale

前段时间我已经开始maven-storyteller-plugin能够更深入地分析poms,但该项目远离生产/公共使用。您可以使用storyteller:recount目标来分析未使用/冗余的依赖关系。

整个故事的问题是 - 如何确定“未使用”的东西。有可能分析的是例如类引用。但如果您使用反射 - 直接或非直接使用反射,它将无效。

2014年11月更新。

我刚刚moved my old code of the Storyteller plugin to GitHub。我会刷新它并释放到中央,以便它可以用于其他人。

答案 1 :(得分:2)

personaly使用M2Eclipse的pom编辑器直观地查看依赖树(2D树)。然后我看一下我的可交付(war,ear)lib目录。然后仍然在M2Eclipse pom依赖项查看器中,我去每个第三方,并右键单击我想要排除的依赖项(在正确的依赖项中自动添加排除项)。

没有黄金法则,只是一些基本提示:

很多pom都不正确:很多第三方库在默认编译范围内需要太多的依赖,如果每个人都仔细制作他们的pom,你就不必有太多不需要的依赖。

您需要通过依赖项的名称来猜测您必须排除的内容,最好的示例是解析器,转换器,documentbuilder:xalan,xerces,xalan alfred和co。尝试删除它们并使用内部的jdk1.6解析器,常见的apache东西,log4j也值得一看。

如果你没有不同版本的重复库(maven的依赖解析器应该避免这种情况),那么

还要定期查看lib交付

自下而上,从你的常用模块开始,然后上升到服务层,减少每个模块中的依赖关系,不要尝试启动模块ear / war,这将太难了

经常检查您的可交付成果是否仍然有效,通过测试或比较旧的可交付成果(特别是在web-inf / lib目录中,winmerge / beyoncompare已经消失了)

答案 2 :(得分:1)

当你有 A - > B,B - > C ,然后重构,使 A - > (B,C) IF A 仍然会针对 B 进行编译,您非常不想简单地选择依赖,因为你可以传递它。

想想 A - >的情况(B-1.0,C-1.0),B-1.0 - > C-1.0 即可。所有内容都是同步的,因此要避免“重复”,请从 A 的依赖项中删除 C 。然后升级A以使用 B-2.0 - > C-2.0 即可。您开始看到错误,因为 A 需要 C-1.0 类但找到 C-2.0 类。虽然在这种情况下可以快速协调,但是当你有很多依赖时,它就不那么容易了。

您非常希望 A 的pom中的信息表明它明确希望在类路径中找到 C-1.0 ,以便您可以了解何时拥有传递依赖冲突。同样,Maven将完成确保任何特定jar的“最接近”版本最终在您的类路径上的工作。但是当出现问题时 - 你想要获得所有依赖元数据。

稍微更实际的一点是,当你可以从你的pom中删除它并且你的所有单元/集成/验收测试仍然通过时,依赖关系是未使用的。 ; - )

相关问题