首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >子pom中的重复artifactId

子pom中的重复artifactId
EN

Stack Overflow用户
提问于 2014-10-22 08:49:33
回答 3查看 2.2K关注 0票数 7

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

父级:

代码语言:javascript
复制
<project>
  <artifactId>parent-pom</artifactId>
  <properties>
    <scmurl>www.mysite.com</scmurl>
  </properties>
  <scm>
    <connection>${scmurl}/${artifactId}</connection>
  </scm>
</project>

儿童:

代码语言:javascript
复制
<project>
  <parent>
    <artifactId>parent-pom</artifactId>
  </parent>
  <artifactId>child-pom</artifactId>
</project>
EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2014-11-05 08:57:27

向后,

对于你想要做的事情有两个解决方案,但它们都不是最优的。

基本问题

如果Maven SCM插件检测到<scm>块是在父块中定义的,而不是在子块中定义的,那么它将推断您的子SCM路径只是父进程的子块。在您的例子中,还有一个额外的问题,您的父程序url本身包含${project.artifactId},在再次插入artifactId之前,会在子级别进行内插。

基本上,它做了以下工作:

代码语言:javascript
复制
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文件中:

代码语言:javascript
复制
<scm>
    <connection>${scmurl}/${artifactId}</connection>
</scm>

这很烦人,但相对来说很简单。

高效但不可靠的

拥有父母-pom包含以下内容:

代码语言:javascript
复制
<scm>
    <connection>${scmurl}/</connection>
</scm>

这将导致每个孩子都有正确的url,但是父程序本身会被搞砸。

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

代码语言:javascript
复制
<profile>
    <id>parent-profile</id>
    <scm>
        <connection>${scmurl}/parent-pom</connection>
    </scm>
</profile>


$ mvn -Pparent-profile ...

它不那么明显,而且容易出现手工错误,但它将避免编辑每个子程序的pom文件。

希望这能有所帮助。

票数 7
EN

Stack Overflow用户

发布于 2015-09-09 14:11:21

我的回答与@333kenshin并不完全不同,实际上是从它派生出来的,但我认为它的结果是粘贴得稍微简洁一些。

在我的父pom中,我向<properties>添加了以下内容

代码语言:javascript
复制
<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如下。

代码语言:javascript
复制
<scm>
  <connection>${git.conn}</connection>
  <developerConnection>${git.devConn}</developerConnection>
  <url>${git.url}</url>
  <tag>HEAD</tag>
</scm>

我想做的最后一个贡献是有一个打开Maven Jira中的bug

票数 1
EN

Stack Overflow用户

发布于 2014-10-30 19:33:27

${scmurl}从哪里来?该属性称为url.

如果一个人相应地调整了parent-pom

代码语言:javascript
复制
 <scmurl>www.mysite.com</scmurl>

..。行为如OQ中所述:

代码语言:javascript
复制
/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中(还没有)。否则,下列情况将失败:

代码语言:javascript
复制
/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有助于:

代码语言:javascript
复制
/child-pom$ mvn help:effective-pom
  ...
  <scm>
    <connection>www.mysite.com/child-pom</connection>
  </scm>
  ...

但是,我会考虑赫玛白氏对这个问题的评论。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/26503589

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档