24

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

请告知如何解决该问题。

4

2 回答 2

8

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 的依赖关系,它将成为最接近的并覆盖任何其他版本。

于 2012-10-25T23:19:18.003 回答
6

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

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

<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 版冲突的工件的groupIdartifactId

于 2012-10-25T17:59:02.487 回答