我不知道我是否遗漏了某些内容,但我对Maven的Codehaus versions plugin有疑问。这是我的情况的简化:
'root'是聚合器POM,即将moduleA和moduleB声明为子模块,A和B都将root作为 parent 。
A和B都依赖于 project-C ,但此依赖关系的版本是在属性中定义的 - 说{ {1}} - 没有硬编码。此属性在 root 中定义,因此A和B都继承了project-C的相同版本值。
在根POM中:
<project-C.version>
在模块A和B中(记住 root 是父级):
<properties>
<project-C.version>1.0</project-C.version>
现在,说项目C的更新版本1.1-SNAPSHOT可用。我想使用版本插件向我展示,所以我运行:
<dependency>
<groupId>com.blah</groupId>
<artifactId>project-C</artifactId>
<version>${project-C.version}</version>
</dependency>
但我得到的是这样的:
[INFO] Building root [INFO] This project does not have any properties associated with versions [INFO] Building moduleA [INFO] This project does not have any properties associated with versions [INFO] Building moduleB [INFO] This project does not have any properties associated with versions
如果我在root,moduleA或moduleB上运行它并没有什么区别:它总是这么说。当然,如果我在依赖项中硬编码project-C的版本号,它就可以工作。
所以,总结一下:我想将依赖版本集中在根(聚合器/父)POM中的属性,我希望版本插件为那些处理属性的目标选择那些,即:
我该怎么做?我错过了什么吗?这是版本插件中的错误吗?
答案 0 :(得分:2)
这似乎是你的root pom中依赖管理部分的工作......
答案 1 :(得分:2)
您在MVERSIONS-123中收到的答案看起来不准确:
如果在父pom中定义属性,则从父pom运行目标(如果需要,包括子项目作为聚合器的一部分,以便获取依赖项)
这部分不是真的,或者至少不会发生。似乎版本插件只显示当前pom中的属性或属性。在父代中声明以下内容确实有效:
<properties>
<project-C.version>1.0</project-C.version>
</properties>
<dependencies>
<dependency>
<groupId>com.blah</groupId>
<artifactId>project-C</artifactId>
<version>${project-C.version}</version>
</dependency>
</dependencies>
但是声明父级中的属性和子级中的依赖项不会(即使在父级上运行插件时)。
现在,如果Stephen在MVERSIONS-123中描述的行为是预期的行为,那么就有一个错误(你应该提供一个允许重现的简单项目,我做了一个简单的测试,将Junit作为依赖)
但是在你的情况下(可能只是一个例子)因为A和B都依赖于C,为什么不把C放在父母身上呢?这会奏效。无论如何你应该使用dependencyManagement
(如果你不想在任何地方继承它,这将有效。)