Maven拉了一个旧版本的传递依赖

Sto*_*oud 1 java maven

我已经编写了一个依赖于Guava 20.0版(与JDK 1.7兼容的最新版本)的库。

然后,我编写了一个使用该库以及uk.org.lidalia:slf4j-test:1.2.0(具有测试范围)的应用程序。slf4j-test依赖于Guava版本14.0.1。

我的问题是我的应用程序将Guava的两个不同版本视为传递依赖项,并选择了较旧的版本。现在,当我在库中调用某些方法时,出现“类或方法未找到”异常。

我可以(并且已经)将Guava排除为slf4j-test的依赖项,从而暂时解决了该问题,但是如果我引入另一个使用Guava的依赖项,则该问题将返回。

所以我的问题是:为什么Maven会选择较旧版本的依赖项,以及如何始终使它选择最新版本。

JF *_*ier 5

您不能强迫Maven始终选择最新版本。但是您可以执行以下几项操作:

  1. 如果您在自己的pom中声明依赖项,则此版本将始终获胜。因此,如果您在pom中对番石榴20.0有依赖性,那么您将得到完全的理解。

  2. 如果不合适,可以将一个条目放入dependencyManagement中,该条目设置番石榴的版本。这将覆盖所有传递设置的版本(例如您示例中的14.0.1)。

  3. Maven强制实施器插件有一个规则,可确保将所有依赖项评估为最新版本-但它不会选择该最新版本,只有在未选择该版本的情况下,它才会使构建失败。然后,您需要自己应用上述方法(1)或(2)进行选择。

  • @liamxu Maven 在依赖树中选择最近的版本,它可能是也可能不是最新版本。 (2认同)