【发布时间】:2016-12-17 18:13:45
【问题描述】:
问题描述
我们有一个 Maven 聚合器 pom,其中一些子 pom(模块)都具有相同的版本:
pom.xml (parent zoo, version 2.0.0)
|-- pom.xml (child module cat, version 2.0.0)
|-- pom.xml (child module dog, version 2.0.0)
|-- ...
在依赖项管理部分中,所有子项都使用项目版本声明,以简化依赖项的声明。 父pom看起来像
<groupId>com.acme</groupId>
<artifactId>zoo</artifactId>
<version>2.0.0</version>
<packaging>pom</packaging>
<modules>
<module>cat</module>
<module>dog</module>
</modules>
<dependencyManagement>
<dependencies>
<dependency>
<groupId>com.acme</groupId>
<artifactId>cat</artifactId>
<version>${project.version}</version>
</dependency>
<!-- other child modules go here -->
</dependencies>
</dependencyManagement>
子 pom 被定义为
<parent>
<groupId>com.acme</groupId>
<artifactId>zoo</artifactId>
<version>2.0.0</version>
</parent>
<groupId>com.acme</groupId>
<artifactId>cat</artifactId>
<dependencies>
<dependency>
<groupId>com.acme</groupId>
<artifactId>dog</artifactId>
</dependency>
</dependencies>
还有另一个 pom 也将父 pom 声明为其父 pom(继承),但未在此父 pom 中列为子模块(无聚合)。这个 pom 有不同的版本。
<parent>
<groupId>com.acme</groupId>
<artifactId>zoo</artifactId>
<version>2.0.0</version>
</parent>
<groupId>com.acme</groupId>
<artifactId>boo</artifactId>
<version>1.0.0</version>
<dependencies>
<dependency>
<groupId>com.acme</groupId>
<artifactId>dog</artifactId>
</dependency>
</dependencies>
其实我们已经预料到依赖com.acme.dog的版本是从父pomcom.acme.zoo的依赖管理部分拉出来的,等于2.0.0。但是Maven documentation on project interpolation and variables 说
需要注意的一个因素是,这些变量是在继承后处理的,如上所述。这意味着如果父项目使用一个变量,那么它在子项目中的定义,而不是父项目,将是最终使用的变量。
即:在反应堆构建中,父 pom com.acme.zoo 的依赖管理部分中使用的变量 ${project.version} 相对于 com.acme.bar 进行评估,并且等于 1.0.0 与预期不符。
注意
有一种在父 pom 中使用变量的解决方法,该变量必须与父 pom 版本保持同步。但是,此解决方案与Maven Release Plugin 不兼容。
问题
我们怎样才能实现期望的行为
- 具有相同版本的孩子的聚合器 pom
- 在依赖项管理部分声明子项,以确保所有依赖项具有相同的版本
- 继承与不同版本一起使用
- 与
maven-release-plugin的兼容性
没有项目插值变量的陷阱?
【问题讨论】:
标签: maven pom.xml versioning parent-pom