Maven - 版本化父POM和子POM以继承父POM版本

3
我可以帮助您翻译以下关于IT技术的内容,涉及 Maven 3.x 的使用和 parent pom 和 child pom 的结构问题。
我正在使用 Maven 3.x,在我的父POM和子POM中有以下结构。
<groupId>com.mygoogle.sample</groupId>
<artifactId>workorder</artifactId>
<version>1.0-SNAPSHOT</version>
<packaging>pom</packaging>
<properties>
    <project.version>1.0-SNAPSHOT</project.version>             
</properties>

我有一个子POM,其内容如下:

<parent>
 <groupId>com.mygoogle.sample</groupId>
 <version>${project.version}</version>
 <artifactId>workorder</artifactId>     
</parent>
<artifactId>workorder-client</artifactId>
<packaging>jar</packaging>

当我使用mvn install构建我的构件时,我可以看到jars在我的.m2文件夹中被构建,但是project.version没有被实际的版本1.0-SNAPSHOT替换。
  1. 父POM和/或子POM在我的.m2存储库中的每个构件中是否都指定了版本号,还是会使用project.version?
  2. 我应该在父POM中指定project.version作为属性吗?Maven文档说明默认情况下可用project.version。我也尝试了在父POM中删除project.version属性后执行mvn install,但是生成的构件仍然在我的.m2文件夹中将版本设置为{project.version}而不是实际版本。
  3. 如何在父POM中设置一个版本,并使所有的子POM都具有相同的版本。例如,我想在工单POM中设置一个版本,工单客户端POM也应该继承相同的版本。

你需要指定 <version>,不能依赖于 project.version 属性:它不会在 <parent> 元素中被评估。 - Tunaki
@Tunaki,我刚刚编辑了我的原始帖子,我本意是在父POM中指定实际版本,但在帖子中指定了{project.version}属性,现在已经更正。那么,在上述设置下,为什么我的子POM没有获取父POM中的属性呢?对于最初的混淆,我表示歉意。 - serah
正如链接问题中所回答的那样,你不能在<parent>元素中使用<version>${project.version}</version>。你必须使用<version>1.0-SNAPSHOT</version> - Tunaki
1个回答

6
您的父pom应该像这样:
<groupId>com.mygoogle.sample</groupId>
<artifactId>workorder</artifactId>
<version>1.0-SNAPSHOT</version>
<packaging>pom</packaging>

你的子POM应该像这样:

您的子POM应该像:

<parent>
   <groupId>com.mygoogle.sample</groupId>
   <version>1.0-SNAPSHOT</version>
   <artifactId>workorder</artifactId>     
</parent>

<artifactId>workorder-client</artifactId>
<packaging>jar</packaging>

这将有助于在父项目和子项目之间保持版本控制的顺利进行。
下一次想更改版本时,只需在指向父POM目录时使用以下命令。

mvn versions:set -DnewVersion=2.0-SNAPSHOT


我能否在我的子POM中使用{project.version},如下所示 <parent> <groupId>com.mygoogle.sample</groupId> <version>${project.version}</version> <artifactId>workorder</artifactId>
</parent><artifactId>workorder-client</artifactId> <packaging>jar</packaging>
- serah
我刚刚编辑了原始帖子,我本意是在父POM中指定实际版本,但在帖子中指定了 {project.version} 属性,现在已经纠正了。那么,在上述设置中,为什么我的子 POM 没有捕获到父 POM 中的属性呢? - serah
你不能使用<version>${project.version}</version>,因为在子POM中没有定义这样的属性。因此,继承将一开始就不会发生。也许你会感到困惑,认为它会从父POM中继承。但是由于${project.version}属性未定义,子POM将无法解析<version>${project.version}</version>的值。因此,继承将不会发生。 - RITZ XAVI

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接