maven依赖冲突

Posted

技术标签:

【中文标题】maven依赖冲突【英文标题】:maven dependency *** 【发布时间】:2011-03-12 12:55:09 【问题描述】:

在我的项目中,有2个库,每个库都依赖于XML解析类java.xml.parsers.DocumentBuilderFactory。这些库中的每一个都从不同的 jar 中引用文件(一个从名为 xmlParserAPIs 的 jar 中获取它,而另一个从 xml-apis-1.0.b2.jar 中获取它)。不幸的是,每个文件中都有不同版本的类,所以我看到运行时错误,具体取决于它们的加载顺序。这两个 xml jar 都是 3rd 方库的传递依赖项。有没有好的方法来处理这种冲突?

编辑:我不确定它是否会对如何处理问题产生影响,但这只会发生在测试中,因为其中一个依赖项在测试范围内。

谢谢, 杰夫

【问题讨论】:

【参考方案1】:

(...) 不幸的是,每个文件中都有不同版本的类,所以我看到运行时错误,具体取决于它们的加载顺序。

理论上,xml-apis.jarxmlParserAPIs.jar(来自 xerces2-j)是相同的 JAR,但名称不同,xmlParserAPIs.jar 已被弃用多年(请参阅 this message 和 @987654322 @)。

如果您的依赖项依赖于不同且不兼容的xml-apis.jar 版本,我会说这些依赖项是互斥的,换句话说,至少对于您正在使用的版本是不兼容的。唯一的解决方案是找到具有收敛依赖关系的版本。

如果他们可以使用兼容版本,请使用 exclusion 的依赖项,以便 xmlParserAPIs.jar 仅使用 xml-api.jar

我不确定它是否会对如何处理问题产生影响,但这只会发生在测试中,因为其中一个依赖项在测试范围内。

不,这只是解释了为什么您在运行时没有遇到问题(因为 test 作用域不在类路径上,而且显然不会冲突)。

【讨论】:

谢谢。看起来我与其他 2 个库中的 xml 库有冲突。如果我从 jars 中排除 xmlParserAPIs 和 xml-apis 并让 jre 提供它们,那么一切正常。这是不安全的事情吗?我应该为 java.xml.parsers 添加系统范围的依赖项吗?谢谢。 @Jeff 1. 使用mvn dependency:tree 分析您的依赖关系。 2. 如果它与 JRE 的解析器一起工作,那么只需排除依赖项。 3. 我倾向于避免system 范围依赖(在我看来,麻烦大于好处)。

以上是关于maven依赖冲突的主要内容,如果未能解决你的问题,请参考以下文章

Maven01_05_compile和test依赖范围Maven的一些依赖情况依赖冲突如果出现冲突就会采取就近原则可选依赖(optional)排除依赖(exclusions)

如何快速的解决Maven依赖冲突

Maven依赖jar包版本冲突解决方案

maven依赖管理(依赖配置依赖传递依赖冲突依赖范围)

如何删除maven中冲突的jar包

Maven依赖冲突