【问题标题】:Maven resolves wrong dependency versionMaven 解决错误的依赖版本
【发布时间】:2018-11-29 11:08:52
【问题描述】:

我们的 warfile 不包含 jarfile 的预期 SNAPSHOT-Version,它包含通过另一个依赖项的较旧版本。

简化依赖:树

war-x.x.x-SNAPSHOT
\- jar1-x.x.x-SNAPSHOT
   +- jar2-x.x.x
   |  +- problemjar-x.x.x
   +- jar3-x.x.x-SNAPSHOT

jar3-xxx-SNAPSHOT 有一个依赖“problemjar-xxy-SNAPSHOT”(较新版本),但 war 项目构建(和依赖:树)包含来自“jar2-xxx”的“problemjar-xxx”。

目前,我们为“jar2-x.x.x”“排除”“problemjar-x.x.x”。

但很高兴知道这种行为的原因,恕我直言,排除只是一种解决方法。

注意事项:

  • “jar3-x.x.x-SNAPSHOT”中的依赖项“problemjar-x.x.y-SNAPSHOT”“提供”。
  • Maven 版本为 3.2.5
  • 上面简化的dependency:tree中的levels是正确的,所以旧版本的路径不会比新SNAPSHOT版本的路径短

编辑:项目结构

war 和 jar1 是一个父 pom 的子项,简化的依赖项:tree 来自 war 项目,其中 jar1 项目作为依赖项。其他是正常/外部依赖项,从 war 项目中可以看出,它也适用于 jar1。

【问题讨论】:

  • WAR 的那些依赖是在同一个构建(多模块)中构建还是来自其他构建?
  • 对不起,注释错误,没有父子关系,war 和 jar1 在同一级别(multimodule 的子级)。其余的都是“正常”的外部依赖。
  • 它们是否来自同一级别并不重要。重要的是如果正确引用它们是否在同一个反应器内(多模块构建),这仅在你做事时才会发生错了……

标签: maven maven-3 maven-dependency


【解决方案1】:

Maven从依赖树中获取最新版本。

它采用最接近的版本,在您的情况下,这是它遇到的第一个版本。

如果要强制 Maven 采用特定版本,最好使用 <dependencyManagement> 而不是排除项。

【讨论】:

  • 我不这么认为,或者你能指点我相应的原始详细文档吗?想象一下,对于一个具有 X 外部依赖项的简单模块,该模块使用另一个外部依赖项的各种版本,您必须编写多少“排除项”(或“正确的依赖项顺序”)。
  • 在我们公司,我们大量使用依赖管理,因为 Maven 正确地确定了 groupId/artifactId,但是在版本方面信任 Maven 是有问题的(至少在大型项目中)。
  • 感谢调解提示,问题已回答
【解决方案2】:

确保以下几点:

1) 每个子模块都应该从它的父模块获取它的版本,即没有<version> 标签,只有一个包含版本的<parent> 标签。

2) 当您从同一个项目中调用依赖项时,请始终执行以下操作:

<version>${project.version}</version>

【讨论】:

  • 对不起,注释错误,没有父子关系,war 和 jar1 在同一级别(multimodule 的子级)。其余的都是“正常”的外部依赖。
猜你喜欢
  • 1970-01-01
  • 2017-07-06
  • 2021-09-28
  • 2013-03-15
  • 2019-07-23
  • 2020-04-17
  • 2013-07-08
  • 1970-01-01
  • 2016-09-18
相关资源
最近更新 更多