父pom.xml中的$ {project.artifactId}解析为奇数

时间:2013-12-11 08:08:47

标签: maven

我有大量的项目在pom.xml中有相同的URL:

<url>https://github.com/malkusch/${project.artifactId}</url>

<scm>
    <connection>scm:git:git://github.com/malkusch/${project.artifactId}.git</connection>
    <developerConnection>scm:git:git@github.com:malkusch/${project.artifactId}.git</developerConnection>
    <url>https://github.com/malkusch/${project.artifactId}</url>
</scm>

<issueManagement>
    <system>github</system>
    <url>https://github.com/malkusch/${project.artifactId}/issues</url>
</issueManagement>

所以我认为把它放到parent pom.xml中是一个好主意。但是有效的pom会产生奇怪的$ {project.artifactId}:

<parent>
  <groupId>de.malkusch.parent</groupId>
  <artifactId>oss-parent</artifactId>
  <version>1.1-SNAPSHOT</version>
</parent>
<groupId>de.malkusch.localized</groupId>
<artifactId>localized</artifactId>
<url>https://github.com/malkusch/localized/localized</url>
<scm>
  <connection>scm:git:git://github.com/malkusch/localized.git/localized</connection>
  <developerConnection>scm:git:git@github.com:malkusch/localized.git/localized</developerConnection>
  <url>https://github.com/malkusch/localized/localized</url>
</scm>
<issueManagement>
  <system>github</system>
  <url>https://github.com/malkusch/localized/issues</url>
</issueManagement>

您注意到只有issueManagement.url已正确解析。其他的都很奇怪,特别是 $ {project.artifactId} .git - &gt;的 localized.git /局部即可。我正在使用Maven 3.0.4。我使用了一些未定义的功能吗?这是一个错误吗?

3 个答案:

答案 0 :(得分:9)

是的,这种行为令人困惑。

也许最简单的理解方法是考虑如何构建Maven本身。它在Subversion中,而反应堆poms(带有<modules>部分的poms)往往也是模块本身的父poms。

project/pom.xml (artifactId: parent)
|-+ module1/pom.xml (artifactId: module1, inherits parent)
|-+ module2/pom.xml (artifactId: module2, inherits parent)

这里,父pom(project / pom.xml)包含<modules>部分,并且还由module1和module2继承。

现在假设父级的SCM URL为svn://host/path/project/:maven应该做什么,这样您就不必在两个模块中再次指定SCM URL?

嗯,module1的SCM URL是svn://host/path/project/module1,Maven可以通过将artifactId添加到它从父pom继承的SCM URL来计算。它只需要将artifactId附加到SCM URL。这就是它的作用。

这就是你所看到的行为:

$ {project.artifactId} .git 变为 localized.git / localized ,如下所示:

localized  -> from ${project.artifactId} in the inherited SCM URL
.git       -> from the the inherited SCM URL
/localized -> from adding the artifactId to the inherited SCM URL

您会在SCM网址中看到此行为,我认为project.urldistributionMangement.site.url中的网址会显示此行为。但是,Maven并不认为issueManagement URL结构遵循您的目录结构,这就是您看到它正确继承的原因。

答案 1 :(得分:0)

添加已经很好的背景信息,为了仍然使用有效的scm url部署since Maven 3.5,您可以更正根据project.directory属性附加的“模块”名称:

<properties>
    <project.directory>${project.artifactId}</project.directory>
</properties>

然后,您只需将developerConnection简化为不再包含artifactId,因为它将作为project.directory添加:

<scm>
    <developerConnection>scm:git:git@server:</developerConnection>
</scm>

假设这与任何其他goals没有冲突,那么应该允许deploy目标使用正确的git url为非多模块Maven项目执行其工作在父pom中定义了scm.developerConnection

当我运行deploy时,我看到maven做了正确的推送,如:

[INFO] Executing: /bin/sh -c cd /projectDir/proj && git push git@server:proj master:master

答案 2 :(得分:0)

从Maven 3.6.1开始,继承可以通过将每个url的模型属性值设置为false来避免将任何路径附加到父值。

src:maven-model-builder

''

似乎IntelliJ显示了错误,但是到最后,它确实完成了工作。