Maven-如何/为什么/应该将父版本设置为基于父pom中定义的属性?

Maven-如何/为什么/应该将父版本设置为基于父pom中定义的属性?,maven,build,maven-2,maven-3,Maven,Build,Maven 2,Maven 3,我有以下POM结构: /home/projects/parent/pom.xml <project> <groupId>com.my.group</groupId> <artifactId>project-super-parent</artifactId> <version>${major.version}.${minor.version}</version> <packagin

我有以下POM结构:

/home/projects/parent/pom.xml

<project>
   <groupId>com.my.group</groupId>
   <artifactId>project-super-parent</artifactId>
    <version>${major.version}.${minor.version}</version>
    <packaging>pom</packaging>
    <properties>
            <major.version>7</major.version>
            <minor.version>5</minor.version>
            <current.release.version>${major.version}.${minor.version}-SNAPSHOT</current.release.version>
            ...
    </properties>

    ....

</project>
<project>
   <groupId>com.my.group</groupId>
   <artifactId>module1</artifactId>
    <version>${current.release.version}</version>
    <packaging>jar</packaging>


    <parent>
        <groupId>com.my.group</groupId>
        <artifactId>project-super-parent</artifactId>
        <version>${major.version}.${minor.version}</version>
        <relativePath>../parent</relativePath>
    </parent>

    ...
</project>

com.my.group
超级父项目
${major.version}.${minor.version}
聚甲醛
7.
5.
${major.version}.${minor.version}-快照
...
....
/home/projects/module1/pom.xml

<project>
   <groupId>com.my.group</groupId>
   <artifactId>project-super-parent</artifactId>
    <version>${major.version}.${minor.version}</version>
    <packaging>pom</packaging>
    <properties>
            <major.version>7</major.version>
            <minor.version>5</minor.version>
            <current.release.version>${major.version}.${minor.version}-SNAPSHOT</current.release.version>
            ...
    </properties>

    ....

</project>
<project>
   <groupId>com.my.group</groupId>
   <artifactId>module1</artifactId>
    <version>${current.release.version}</version>
    <packaging>jar</packaging>


    <parent>
        <groupId>com.my.group</groupId>
        <artifactId>project-super-parent</artifactId>
        <version>${major.version}.${minor.version}</version>
        <relativePath>../parent</relativePath>
    </parent>

    ...
</project>

com.my.group
模块1
${current.release.version}
罐子
com.my.group
超级父项目
${major.version}.${minor.version}
../parent
...
请注意,模块不知道其父级的版本-它使用父级中定义的属性,因此这是一种鸡和蛋的问题

奇怪的是——这是可行的——所以当我想更改产品的主要版本时——我只更改一个pom文件(父文件)

该解决方案的局限性在于,我必须在文件系统中拥有所有POM文件

我的问题是:这是否可行?它到底是如何工作的?当我升级到maven 3时,它可能会停止工作吗?这是一种常用的解决方案还是滥用该系统

目前正在使用Maven 2.2.1和Java 7

这是一种常用的解决方案还是滥用该系统

这并不常见,至少我以前从未见过。在parent/pom.xml和module1/pom.xml中的版本控制将导致混淆。父系统发布了版本的7.5,而模块1有快照版本的7.5。如果7.5已经发布,则不应开发7.5-SNAPSHOT

避免重复的最简单方法是仅在父级中维护版本。您可以省略模块1中的版本声明。看看另一个项目,例如maven-3源代码。您将能够看到该版本仅在pom中声明,而不在其任何pom中声明


将帮助您处理版本升级并为您发布它们。

忽略子pom中的版本元素会导致错误。 属性可以在主pom中使用,并且可以由子pom继承。当您运行主pom时,构建将获得成功。问题是

  • 您不能独立地构建子pom
  • 这在可传递依赖项的情况下不起作用
  • 如果将来升级到Maven 3,则会出现错误“无法解析的父pom”

  • 如果我们能够在将项目pom文件安装到本地存储库之前将其作为构建过程的一部分进行更新,这些问题可以得到解决

    这是如何工作的,因为如果我尝试您的父pom,它将完全失败。此外,我建议使用maven 3而不是maven 2。@khmarbaise它可以工作,我无法在这里放置实际的pom但是确实如此。Maven 3升级已在待办事项列表中:)很快就会到达