在儿童pom中复制artifactId

时间:2014-10-22 08:49:33

标签: maven pom.xml parent-pom

我希望父pom为许多子pom定义一些属性来继承。但是,当我尝试在父pom中的其中一个属性中使用artifactId时,它会复制到子pom的有效pom中。以下非常基本的例子。假设我拥有poms所需的所有有效字段(groupId,版本,包装等)。

父pom的有效pom的scm连接值为www.mysite.com/parent-pom。但是孩子的有效pom的scm连接值为www.mysite.com/child-pom/child-pom。如何在没有重复artifactId的情况下获得连接URL的属性和一般结构的继承。我希望孩子pom有www.mysite.com/child-pom的scm连接。

父:

<project>
  <artifactId>parent-pom</artifactId>
  <properties>
    <scmurl>www.mysite.com</scmurl>
  </properties>
  <scm>
    <connection>${scmurl}/${artifactId}</connection>
  </scm>
</project>

子:

<project>
  <parent>
    <artifactId>parent-pom</artifactId>
  </parent>
  <artifactId>child-pom</artifactId>
</project>

3 个答案:

答案 0 :(得分:4)

edwardmlyte,

您尝试做的事情有两种解决方案,但它们都不是最佳的。

基本问题

如果Maven SCM插件检测到您的父级已定义<scm>阻止,而您的孩子中 NOT ,则会导致您孩子的SCM路径仅为父级的子目录。在你的情况下,你的父母的网址本身包含${project.artifactId}的额外皱纹,在再次加入artifactId之前会在子级别进行插值。

基本上,它正在执行以下操作:

project.scm.connection=${parent.scm.connection}/${project.artifactId}
project.scm.connection=${scmurl}/${project.artifactId}/${project.artifactId}
project.scm.connection=www.mysite.com/child-pom/child-pom

您父母的网址包含${artifactId}这一事实会让您感到困惑,但即使您将网址硬编码到www.mysite.com/parent-pom/,您也无法绕过这样的事实: SCM插件认为child-pom是父网址的子网站,因此只需将其添加到路径的末尾。

您的两个选项是:

冗余但简单

将以下内容放入每个孩子的pom.xml文件中:

<scm>
    <connection>${scmurl}/${artifactId}</connection>
</scm>

令人讨厌,但相对简单。

高效但狡猾

父母pom包含以下内容:

<scm>
    <connection>${scmurl}/</connection>
</scm>

这将导致每个孩子都有正确的网址,但父母本身会搞砸。

您可以通过将父级的正确网址放入个人资料中来解决该问题:

<profile>
    <id>parent-profile</id>
    <scm>
        <connection>${scmurl}/parent-pom</connection>
    </scm>
</profile>


$ mvn -Pparent-profile ...

它不那么明显,容易出现手动错误,但它可以避免编辑每个孩子的pom文件。

希望有所帮助。

答案 1 :(得分:1)

我的回答与@ 333kenshin并没有什么不同,实际上是从它得出的,但我认为它会导致稍微粗糙的粘贴。

在我的父pom中,我已将以下内容添加到<properties>

<git.account>xenworks</git.account>
<git.base>bitbucket.org/${git.account}/${project.artifactId}</git.base>
<git.conn>scm:git:https://${git.base}.git</git.conn>
<git.devConn>scm:git:ssh://git@${git.base}.git</git.devConn>
<git.url>https://${git.base}</git.url>

现在在孩子和父母中我可以按如下方式定义scm。

<scm>
  <connection>${git.conn}</connection>
  <developerConnection>${git.devConn}</developerConnection>
  <url>${git.url}</url>
  <tag>HEAD</tag>
</scm>

我想做的最后一个贡献是open bug on this in the Maven Jira

答案 2 :(得分:0)

${scmurl}来自哪里?该属性称为url.

如果相应地调整parent-pom

 <scmurl>www.mysite.com</scmurl>

......行为如OQ所述:

/parent-pom$ mvn help:effective-pom
  ...
  <scm>
    <connection>www.mysite.com/parent-pom</connection>
  </scm>
  ...


<relativePath>../parent-pom</relativePath>(假设他们是文件系统中的兄弟姐妹)必须添加到child-pom,如果parent-pom尚未install进入本地Maven回购(尚未)。否则以下情况将失败:

/child-pom$ mvn help:effective-pom
  ...
  <scm>
    <connection>www.mysite.com/child-pom/child-pom</connection>
  </scm>
  ...

这对我来说一见钟情。我仍在搜索文档,为此找到(逻辑)解释。

根据评论中的建议,将${artifactId}替换为${project.artifactId}也无济于事。

<scm><connection>${scmurl}/${artifactId}</connection></scm>中重复child-pom有助于:

/child-pom$ mvn help:effective-pom
  ...
  <scm>
    <connection>www.mysite.com/child-pom</connection>
  </scm>
  ...

但是,我会考虑khmarbaise's对此问题的评论。