【问题标题】:How two know when a maven project has the same transitive dependenciy twice of different versions?两个如何知道一个 Maven 项目何时具有两次不同版本的相同传递依赖?
【发布时间】:2015-11-26 23:06:39
【问题描述】:

我必须向 maven 项目添加一个新的依赖项。这个依赖有四个传递依赖(根据http://mvnrepository.com/),它们之间有spring-data-jpa jar。

我正在工作的 maven 项目在 pom 中配置了许多依赖项,因此我知道项目中可能已经存在 spring-data-jpa 依赖项(可传递或不传递)的可能性很大。

  1. 当你在一个有很多依赖的大型项目中工作并且你必须添加一个新的时,如何检查是否已经存在不同版本的相同传递依赖?我必须手动检查每个配置的直接依赖项的传递依赖项吗? maven 对这种情况有警告吗?

  2. maven 在这种情况下如何工作?我的意思是,可能有两个不同版本的 spring-data-jpa jars(这将是一个问题)或 maven 以另一种方式解决这个问题?

【问题讨论】:

    标签: maven


    【解决方案1】:

    简单的答案是依赖插件可以告诉你。更长的答案是,关于传递依赖管理有许多不同的情况需要考虑,插件如何提供帮助以及如何处理它因每种情况而异。

    如果两个依赖项具有相同的坐标(groupId、artifactId)但版本不同,Maven 会自动选择要包含的依赖项。从广义上讲,它选择树中最高的版本 - 有效地覆盖下游传递依赖项 pom 中定义的依赖项。因此,如果您有两个完全相同的依赖项的不同版本,那么您仍然只能在相关类路径上找到一个版本的依赖项。

    依赖插件可以通过突出显示它做出决定的点来帮助您识别这种情况,但是您可能希望使用顶级 pom 的 dependencyManagement 部分来确保您的依赖带来的是你所期望的。

    当依赖项更改其 groupId 或 artifactId 时,可能会出现单独的困难。然后,您可以在类路径上获得两个依赖项 - 一个在旧坐标上具有旧版本,另一个在新坐标上具有新版本。例如,Spring、Hibernate 和 Apache commons 都发现自己在某个时候这样做了。在这种情况下,您所能做的就是使用依赖插件来识别重复的依赖项,然后使用 exclusions 标签将它们作为传递依赖项显式排除在拉入它们的依赖项中。

    请务必注意,所有这些依赖项管理都可能导致意外损坏。如果您的应用程序所依赖的东西确实依赖于包的某个特定版本作为传递依赖,那么您可以通过覆盖该版本来破坏它。因此,测试您使用的功能至关重要。

    【讨论】:

    • 好的,谢谢,虽然当 maven 选择具有最高版本的工件时可能会发生一种情况,如果旧工件中的一种方法已被弃用并且在您的代码中被调用,则选择 maven这个神器的最高版本,这个方法不能存在,但是你会得到一个即时的编译错误,所以很容易看到这种情况
    【解决方案2】:

    你试过Maven Dependency Plugin吗?您可以运行一些有用的目标,例如mvn dependency:tree 等。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-01-24
      • 2014-11-17
      • 2020-02-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-02-13
      • 1970-01-01
      相关资源
      最近更新 更多