【问题标题】:override library version defined in parent pom覆盖父 pom 中定义的库版本
【发布时间】:2012-10-25 17:43:59
【问题描述】:

我在父 pom 中为库 A 定义了 4.3 版本,但在子 pom 指定的项目模块中,需要 A 的 2.5 版本。我面临的问题是两个版本都被保留,因此我遇到了冲突。

请告知如何解决问题。

【问题讨论】:

  • 您自己的代码或某些插件或依赖项是否需要版本 2.5?
  • 依赖和代码。
  • 我遇到了同样的问题。仍然没有管理如何覆盖父母依赖版本。被提示到 和 bom。但还没有为我工作。这个帖子和我的问题stackoverflow.com/questions/56382459/…类似

标签: maven pom.xml


【解决方案1】:

http://maven.apache.org/guides/introduction/introduction-to-dependency-mechanism.html

依赖中介——这决定了当遇到工件的多个版本时将使用哪个版本的依赖。目前,Maven 2.0 仅支持使用“最近定义”,这意味着它将使用依赖树中与您的项目最接近的依赖版本。您始终可以通过在项目的 POM 中明确声明来保证版本。请注意,如果两个依赖版本在依赖树中的深度相同,则在 Maven 2.0.8 之前没有定义哪个会获胜,但从 Maven 2.0.9 开始,声明中的顺序很重要:第一个声明获胜。

  • “最近定义”表示使用的版本将是依赖关系树中与您的项目最接近的版本,例如。如果 A、B 和 C 的依赖项定义为 A -> B -> C -> D 2.0 和 A -> E -> D 1.0,则在构建 A 时将使用 D 1.0,因为从 A 到 D 的路径通过E 更短。您可以在 A 中显式添加对 D 2.0 的依赖项以强制使用 D 2.0

听起来 A 版本 2.5 被另一个依赖项传递包含。这使得 4.3 版和 2.5 版的长度相同。

  • 项目 -> 父级 -> A 4.3
  • 项目 -> 依赖项 -> A 2.5

通过在您的项目中明确定义 A 2.5 的依赖关系,它将是最接近的并覆盖任何其他版本。

【讨论】:

  • 在我的情况下,似乎父级优先于显式依赖。这是针对 AWS 依赖项的。
【解决方案2】:

一般来说,建议在给定时间在您的类路径中只有一个版本的依赖项。这样做可以让您确切知道在运行时将使用哪个版本的类。

为避免版本冲突,请尝试像这样指定您的依赖项:

<dependency>
    <groupId>commons-daemon</groupId>
    <artifactId>commons-daemon</artifactId>
    <version>1.0.1</version>
    <exclusions>
        <exclusion>
            <groupId>some_group</groupId>
            <artifactId>some_artifact</artifactId>
        </exclusion>
    </exclusions>
</dependency>

您需要在哪里指定与版本 2.5 冲突的工件的 groupId 和 artifactId。

【讨论】:

  • 这没有回答问题。
  • 这是部分答案,它只解决如何从父依赖中排除依赖,不包括如何将新版本包含到子依赖中。
猜你喜欢
  • 1970-01-01
  • 2020-08-28
  • 2023-03-10
  • 2019-07-24
  • 1970-01-01
  • 2017-02-22
  • 2018-03-05
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多