【问题标题】:how does maven determine the version of transitive dependencies?maven如何确定传递依赖的版本?
【发布时间】:2020-06-24 01:00:26
【问题描述】:

我正在使用 maven 构建一个 java 项目,我注意到其中一个子项目包含 jsonwebtoken 0.7.0。

https://github.com/WebGoat/WebGoat/blob/develop/webgoat-lessons/challenge/pom.xml

然后从maven repo (https://repo1.maven.org/maven2/io/jsonwebtoken/jjwt/0.7.0/jjwt-0.7.0.pom),jsonwebtoken 0.7.0 有一个jackson-databind v2.8.2的依赖;

但是,当我从 maven 调试日志中跟踪时,jackson-databind v2.10 实际上是由 maven 拉取的。

我知道如果组件版本没有在 POM 中明确定义,maven 会默认为最新,但是,在上述情况下,为什么 maven 仍然选择将版本覆盖为最新?

谢谢!

【问题讨论】:

标签: java maven pom.xml


【解决方案1】:

如果在多个地方添加了一个依赖项,Maven 会采用那个:

  • 在层次结构中更接近您的 pom.xml(传递依赖与传递依赖的传递依赖)
  • 如果深度相同 - 它采用第一次出现。

为了保证采用哪个版本,您需要在<dependencyManagement> 部分中声明它。这会覆盖传递依赖项中声明的任何内容。

如果组件版本没有在 POM 中明确定义,ma​​ven 将默认为最新

不,您不能在没有明确版本的情况下定义依赖项。虽然 Maven 支持范围,但它们被认为是不好的做法,因为这会导致不可重复的构建。

【讨论】:

    【解决方案2】:

    我猜你在某个地方有一个需要 jackson-databind 2.10 的依赖项。高版本强制maven覆盖jsonwebtoken所需的jackson-databind 2.8.2。

    但是,如果您在另一个版本的项目中显式包含 jackson-databind,则该版本会覆盖传递依赖项中的版本。

    如果你使用eclipse,可以勾选“Dependency Hierarchy”。例如,如果您明确包含 jackson-databind:

    .. 如果你有两个依赖项,它们都包含具有不同版本的传递依赖项(在这种情况下 spring-aop:spring-boot-starter-security 想要 5.0.4.RELEASE,但由于需要“更新”到 spring-boot-starter-weg 到 5.1.5.RELEASE):

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-12-22
      • 1970-01-01
      • 1970-01-01
      • 2017-05-22
      • 2015-04-03
      • 1970-01-01
      相关资源
      最近更新 更多