背景:我的大部分 Java 项目都有大量样板配置,我最终将这些配置写入了我的 POM。 (例如,sourceEncoding 始终是 UTF-8,组织详细信息永远不会改变)。为了避免复制粘贴配置 block ,我创建了自己的标准“父”POM,我可以为我的每个项目扩展。
我还有许多工具在我从事的每个 Java 项目中使用(例如 checkstyle、PMD 等),因此我已将每个工具的插件添加到我的标准父 pom.xml 文件中。
PMD(和其他一些工具)有一个有趣的问题 - 它们需要一组配置文件才能正确运行。由于 Maven 更喜欢使用“每个模块一个可部署资源”的概念,我创建了以下(简化的)结构:
<My Template>
|--- Config Files
\--- Parent Pom
- 我的模板:是一个由两个模块组成的 maven 控制项目
- Config Files: 是一个 maven 模块,它将 PMD 配置文件打包成 ZIP 并将它们部署到 maven repo
- Parent Pom: 是我所有的样板代码。它依赖于“配置文件”,并设置为从 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”作为我的父级。 Maven 将计算项目的有效 POM,并且 ${project.version} 将被解释为 0.0.1(应用程序版本)而不是 1.2.3(父 POM 版本)。然后 Maven 找不到配置文件。
问题:如何告诉 Maven“给我 POM xxx 的版本”?
我真正不想做的是创建与 ${project.version} 步调一致的额外属性,因为我可以保证当我们为发布更新 POM 时我们会忘记更新它!
最佳答案
您可以做一些事情。
您可以使用 ${project.parent.version}
而不是 ${project.version}
。
但可能更好的方法是在您的父 pom 中定义 pluginManagement
和/或 dependencyManagement
- 使用适当的版本和配置。在您的子项目中,您只需“使用”dependencies
或 build/plugins
中的“托管”版本/配置,而无需指定具体版本或配置。
例如,请参阅 org.sonatype.oss:oss-parent
开源项目中广泛使用的POM。
关于java - Maven:如何读取父 POM 版本,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40979198/