Skip to content

Maven 4 consumer pom does not carry over mvn xml namespace #11760

@stevenschlansker

Description

@stevenschlansker

Affected version

4.0.0-rc-5

Bug description

I am attempting to upgrade a project to Maven 4. The project includes a build parent pom, which is a sibling module to others that use the parent.

jdbi/
  pom.xml
  jdbi-build-parent/
    pom.xml
  jdbi-core/
    pom.xml (inherit build-parent)
    src/...
  jdbi-other-integration/...

The build parent pom itself inherits from a generic template pom ( basepom )
In order to combine e.g. compiler arguments in our build parent and basepom, in our build parent we declare:

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:mvn="http://maven.apache.org/POM/4.0.0" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
...
<plugins>
    <plugin>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-compiler-plugin</artifactId>
        <executions>
            <execution>
                <id>default-compile</id>
                <configuration>
                    <compilerArgs mvn:combine.children="append">
                        <arg>-Xlint:deprecation</arg>
                        <arg>-Xlint:unchecked</arg>
                    </compilerArgs>
                </configuration>
            </execution>
    </plugin>
...

We added the mvn namespace since it seemed to be the upgrade path from the old combine.children directive.

When building the multi-module project, all is well.

% mvn clean install
...
[INFO] BUILD SUCCESS

However, if you then try to use an individual project alone, without the full reactor build, you get a surprising error:

% mvn test -pl :jdbi-other-integration
...

[WARNING] The POM for org.jdbi:jdbi-core:jar:tests:4.0.0-SNAPSHOT is invalid, transitive dependencies (if any) will not be available: 1 problem was 
    - [FATAL] Non-parseable POM org.jdbi:jdbi-build-parent:4.0.0-SNAPSHOT: Unable to read model: Undeclared namespace prefix "mvn" (for attribute "combine.children")
 at [row,col {unknown-source}]: [786,64]

...

[ERROR] org.jdbi.guava.codec.TypeResolvingCodecFactoryTest.testCollectionCodec -- Time elapsed: 0.101 s <<< ERROR!
java.lang.NoClassDefFoundError: io/leangen/geantyref/GenericTypeReflector

Sure enough, the installed consumer pom lost the xmlns:mvn on the opening <project> tag:

% head ~/.m2/repository/org/jdbi/jdbi-build-parent/4.0.0-SNAPSHOT/jdbi-build-parent-4.0.0-SNAPSHOT.pom 
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">

So it looks like Maven, while transforming our build parent pom into its consumer version for installation to the local repository, drops the <project xmlns:mvn declaration and then writes an invalid POM file to the local repo.

The source is available, although it's not a minimal example: jdbi/jdbi#2935

Metadata

Metadata

Assignees

No one assigned

    Labels

    bugSomething isn't working

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions