我有一个模块 X,它依赖于第三方库,而第三方库又依赖于 apache-commons-collections 2.1。
在模块 X 中,我想使用最新的 apache-commons-collections 3.0,它比 2.1 有一些额外的方法。如果我将依赖项添加到 3.0,我猜这会产生问题,因为类加载器只会选择它在类路径中看到的第一个类。有没有解决这个问题的好方法?
谢谢,
恕我直言,如果没有额外的模块化解决方案(如 Java EE 的 EAR 或 OSGi),就没有真正好的方法。但是,我想您只是在询问直接使用此 3rd 方库的简单网络(或不)模块。恐怕您必须手动解决此冲突。事实上,Maven 不会提供 2 个版本commons-collections
并依赖于类加载器的解析,而是解析依赖关系图并选择它认为它更好地考虑您的 POM 声明的版本。这意味着,如果您在模块 X 中声明对版本 3.0 的依赖commons-collections
,则将使用该版本,因为此声明比某些 3rd 方库的依赖项更重要。
这是 Java 平台本身的一个严重问题,引发了诸如著名的 JAR 地狱之类的问题。不幸的是,选择和声明commons-collections
满足您和您的第 3 方库的版本是您的问题。
只需将 3.0 的依赖项添加到您的项目中,它就会比旧版本的 2.1 更喜欢它。明确地说,您可以添加排除项。在任何情况下,使用依赖插件以及分析和树目标来查看发生了什么。
长话短说……这种情况一直都在发生并且会很好,无论如何你都可以控制发生的事情。