在儿童pom中复制artifactId

edw*_*yte 5 pom.xml maven parent-pom

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

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

家长:

<project>
  <artifactId>parent-pom</artifactId>
  <properties>
    <scmurl>www.mysite.com</scmurl>
  </properties>
  <scm>
    <connection>${scmurl}/${artifactId}</connection>
  </scm>
</project>
Run Code Online (Sandbox Code Playgroud)

儿童:

<project>
  <parent>
    <artifactId>parent-pom</artifactId>
  </parent>
  <artifactId>child-pom</artifactId>
</project>
Run Code Online (Sandbox Code Playgroud)

333*_*hin 5

爱德华·莱姆

您有2种解决方案,但是都不是最佳选择。

基本问题

如果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
Run Code Online (Sandbox Code Playgroud)

父母的URL包含事实的事实${artifactId}加剧了混淆,但是即使您对URL进行了硬编码,www.mysite.com/parent-pom/您也无法避免SCM插件认为它child-pom是父母的URL的子目录,因此只需将其附加到末尾即可。的路径。

您的2个选项是:

冗余但简单

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

<scm>
    <connection>${scmurl}/${artifactId}</connection>
</scm>
Run Code Online (Sandbox Code Playgroud)

这很烦人,但相对简单。

高效但狡猾

让parent-pom包含以下内容:

<scm>
    <connection>${scmurl}/</connection>
</scm>
Run Code Online (Sandbox Code Playgroud)

这将导致每个孩子都有正确的url,但是父母本身会被弄乱。

您可以通过将父母的正确网址放入配置文件中来解决该问题:

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


$ mvn -Pparent-profile ...
Run Code Online (Sandbox Code Playgroud)

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

希望能有所帮助。