子pom中存在重复的artifactId



我想要一个父pom为许多子pom定义一些要继承的属性。然而,当我尝试在父pom中的其中一个属性中使用artifactId时,它会在子pom的有效pom中重复。下面是非常基本的例子。假设我拥有pom所需的所有有效字段(groupId、version、packaging等)。

父pom的有效pom具有www.mysite.com/parent-pom的scm连接值。但儿童的有效pom具有www.mysite.com/child-pom/child-pom的scm连接值。如何在没有重复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>

edwardmlyte,

你想做的事情有两种解决方案,但都不是最优的。

基本问题

如果Maven SCM插件检测到<scm>块已在您的父级中定义,但在您的子级中NOT,则会导致您的子代的SCM路径只是父级的子级。在您的情况下,还有一个额外的问题,即您父母的url本身包含${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

父级的url包含${artifactId}这一事实加剧了混乱,但即使您将url硬编码为www.mysite.com/parent-pom/,也无法回避SCM插件认为child-pom是父级url的子目录,因此只需将其粘贴到路径的末尾。

您的2个选项是:

冗余但简单

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

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

这很烦人,但相对简单。

高效但狡猾

让父pom包含以下内容:

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

这将导致每个孩子都有正确的url,但家长本身会被搞砸。

你可以通过将父母的正确url放入档案来解决这个问题:

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

$ mvn -Pparent-profile ...

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

希望能有所帮助。

我的答案与@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>

现在,在children和parent中,我可以定义scm如下。

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

我想做的最后一个贡献是在Maven Jira 中有一个关于这方面的开放错误

${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>
  ...


如果parent-pom(还没有)被install插入到本地Maven repo中,则必须将<relativePath>../parent-pom</relativePath>(假设它们是文件系统中的兄弟)添加到child-pom中。否则,以下操作将失败:

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

我一看也觉得奇怪。我仍在搜索文档,以找到对此的(合乎逻辑的)解释。

${artifactId}替换为${project.artifactId}——正如评论中所建议的那样——无济于事。

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

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

然而,我会考虑赫马尔拜塞对这个问题的评论。

相关内容

  • 没有找到相关文章

最新更新