覆盖在父级POM中定义的库版本

27

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

请建议如何解决这个问题。


你的代码或某个插件或依赖项需要2.5版本吗? - Andrew Logvinov
通过一个依赖项和代码。 - Rndm
1
我遇到了同样的问题。仍然没有找到如何覆盖父级依赖版本的方法。有人向我提示了<dependencymanagement>和bom。但是这些对我还没有起作用。这篇帖子与我的问题类似https://dev59.com/tbTma4cB1Zd3GeqP2jPu - Laguh
2个回答

11

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

依赖关系解析(Dependency mediation) - 当遇到多个版本的工件时,决定使用哪个版本的依赖关系。目前,Maven 2.0只支持使用“最近的定义(nearest definition)”方式,这意味着它将使用最靠近项目依赖树中的依赖关系的版本。您可以通过在项目的POM文件中显式声明来保证版本的一致性。请注意,如果两个依赖版本在依赖树中处于同一深度,则在Maven 2.0.8之前并未定义谁胜出,但自Maven 2.0.9以来,这取决于声明的顺序:第一个声明胜出。

  • “最近的定义”(nearest definition)表示将使用在依赖树中最靠近您的项目的那个版本,例如,如果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的依赖关系,它将成为最近的依赖关系,并覆盖任何其他版本。


2
在我的情况下,似乎父级依赖项优先于显式依赖项。这是针对AWS依赖项的。 - Sridhar Sarnobat

6

一般建议在classpath中同一时间只有一个依赖项版本。这样做可以确保您知道将在运行时使用哪个类的版本。

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

<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处进行设置。


5
这并没有回答这个问题。 - Flaom
5
这是部分答案,只解决如何从父级中排除依赖项,并不包括如何将新版本包含到子依赖项中。 - Appesh

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接