Java 项目依赖冲突检测和处理方法

巧用 IDEA 的工程配置文件检查依赖包的版本

有时我们需要检测项目中依赖的 jar 包的版本是否符合要求, 比如之前 fastjson 出现重大漏洞, 公司要求升级到 1.2.29.

还有一种更常见的情形, 我们一个 Java Maven 项目通常会有多个模块, 现在要求检查某些常见的依赖包, 比如 slf4j, jackson 等在各个模块中的版本是否一致.

由于存在传递依赖的情形, 只看 pom.xml 文件, 肯定是不够的, 这时你可能会想到使用 mvn dependency:tree 命令检查, 如下所示

mvn dependency:tree -Dverbose -Dincludes=org.slf4j

这个方法的好处是准确, 信息详细, 不过比较耗时. 这里介绍一种快速的方法, 巧用 IDEA 的工程配置文件 *.iml.

这些文件记录了对应模块/项目的所有依赖包的版本, 包括传递依赖, 因此我们简单 grep 一下就可以检查啦!

fastjson

grep fastjson **/*.iml | grep -v 1.2.29

slf4j

grep slf4j **/*.iml | grep -v '1.7.12'
grep slf4j-log4j12 **/*.iml

jackson

grep com.fasterxml.jackson **/*.iml | grep -v '2.9.3'

注意, 当项目是在 IDEA 中打开的状态, iml 不一定及时更新, 建议刷新 Maven 项目依赖, 关闭项目以后, 再使用上面的 grep 命令.

使用 Maven Helper 插件

安装完 Maven Helper 插件以后, 当打开 pom.xml 文件时, 下方会出现 Dependency Analyzer 选项卡, 如下图所示.

可以看出, xml-apis 存在冲突, 发生冲突的依赖路径是 stanford-corenlp, xom, xalan.

如果你对这样的依赖路径查看不是很直观, 还可以使用 IDEA 自带的查看依赖 (Show Dependencies), 效果如下图所示.

参考文献