您可以使用 Maven 依赖项插件的树
目标来显示项目中的所有传递依赖项,并查找“因冲突而省略”的依赖项。1 个
mvn dependency:tree -Dverbose
mvn dependency:tree -Dverbose | grep 'omitted for conflict'
一旦知道哪个依赖项存在版本冲突,就可以使用该参数仅显示导致该依赖项的依赖项,以查看特定依赖项是如何被拉入的。例如,一个项目,其中不同版本的 C 由 A 和 B 拉入:includes
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)
若要实际解决冲突,在某些情况下,可能会找到两个主要依赖项都将使用的可传递依赖项版本。将可传递依赖项添加到 pom 的部分,并尝试更改版本,直到一个版本正常工作。dependencyManagement
但是,在其他情况下,可能无法找到适合所有人的依赖项版本。在这些情况下,您可能必须后退一步执行其中一个主要依赖项的版本,以使其使用适用于所有人的可传递依赖项版本。例如,在上面的示例中,A 0.1 使用 C 1.0,B 0.2 使用 C 2.0。假设 C 1.0 和 2.0 完全不兼容。但也许你的项目可以使用B 0.1来代替,这恰好依赖于C 1.5,它与C 1.0兼容。
当然,这两种策略并不总是有效,但我以前已经找到了成功。其他更激烈的选项包括打包您自己的依赖项版本以修复不兼容性,或者尝试在单独的类装入器中隔离这两个依赖项。