You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@maven.apache.org by gn...@apache.org on 2026/08/29 13:18:28 UTC

(maven) branch fix/12660 created (now 959a1c597c)

This is an automated email from the ASF dual-hosted git repository.

gnodet pushed a change to branch fix/12660
in repository https://gitbox.apache.org/repos/asf/maven.git


      at 959a1c597c Fix #12660: inherit version from imported BOM when local dep mgmt entry has no version

This branch includes the following new commits:

     new 959a1c597c Fix #12660: inherit version from imported BOM when local dep mgmt entry has no version

The 1 revisions listed above as "new" are entirely new to this
repository and will be described in separate emails.  The revisions
listed as "add" were already present in the repository and have only
been added to this reference.



(maven) 01/01: Fix #12660: inherit version from imported BOM when local dep mgmt entry has no version

Posted by gn...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

gnodet pushed a commit to branch fix/12660
in repository https://gitbox.apache.org/repos/asf/maven.git

commit 959a1c597c3947145daf75f9b34049307d0964dc
Author: Guillaume Nodet <gn...@gmail.com>
AuthorDate: Sat Aug 29 15:18:15 2026 +0200

    Fix #12660: inherit version from imported BOM when local dep mgmt entry has no version
    
    Co-Authored-By: Claude Opus 4.6 <no...@anthropic.com>
---
 .../model/DefaultDependencyManagementImporter.java | 11 ++++++
 .../DefaultDependencyManagementImporterTest.java   | 46 ++++++++++++++++++++++
 2 files changed, 57 insertions(+)

diff --git a/impl/maven-impl/src/main/java/org/apache/maven/impl/model/DefaultDependencyManagementImporter.java b/impl/maven-impl/src/main/java/org/apache/maven/impl/model/DefaultDependencyManagementImporter.java
index 19ed567329..64260759ef 100644
--- a/impl/maven-impl/src/main/java/org/apache/maven/impl/model/DefaultDependencyManagementImporter.java
+++ b/impl/maven-impl/src/main/java/org/apache/maven/impl/model/DefaultDependencyManagementImporter.java
@@ -83,6 +83,17 @@ public Model importManagement(
                                         + toString(present) + ". Add the conflicting managed dependency directly "
                                         + "to the dependencyManagement section of the POM.");
                     }
+                    if (present != null
+                            && directDependencies.contains(key)
+                            && present.getVersion() == null
+                            && dependency.getVersion() != null) {
+                        dependencies.put(
+                                key,
+                                Dependency.newBuilder(present)
+                                        .version(dependency.getVersion())
+                                        .location("version", dependency.getLocation("version"))
+                                        .build());
+                    }
                     if (present == null && request.isLocationTracking()) {
                         Dependency updatedDependency = updateWithImportedFrom(dependency, source);
                         dependencies.put(key, updatedDependency);
diff --git a/impl/maven-impl/src/test/java/org/apache/maven/impl/model/DefaultDependencyManagementImporterTest.java b/impl/maven-impl/src/test/java/org/apache/maven/impl/model/DefaultDependencyManagementImporterTest.java
index 8e30494bf7..1a93beaaf7 100644
--- a/impl/maven-impl/src/test/java/org/apache/maven/impl/model/DefaultDependencyManagementImporterTest.java
+++ b/impl/maven-impl/src/test/java/org/apache/maven/impl/model/DefaultDependencyManagementImporterTest.java
@@ -18,13 +18,19 @@
  */
 package org.apache.maven.impl.model;
 
+import java.util.List;
+
 import org.apache.maven.api.model.Dependency;
 import org.apache.maven.api.model.DependencyManagement;
 import org.apache.maven.api.model.InputLocation;
 import org.apache.maven.api.model.InputSource;
+import org.apache.maven.api.model.Model;
+import org.apache.maven.api.services.ModelBuilderRequest;
+import org.apache.maven.api.services.ModelProblemCollector;
 import org.junit.jupiter.api.Test;
 
 import static org.assertj.core.api.Assertions.assertThat;
+import static org.mockito.Mockito.mock;
 
 class DefaultDependencyManagementImporterTest {
     @Test
@@ -121,4 +127,44 @@ public void testUpdateWithImportedFromMultiLevelAlreadyFoundInDifferentSourceImp
         assertThat(result.getImportedFrom().toString())
                 .isEqualTo(differentSource.getLocation("").toString());
     }
+
+    @Test
+    void testImportManagementInheritsVersionFromImportedBomWhenLocalEntryHasNoVersion() {
+        // A locally-declared dep mgmt entry with scope=provided but no version
+        Dependency localDep = Dependency.newBuilder()
+                .groupId("org.junit.jupiter")
+                .artifactId("junit-jupiter-api")
+                .scope("provided")
+                .build();
+
+        Model target = Model.newBuilder()
+                .dependencyManagement(DependencyManagement.newBuilder()
+                        .dependencies(List.of(localDep))
+                        .build())
+                .build();
+
+        // An imported BOM providing the same dependency with a version
+        Dependency importedDep = Dependency.newBuilder()
+                .groupId("org.junit.jupiter")
+                .artifactId("junit-jupiter-api")
+                .version("5.10.0")
+                .build();
+
+        DependencyManagement importedBom = DependencyManagement.newBuilder()
+                .dependencies(List.of(importedDep))
+                .build();
+
+        DefaultDependencyManagementImporter importer = new DefaultDependencyManagementImporter();
+        Model result = importer.importManagement(
+                target, List.of(importedBom), mock(ModelBuilderRequest.class), mock(ModelProblemCollector.class));
+
+        List<Dependency> resultDeps = result.getDependencyManagement().getDependencies();
+        assertThat(resultDeps).hasSize(1);
+
+        Dependency merged = resultDeps.get(0);
+        assertThat(merged.getGroupId()).isEqualTo("org.junit.jupiter");
+        assertThat(merged.getArtifactId()).isEqualTo("junit-jupiter-api");
+        assertThat(merged.getVersion()).isEqualTo("5.10.0");
+        assertThat(merged.getScope()).isEqualTo("provided");
+    }
 }