2010-07-06 206 views
2

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

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

感谢, 杰夫

回答

3

(...)不幸的是不同的版本在这些文件中的,所以我看到的运行时错误,这取决于它们加载的顺序之类的。

从理论上讲,xml-apis.jarxmlParserAPIs.jar(从Xerces2的-j)是相同的JAR,但名称不同,xmlParserAPIs.jar被废弃了多年(见this messagethis one)。

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

如果他们可以使用兼容版本,请使用相关exclusion代替xmlParserAPIs.jar以仅使用xml-api.jar

我不知道它是如何在处理问题上有所作为,但这只发生在测试中,因为其中一个依赖关系在测试范围内。

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

+0

谢谢。它看起来像我在其他两个库中的XML库冲突。如果我从瓶子中排除xmlParserAPI和xml-apis,并让jre提供这些,那么一切运作良好。这是不安全的事情吗?我应该为java.xml.parsers添加一个系统范围的依赖关系吗?谢谢。 – 2010-07-06 21:43:24

+0

@Jeff 1.使用'mvn dependency:tree'来分析你的依赖关系。 2.如果它适用于JRE的解析器,那么就排除依赖关系。 3.我倾向于避免“系统”范围内的依赖关系(比我认为的更多麻烦而不是好处)。 – 2010-07-06 21:54:46

+0

感谢您的帮助。 – 2010-07-06 23:51:09