您可以使用 Maven 依赖插件的tree
目标来显示项目中的所有传递依赖项,并查找“因冲突而忽略”的依赖项。1
mvn dependency:tree -Dverbose
mvn dependency:tree -Dverbose | grep 'omitted for conflict'
一旦您知道哪个依赖项有版本冲突,您可以使用该includes
参数仅显示导致该依赖项的依赖项,以查看特定依赖项是如何被拉入的。例如,一个项目,其中不同版本的 C 被 A 拉入,并且乙:
mvn dependency:tree -Dverbose -Dincludes=project-c
[INFO] com.my-company:my-project:jar:1.0-SNAPSHOT
[INFO] +- project-a:project-a:jar:0.1:compile
[INFO] | \- project-c:project-c:jar:1.0:compile
[INFO] \- project-b:project-b:jar:0.2:compile
[INFO] \- project-x:project-x:jar:0.1:compile
[INFO] \- (project-c:project-c:jar:2.0:compile - omitted for conflict)
要真正解决冲突,在某些情况下,可能会找到两个主要依赖项都可以使用的传递依赖项的版本。将传递依赖项添加到dependencyManagement
您的 pom 部分并尝试更改版本,直到一个工作。
但是,在其他情况下,可能无法找到适用于所有人的依赖项版本。在这些情况下,您可能必须退回主要依赖项之一的版本,以使其使用适用于所有人的传递依赖项的版本。例如,在上面的示例中,A 0.1 使用 C 1.0,B 0.2 使用 C 2.0。假设 C 1.0 和 2.0 完全不兼容。但也许您的项目可以改用 B 0.1,它恰好依赖于与 C 1.0 兼容的 C 1.5。
当然,这两种策略并不总是奏效,但我之前已经找到了成功。其他更激进的选择包括打包您自己版本的依赖项以修复不兼容性,或者尝试将两个依赖项隔离在单独的类加载器中。