我希望父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>
答案 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对此问题的评论。