我希望父pom为要继承的多个子poms定义一些属性。但是,当我尝试在父pom中的其中一个属性中使用artifactId时,它会在子对象的有效pom中重复。下面是一个非常基本的例子。假设我有poms所需的所有有效字段(groupId、version、packaging等)。
父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>发布于 2014-11-05 08:57:27
向后,
对于你想要做的事情有两个解决方案,但它们都不是最优的。
基本问题
如果Maven SCM插件检测到<scm>块是在父块中定义的,而不是在子块中定义的,那么它将推断您的子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的子目录,因此只需将其插入路径的末尾这一事实。
你的两个选择是:
冗余但简单的
将以下内容放入每个孩子的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文件。
希望这能有所帮助。
发布于 2015-09-09 14:11:21
我的回答与@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>我想做的最后一个贡献是有一个打开Maven Jira中的bug
发布于 2014-10-30 19:33:27
${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 repo中(还没有)。否则,下列情况将失败:
/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>
...但是,我会考虑赫玛白氏对这个问题的评论。
https://stackoverflow.com/questions/26503589
复制相似问题