Maven:如何读取父 POM 版本

Sto*_*oud 4 java maven-2 maven

背景:我的大部分 Java 项目都有很多样板配置,我最终将这些配置写入我的 POM。(例如 sourceEncoding 总是 UTF-8,组织细节永远不会改变)。为了避免复制粘贴配置块,我创建了自己的标准“父”POM,我可以为我的每个项目扩展。

我也有许多在我从事的每个 Java 项目中使用的工具(例如 checkstyle、PMD 等),因此我已将每个工具的插件添加到我的标准父 pom 中。

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

<My Template>
  |--- Config Files
  \--- Parent Pom
Run Code Online (Sandbox Code Playgroud)
  • 我的模板:是一个由 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>
Run Code Online (Sandbox Code Playgroud)

问题:当我开始我的应用程序(假设版本 0.0.1)时,我使用“Parent Pom”作为我的父母。Maven 将计算项目的有效 POM,${project.version} 将被解释为 0.0.1(应用程序版本)而不是 1.2.3(父 POM 版本)。Maven 然后无法找到配置文件。

问题:我如何告诉 Maven “给我 POM xxx 的版本”?

我真正不需要做的是创建与 ${project.version} 同步的其他属性,因为我可以保证当我们为发布而修改 POM 时我们会忘记更新它!

lex*_*ore 7

您可以做一些事情。

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

但可能更好的方法是在您的父 pom 中定义pluginManagement和/或dependencyManagement使用适当的版本和配置。在您的子项目中,您只需在dependenciesbuild/plugins没有具体版本或配置规范中“使用”“托管”版本/配置。

例如,请参阅在org.sonatype.oss:oss-parent开源项目中广泛使用的POM。