我正在与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中的版本?
答案 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项目中定义该依赖项。