是否可以覆盖子POM中的依赖项版本?

时间:2014-07-29 15:32:16

标签: java maven

我正在与Maven合作管理我的项目的依赖项。我有我的父POM,我正在使用依赖管理来避免在每个项目中编写公共依赖项。

现在,我需要在我的孩子POM中更改一个依赖项的版本。

我有我的父母POM

<dependencyManagement>
    <dependency>
        <groupId>commons-lang</groupId>
        <artifactId>commons-lang</artifactId>
        <version>2.1</version>
    </dependency>
</dependencyManagement>

我的孩子POM引用了父POM

<parent>
    <groupId>com.myproject</groupId>
    <artifactId>root-parent-pom</artifactId>
    <version>1.1.0.22</version>
    <relativePath>../parent/pom.xml</relativePath>
 </parent>

在这个子POM中,我想覆盖我在父POM中编写的相同依赖项的版本,就像这样。

<dependency>
    <dependency>
        <groupId>commons-lang</groupId>
        <artifactId>commons-lang</artifactId>
        <version>2.6</version>
    </dependency>
</dependency>

我这样做了,但是当我生成我的项目时,在这种情况下是一个WAR,我项目中包含的依赖项的最终版本是父POM中描述的版本。

是否可以覆盖子POM中的版本?

2 个答案:

答案 0 :(得分:3)

也许。如果您指定了不同的版本,则此版本将覆盖dependencyManagement元素中的版本。

但仅适用于这个单一的POM。它不会神奇地分配到reactor build 中的下一个POM,除非下一个POM将此POM作为父级。所以如果你有这个设置:

parent
- mod1
- mod2
- war

并且您将其放入mod1,然后war将不会注意到war使用parent作为父POM。依赖项mod1表示“请使用2.6”,但这与使用2.1的任何其他pom相同 - 没有理由更喜欢使用dependencyManagement。这就是mvn help:effective-pom的力量:你可以在一个地方控制所有传递依赖的版本。

尝试使用{{1}}来查看Maven将在构建的每个部分中使用的内容。

要使WAR选择覆盖版本,您需要在WAR的父POM或WAR的POM本身中指定它。

通常的解决方案是为所有设置默认版本(2.1)的项目设置父POM。然后,每个项目都有一个父POM,它继承自全局父POM。在这里,您可以将版本设置为2.6。由于项目的所有模块都继承自它,因此每个项目的父POM优先。

答案 1 :(得分:0)

您需要在war项目中定义该依赖项。