diff --git a/impl/maven-impl/src/main/java/org/apache/maven/impl/model/DefaultModelBuilder.java b/impl/maven-impl/src/main/java/org/apache/maven/impl/model/DefaultModelBuilder.java index 40e8543f2810..2cadb59e9543 100644 --- a/impl/maven-impl/src/main/java/org/apache/maven/impl/model/DefaultModelBuilder.java +++ b/impl/maven-impl/src/main/java/org/apache/maven/impl/model/DefaultModelBuilder.java @@ -2143,8 +2143,8 @@ private Model importDependencyManagement(Model model, Collection importI for (Iterator it = deps.iterator(); it.hasNext(); ) { Dependency dependency = it.next(); - if (!("pom".equals(dependency.getType()) && "import".equals(dependency.getScope())) - || "bom".equals(dependency.getType())) { + if (!(("pom".equals(dependency.getType()) && "import".equals(dependency.getScope())) + || "bom".equals(dependency.getType()))) { continue; } diff --git a/impl/maven-impl/src/test/java/org/apache/maven/impl/model/DefaultModelBuilderTest.java b/impl/maven-impl/src/test/java/org/apache/maven/impl/model/DefaultModelBuilderTest.java index e3c245db6b3f..f865beec06ad 100644 --- a/impl/maven-impl/src/test/java/org/apache/maven/impl/model/DefaultModelBuilderTest.java +++ b/impl/maven-impl/src/test/java/org/apache/maven/impl/model/DefaultModelBuilderTest.java @@ -40,6 +40,8 @@ import org.apache.maven.api.Constants; import org.apache.maven.api.RemoteRepository; import org.apache.maven.api.Session; +import org.apache.maven.api.di.Named; +import org.apache.maven.api.di.Provides; import org.apache.maven.api.model.Dependency; import org.apache.maven.api.model.DependencyManagement; import org.apache.maven.api.model.Model; @@ -53,6 +55,10 @@ import org.apache.maven.impl.DefaultRemoteRepository; import org.apache.maven.impl.standalone.ApiRunner; import org.eclipse.aether.repository.RepositoryPolicy; +import org.eclipse.aether.spi.connector.transport.http.ChecksumExtractor; +import org.eclipse.aether.spi.io.PathProcessor; +import org.eclipse.aether.transport.apache.ApacheTransporterFactory; +import org.eclipse.aether.transport.file.FileTransporterFactory; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.io.TempDir; @@ -925,6 +931,42 @@ public void testGetEnhancedPropertiesWithNonNormalizedRootDirectory(@TempDir Pat + "which indicates the path normalization fix (GH-12598) is not working."); } + /** + * {@code type=bom} dependencyManagement entries must be processed as BOM imports + * without requiring {@code scope=import}. The {@code bom} type inherently implies + * import semantics (unlike {@code type=pom}, which requires {@code scope=import}). + * Operator precedence previously skipped {@code type=bom} always (GH-12589). + */ + @Test + public void testBomTypeImpliesImportWithoutScope() { + Path basedir = Paths.get(System.getProperty("basedir", "")); + Path localRepoPath = basedir.resolve("target/local-repo-bom-import"); + Path remoteRepoPath = basedir.resolve("src/test/remote-repo"); + Session bomSession = ApiRunner.createSession( + injector -> injector.bindInstance(DefaultModelBuilderTest.class, this), localRepoPath); + RemoteRepository remoteRepository = bomSession.createRemoteRepository( + RemoteRepository.CENTRAL_ID, remoteRepoPath.toUri().toString()); + bomSession = bomSession.withRemoteRepositories(List.of(remoteRepository)); + ModelBuilder bomBuilder = bomSession.getService(ModelBuilder.class); + + ModelBuilderResult result = bomBuilder + .newSession() + .build(ModelBuilderRequest.builder() + .session(bomSession) + .requestType(ModelBuilderRequest.RequestType.BUILD_PROJECT) + .source(Sources.buildSource(getPom("import-bom-type"))) + .build()); + + assertNotNull(result); + assertNotNull(result.getEffectiveModel().getDependencyManagement()); + Dependency managed = result.getEffectiveModel().getDependencyManagement().getDependencies().stream() + .filter(d -> "a".equals(d.getArtifactId()) && "org.apache.maven.its".equals(d.getGroupId())) + .findFirst() + .orElse(null); + assertNotNull(managed, "Managed dependency from type=bom import should be present"); + assertEquals("0.1", managed.getVersion()); + } + private static DefaultProfileActivationContext.Record recordActiveProfile( List activeIds, String profileId) { DefaultProfileActivationContext recording = @@ -939,6 +981,19 @@ private static DefaultProfileActivationContext newProfileActivationContext( null, null, null, activeIds, inactiveIds, Map.of(), Map.of(), Model.newInstance()); } + @Provides + @Named(FileTransporterFactory.NAME) + static FileTransporterFactory newFileTransporterFactory() { + return new FileTransporterFactory(); + } + + @Provides + @Named(ApacheTransporterFactory.NAME) + static ApacheTransporterFactory newApacheTransporterFactory( + ChecksumExtractor checksumExtractor, PathProcessor pathProcessor) { + return new ApacheTransporterFactory(checksumExtractor, pathProcessor); + } + private Path getPom(String name) { return Paths.get("src/test/resources/poms/factory/" + name + ".xml").toAbsolutePath(); } diff --git a/impl/maven-impl/src/test/resources/poms/factory/import-bom-type.xml b/impl/maven-impl/src/test/resources/poms/factory/import-bom-type.xml new file mode 100644 index 000000000000..bb1e3ed22a3b --- /dev/null +++ b/impl/maven-impl/src/test/resources/poms/factory/import-bom-type.xml @@ -0,0 +1,35 @@ + + + + org.apache.maven.tests + import-bom-type + 1.0-SNAPSHOT + jar + + + + + + org.apache.maven.its + bom + 0.1 + bom + + + +