Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

${project.artifactId} in parent pom.xml resolves odd

Tags:

maven

I have a bulk full of projects which have the same URLs in their pom.xml:

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

<scm>
    <connection>scm:git:git://github.com/malkusch/${project.artifactId}.git</connection>
    <developerConnection>scm:git:[email protected]: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>

So I thought it's a great idea to put that into a parent pom.xml. But the effective pom produces odd ${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:[email protected]: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>

You notice that only issueManagement.url was resolved correctly. The others are totally strange, especially ${project.artifactId}.git -> localized.git/localized. I'm using Maven 3.0.4. Am I using some undefined feature? Is it a bug?

like image 436
Markus Malkusch Avatar asked Dec 11 '13 08:12

Markus Malkusch


2 Answers

Yes, this behaviour is confusing.

Perhaps the easiest way to understand this is to consider how Maven itself is built. It's in Subversion, and the reactor poms (the poms with <modules> sections) tend to also be the parent poms of the modules themselves.

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

Here, the parent pom (project/pom.xml) contains a <modules> section, and is also inherited by module1 and module2.

Now suppose the SCM URL for parent is svn://host/path/project/: what should maven do so that you don't have to specify the SCM URL again in the two modules?

Well, the SCM URL for module1 is svn://host/path/project/module1, and Maven can compute that by adding the artifactId to the SCM URL it inherits from the parent pom. It simply needs to append the artifactId to the SCM URL. So that's exactly what it does.

So that's the behaviour you're seeing:

${project.artifactId}.git becomes localized.git/localized as follows:

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

You will see this behaviour in the SCM URLs, and (I think) for project.url and the URL in distributionMangement.site.url. However, Maven doesn't assume that the issueManagement URL structure follows your directory structure, which is why you see it inherited correctly.

like image 182
Martin Ellis Avatar answered Oct 10 '22 10:10

Martin Ellis


Since Maven 3.6.1, inheritance can avoid appending any path to parent value by setting model attribute value to false for each url

src : maven-model-builder

You need to append following properties to SCM tag in your POM : <scm child.scm.connection.inherit.append.path="false" child.scm.developerConnection.inherit.append.path="false" child.scm.url.inherit.append.path="false">...</scm>

It seems IntelliJ shows error, but at then end, it does the job perfect.

like image 1
DamienG Avatar answered Oct 10 '22 10:10

DamienG