Fix dependency-reduced-pom exclusion loss for classifier-distinct duplicate deps (Maven 4)#820
Conversation
Under Maven 4, ShadeMojo.updateExcludesInDeps() walks a single
conflict-resolved collect graph. The resolver prunes the duplicate
transitive node ("omitted for duplicate") under one of two
classifier-distinct variants of the same artifact, so the generated
dependency-reduced-pom keeps the <exclusion> on only one variant.
Collect that graph with verbose conflict resolution
(ConflictResolver.CONFIG_PROP_VERBOSE = STANDARD) so the omitted-duplicate
node is retained as a marker; the existing walk then re-attaches the
exclusion to both variants. No behaviour change on Maven 3.9.16.
Covered by the existing dep-reduced-pom-exclusions and
MSHADE-467_parallel-dependency-reduced-pom ITs.
Closes apache#819
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
|
Note on Maven 4 coverage: this repo's PR matrix runs Maven 3.9.16 only, so the green checks here confirm there is no Maven 3 regression but do not exercise the Maven 4 path this fixes. For the Maven 4 evidence I ran the full
Locally the suite is also 83/0 on both Maven 4.0.0-SNAPSHOT and Maven 3.9.16. |
|
one aspect surprises me: I thought that the change in Maven 4 was tied to Resolver 2 is Maven 4.0 using Resolver 2 not exactly the same way as Maven 3.10 on these conflict-resolved dependencies? @cstamas having your review on this PR would help, please, to be sure that analysis and update to m-shade-p is completely understood and accepted by people who really understand (I don't really understand myself :) ) |
Exactly the same issue in my eye as well. IF there are differences seen between Resolver 1 and Resolver 2, I would like to understand them better. @ascheman can you create some simple reproducer for me to play with it? |
|
@cstamas here you go — standalone reproducer (stock shade 3.6.0, no plugin build needed): https://github.com/aschemaven/mshade-819-reproducer
So @hboutemy's observation holds: same Resolver 2 line, different outcome — the delta is on the Maven side, not the resolver version. Two more data points from the reproducer:
What I don't understand myself yet: why 3.10's collected graph retains the duplicate On test coverage: the existing ITs ( |
What
Fixes the generated
dependency-reduced-pom.xmldropping an<exclusion>on one of two classifier-distinct duplicate variants of a dependency under Maven 4 (e.g.b:0.2keeps the exclusion,b:0.2:altloses it).Why
ShadeMojo.updateExcludesInDeps()walks a single conflict-resolved collect graph. Under Maven 4 the resolver prunes the duplicate transitive node (omitted for duplicate) under one variant, so the exclusion is re-attached to only that variant. This is stable, intended resolver behaviour (not a resolver bug); shade's own dependency keying is already classifier-aware.Fix
Collect that graph with verbose conflict resolution (
ConflictResolver.CONFIG_PROP_VERBOSE = STANDARD) on a copied session, so the omitted-duplicate node is retained as a marker; the existing walk then re-attaches the exclusion to both variants. Localized to the singlecollectDependenciescall; no behaviour change on Maven 3.Test
Covered by the existing ITs
dep-reduced-pom-exclusionsandMSHADE-467_parallel-dependency-reduced-pom(red on Maven 4 / green on Maven 3 before; green on both after). Full-P run-itsverified locally: 83/0 on both Maven 4.0.0-SNAPSHOT and Maven 3.9.16.Closes #819