Maven:如何读取父POM版本

5

背景:我大多数的Java项目都有很多样板配置需要写入我的POM文件中(例如sourceEncoding总是UTF-8,组织细节从不改变)。为了避免复制粘贴大量的配置代码,我创建了自己的标准“父”POM文件,可以用于每个项目的继承。

我还有一些在所有Java项目中使用的工具(例如checkstyle、PMD等),因此我已经将每个工具的插件添加到了我的标准父POM文件中。

PMD(和其他一些工具)存在一个有趣的问题——它们需要一组配置文件才能正常运行。由于Maven更喜欢使用“每个模块一个可部署资源”的概念,所以我创建了以下(简化版)结构:

<My Template>
  |--- Config Files
  \--- Parent Pom
  • 我的模板: 是一个由Maven控制的项目,包含两个模块。
  • 配置文件: 是一个Maven模块,将PMD配置文件打包成ZIP并部署到Maven仓库中。
  • 父POM: 包含所有的样板代码。它依赖于 "配置文件" 模块,并设置从ZIP中提取配置。

目前为止一切顺利...

需求: "父POM" 和 "配置文件" 总是一起构建和部署 - 也就是说 "父POM" 版本1.2.3 只能与 "配置文件" 版本1.2.3 兼容,所以当我在 "父POM" 中写依赖关系时,需要这样做:

<dependency>
    <groupId>org.my-org</groupId>
    <artifactId>config-files</artifactId>
    <version>${project.version}</version>
    <type>zip</type>
    <scope>test</scope>
</dependency>

问题:当我启动我的应用程序(假设版本为0.0.1)时,我将“Parent Pom”作为父项。 Maven会计算项目的有效POM,${project.version}将被解释为0.0.1(应用程序版本),而不是1.2.3(父POM版本)。 Maven随后无法找到配置文件。
问题是:如何告诉Maven“给我POM xxx的版本”?
我真正不想做的事情是创建与${project.version}同步的其他属性,因为我可以保证我们在发布时会忘记更新它们!
1个回答

7

有一些事情你可以做。

你可以使用${project.parent.version}替代${project.version}

但更好的方法可能是在你的父POM中定义pluginManagement和/或dependencyManagement - 使用适当的版本和配置。在你的子项目中,你只需在dependenciesbuild/plugins中“使用”“管理”的版本/配置,而不需要指定具体的版本或配置。

例如,请参见被广泛用于开源项目的org.sonatype.oss:oss-parent POM。


嗨@lexicore,${project.parent.version}非常好用。我的计划是使用此变量定义一个属性,然后在设置pluginManagement时引用它。 - Stormcloud

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