首页 > 解决方案 > 从 Maven 的子模块中检索顶级版本

问题描述

这是Maven 中发布的问题的一个版本:从子模块中检索主模块版本,但我不知道如何应用答案。我正在 Maven 3.6.3 上尝试这个。我已经发布了可以在这个 GitHub 项目中使用的存储库

我有一个顶级项目:

<groupId>com.vps</groupId>
<artifactId>main-module</artifactId>
<version>5.0</version>
<packaging>pom</packaging>

还有一个多模块项目需要由这个顶级项目作为父级,并且它具有独立于顶级项目的版本控制。

这些项目预计不会在同一个存储库中,并且通常彼此独立发布。

我想声明一个属性,我可以进一步使用它来引用这个顶级项目父级的版本(比如拉入具有正确版本的工件):

<artifactId>auxiliary</artifactId>
<version>1.0</version>
<parent>
    <groupId>com.vps</groupId>
    <artifactId>main-module</artifactId>
    <version>5.0</version>
</parent>
<properties>
  <main.version>${project.parent.version}</main.version>
</properties>
<modules><module>corelib</module></modules>
<dependencyManagement>
  <dependencies>
    <dependency>
      <groupId>com.vps</groupId>
      <artifactId>main-module-1</artifactId>
      <version>${main.version}</version>
    </dependency>
  </dependencies>
</dependencyManagement>

现在,子模块是拉取和使用依赖:

<parent>
  <groupId>com.vps</groupId>
  <artifactId>auxiliary</artifactId>
  <version>1.0</version>
</parent>
<artifactId>corelib</artifactId>
<properties>
<!-- this doesn't work 
  <main.version>${project.parent.parent.version}</main.version>
-->
</properties>
<dependencies>
  <dependency>
     <groupId>com.vps</groupId>
     <artifactId>main-module-1</artifactId>
  </dependency>
</dependencies>

如果我在POM 中设置main.version为对的引用,则编译失败,因为它试图拉取不存在的。我猜这是因为属性是根据当前正在处理的有效 POM 来解析的,并且从那里开始,就是' 父级的版本。${project.parent.version}auxiliarycorelibcom.vps:main-module-1:1.0${project.parent.version}corelib

main.version如果我在corelib子模块中覆盖as ${project.parent.parent.version},我会收到一条错误消息,指出计算的有效版本com.vps:main-module-1'${project.parent.parent.version}',并且是无效的。我想这意味着该属性不能一起解决,但我不太明白为什么。

那么,我如何合理地(即没有硬编码父定义和另一个属性中的顶级)从后代子模块中引用顶级版本值?

标签: mavenmaven-3

解决方案


推荐阅读