Skip to content

Add ability to disable consumer POM flattening to preserve dependency management inheritance #11346

@gnodet

Description

@gnodet

Summary

Currently, Maven's consumer POM transformation flattens dependency management sections by default, which prevents dependency management from being inherited by consumers. This creates issues in scenarios where transitive dependency management inheritance is desired.

Use Case

Consider the following dependency scenario:

  • Module A 1.0: depends on B 1.0 and manages C to version 1.2
  • Module B 1.0: has no dependencies
  • Module B 2.0: depends on C 1.1
  • Module D: depends on A 1.0 and manages B to version 2.0

Expected Behavior

When Module D builds, it should resolve:

  • B 2.0 (due to D's dependency management override)
  • C 1.2 (due to A's dependency management, which should take precedence over B 2.0's direct dependency on C 1.1)

Current Problem

With consumer POM flattening enabled (default), Module A's consumer POM loses its dependency management section. This means when Module D consumes A 1.0, the dependency management for C 1.2 is not available, and Module D ends up with C 1.1 from B 2.0's direct dependency.

Desired Solution

A feature flag (e.g., maven.consumer.pom.flatten=false) that allows disabling consumer POM flattening, preserving dependency management sections in consumer POMs so they can be inherited by downstream consumers.

Integration Test

This use case is demonstrated by the integration test MavenITDependencyManagementOverrideTest which:

  1. Sets up the multi-module scenario described above
  2. Verifies that with flattening disabled, Module D correctly resolves C 1.2 instead of C 1.1
  3. Confirms that dependency management inheritance works as expected when consumer POMs preserve their dependency management sections

Question

  • Should this be the default behaviour?

Metadata

Metadata

Assignees

Labels

priority:blockerBlocks development and/or testing work, production could not run

Projects

No projects

Relationships

None yet

Development

No branches or pull requests

Issue actions