7

我希望父 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>

孩子:

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

3 回答 3

7

爱德华·莱特,

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

基本问题

如果 Maven SCM 插件检测到该<scm>块已在您的父项中定义但未您的子项中定义,那么它将推断您子项的 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是父母网址的子目录的事实,因此只需将其添加到末尾的路径。

您的 2 个选项是:

冗余但简单

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

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

这很烦人,但相对简单。

高效但狡猾

让 parent-pom 包含以下内容:

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

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

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

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


$ mvn -Pparent-profile ...

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

希望有帮助。

于 2014-11-05T08:57:27.203 回答
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>

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

于 2015-09-09T14:11:21.497 回答
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对这个问题的评论。

于 2014-10-30T19:33:27.007 回答