17

http://maven.apache.org/pom.html#Properties说属性“值可以在 POM 中的任何地方访问”。

这应该读作“在POM中的大多数地方都可以访问”吗?

我可以像这样指定依赖项的版本没问题:

<dependency>
    <groupId>junit</groupId>
    <artifactId>junit</artifactId>
    <version>${junit.version}</version>
    <scope>test</scope>
</dependency>

但是项目本身的版本是这样的:

<project xmlns="http://maven.apache.org/POM/4.0.0" ...>

    <modelVersion>4.0.0</modelVersion>
    <groupId>com.mycompany.app</groupId>
    <artifactId>my-app</artifactId>
    <version>${myversion}</version>

    <properties>
        <myversion>8</myversion>
    </properties>

    <modules>
        <module>alpha</module>
        <module>beta</module>
    </modules>
    ...

如果我尝试这个 <version> 将不会取值 8。这里我在 pom 中定义了 ${myversion} 但如果我在命令行上指定 -Dmyversion=8 似乎也是如此。

如果其中一个模块使用硬编码的版本号指定其父级,如下所示:

<parent>
    <groupId>com.mycompany.app</groupId>
    <artifactId>my-app</artifactId>
    <version>8</version>
</parent>

当我尝试构建时,当 maven 来查看模块的 pom 时,它会说它找不到版本 8 的给定父 pom。

但是,如果我也将父版本中的版本硬编码为 8,而不是使用 ${myversion},那么一切正常。

所以在我看来,父 pom 的 /project/version 标记不会发生属性替换。

是这种情况还是对我似乎看到的情况有其他解释?

问候,

/乔治

4

1 回答 1

31

在 Maven 2.x中/project/parent/(groupId|artifactId|version)或设计中不允许属性替换。/project/(groupId|artifactId|version)

所以规则是:

  • 硬编码顶部project/version元素中的版本。
  • project/parent/version在子元素中硬编码版本。
  • 孩子继承版本,除非他们想覆盖它
    • 因此不需要${myversion}财产
  • 使用${project.groupId}and${project.version}用于模块间的依赖关系。

您会在 maven 用户列表中找到关于此主题的无限数量的线程(参见例如Pom Parent Version Properties),我只想说任何解决上述规则的尝试都是错误的并且不起作用。

parentMaven 3.1 将允许使用更少的版本。

也可以看看

于 2010-09-10T14:10:53.420 回答