1

父 pom 中的某些内容可以采用子 pom 中声明的值吗?

具体来说,我想做这样的事情。

家长:

<scm>
    <connection>scm:git:git@github.corp.com:team/${git.repo}.git</connection>
    <developerConnection>scm:git:git@github.corp.com:team/${git.repo}.git</developerConnection>
    <url>http://github.corp.com/team/${git.repo}</url>
</scm>

孩子:

<properties>
    <git.repo>Foo</git.repo>
</properties>

理想情况下, git.repo 属性未在父级中明确设置,因此子级必须覆盖它,或完全覆盖 scm 部分。

4

2 回答 2

1

我在此处添加此内容,因为一般行为如 Marcel 答案中所述,但特别是对于与 scm 一起使用的示例,这可能无法正常工作。

在 maven 3.3.1(和 3.3.3)中没有按预期工作。

家长:

<properties>
    <git.project.name>uumds-commons</git.project.name>
    <git.scmUrl>https://github.com/raisercostin/${git.project.name}.git</git.scmUrl>
</properties>

<scm>
      <connection>scm:git:${git.scmUrl}</connection>
      <developerConnection>scm:git:${git.scmUrl}</developerConnection>
      <tag>HEAD</tag>
</scm>

孩子:

<properties>
    <git.project.name>uumds-pdp</git.project.name>
</properties>

在 child 中的有效 pom (mvn help:effective-pom) 中变为:

<properties>
  <git.project.name>uumds-pdp</git.project.name>
  <git.scmUrl>https://github.com/raisercostin/uumds-pdp.git</git.scmUrl>
</properties>

<scm>
  <connection>scm:git:https://github.com/raisercostin/uumds-pdp.git/uumds-pdp</connection>
  <developerConnection>scm:git:https://github.com/raisercostin/uumds-pdp.git/uumds-pdp</developerConnection>
  <tag>uumds-parent-0.9</tag>
</scm>

所以看起来如果 scm 没有在 child 中定义,它会自动将项目名称添加到连接中。

更新: maven 似乎有一些自动更改 url: ${project.artifactId} 在父 pom.xml 中解决了奇怪的问题https://issues.apache.org/jira/browse/MNG-2290

吉拉状态

Maven 有相当多的元素,其中 URL 或路径会为子 POM 自动修改(我目前知道的那些):

url
scm/connection
scm/developerConnection
scm/url
distributionManagement/site/url
于 2016-03-04T15:36:08.640 回答
0

Can something in the parent pom take a value declared in the child pom?

Yes. In order to have a valid parent POM, however, I suggest providing a default/dummy value for ${git.repo} in the parent.

To deal with cases where a child POM does not override (i.e. redefine) ${git.repo} you could introduce a profile in the parent like so:

<profiles>
  <profile>
    <id>property-not-redefined</id>
    <activation>
      <activeByDefault>false</activeByDefault>
      <property>
        <name>git.repo</name>
        <value>your-default-value</value>
      </property>
    </activation>
    <build>
      <plugins>
        <!-- do something here -->
      </plugins>
    </build>
  </profile>
</profiles>

This profile becomes active when the git.repo property still has the default value.

于 2014-04-18T18:49:43.340 回答