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
- 我的模板: 是一个有两个模块的 maven 控制项目
- 配置文件: 是一个 Maven 模块,它将 PMD 配置文件打包成 ZIP 并将它们部署到 Maven 仓库
- Parent Pom: 是我所有的样板代码。它依赖于 "Config Files" 并设置为从 ZIP
中提取配置
目前一切顺利....
要求: "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
- 使用适当的版本和配置。在您的子项目中,您只需在 dependencies
或 build/plugins
中“使用”“托管”version/configurations,而无需指定具体版本或配置。
例如在开源项目中广泛使用的 org.sonatype.oss:oss-parent
POM。
背景: 我的大多数 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
- 我的模板: 是一个有两个模块的 maven 控制项目
- 配置文件: 是一个 Maven 模块,它将 PMD 配置文件打包成 ZIP 并将它们部署到 Maven 仓库
- Parent Pom: 是我所有的样板代码。它依赖于 "Config Files" 并设置为从 ZIP 中提取配置
目前一切顺利....
要求: "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
- 使用适当的版本和配置。在您的子项目中,您只需在 dependencies
或 build/plugins
中“使用”“托管”version/configurations,而无需指定具体版本或配置。
例如在开源项目中广泛使用的 org.sonatype.oss:oss-parent
POM。