覆盖父pom中定义的库版本

Rnd*_*ndm 20 pom.xml maven

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

请告知如何解决问题.

And*_*nov 8

通常,建议在给定时间在类路径中只有一个版本的依赖项.以这种方式执行将允许您准确了解将在运行时使用的类的哪个版本.

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

<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>
Run Code Online (Sandbox Code Playgroud)

您需要在2.5版本中指定groupIdartifactId冲突工件的位置.

  • 这并不能回答问题。 (5认同)
  • 这是部分答案,它只解决如何从父级依赖项中排除依赖项,不包括如何将新版本包含到子级依赖项中。 (5认同)

小智 7

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

听起来像版本2.5由另一个依赖项传递.这使版本4.3和2.5的长度相同.

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

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

  • 在我的情况下,父级似乎优先于显式依赖。这是针对 AWS 依赖项的。 (2认同)