Maven:如何阅读 Parent POM 版本

Maven: How to read the Parent POM version

背景: 我的大多数 Java 项目都有很多 boiler-plate 配置,我最终将这些配置写入我的 POM。 (例如,sourceEncoding 始终是 UTF-8,组织详细信息永远不会改变)。为了节省 copy-paste 个配置块,我创建了自己的标准 'parent' POM,我可以为我的每个项目扩展。

我在每个 Java 项目中也使用了很多工具(例如 checkstyle、PMD 等),所以我将每个工具的 plug-ins 添加到我的标准中parent pom。

PMD(和其他一些工具)有一个有趣的问题 - 它们需要一组配置文件才能正确运行。由于 Maven 更喜欢使用 'one deployable resource per module' 的概念,我创建了以下(简化的)结构:

<My Template>
  |--- Config Files
  \--- Parent Pom

目前一切顺利....

要求: "Parent Pom" 和 "Config Files" 始终一起构建和部署 - 即 "Parent Pom" 版本 1.2.3 永远只会使用 "Config Files" 版本 1.2.3,所以当我在 "Parent 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" 作为我的 parent。 Maven 将计算项目的有效 POM,${project.version} 将被解释为 0.0.1(应用程序版本)而不是 1.2.3(parent POM 版本)。然后 Maven 找不到配置文件。

问题: 我如何告诉 Maven "Give me version for POM xxx"?

我真正不想做的是创建与 ${project.version} 步调一致的额外属性,因为我可以保证当我们为发布更新 POM 时我们会忘记更新它!

您可以做一些事情。

您可以使用 ${project.parent.version} 而不是 ${project.version}

但可能更好的方法是在您的父 pom 中定义 pluginManagement and/or dependencyManagement - 使用适当的版本和配置。在您的子项目中,您只需在 dependenciesbuild/plugins 中“使用”“托管”version/configurations,而无需指定具体版本或配置。

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