This is an automated email from the ASF dual-hosted git repository.
gnodet pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/maven.git
The following commit(s) were added to refs/heads/master by this push:
new 4af662f7b3 [MNG-7920] Fix usage of packaging BOM fails in
maven-install-plugin (#1305)
4af662f7b3 is described below
commit 4af662f7b3e5adcc6b03f3be7aa0f5fb4b8b644a
Author: huazhongming <[email protected]>
AuthorDate: Tue Dec 5 17:23:26 2023 +0800
[MNG-7920] Fix usage of packaging BOM fails in maven-install-plugin (#1305)
Signed-off-by: crazyhzm <[email protected]>
---
.../apache/maven/graph/DefaultGraphBuilder.java | 14 ++++++
.../impl/DefaultConsumerPomBuilder.java | 51 +++++++++++++++-----
.../maven/graph/DefaultGraphBuilderTest.java | 54 ++++++++++++++++++++++
.../impl/ConsumerPomArtifactTransformerTest.java | 3 +-
.../impl/ConsumerPomBuilderTest.java | 31 +++++++++----
5 files changed, 132 insertions(+), 21 deletions(-)
diff --git
a/maven-core/src/main/java/org/apache/maven/graph/DefaultGraphBuilder.java
b/maven-core/src/main/java/org/apache/maven/graph/DefaultGraphBuilder.java
index ca2334e894..02d935df4f 100644
--- a/maven-core/src/main/java/org/apache/maven/graph/DefaultGraphBuilder.java
+++ b/maven-core/src/main/java/org/apache/maven/graph/DefaultGraphBuilder.java
@@ -99,6 +99,7 @@ public class DefaultGraphBuilder implements GraphBuilder {
if (result == null) {
final List<MavenProject> projects =
getProjectsForMavenReactor(session);
validateProjects(projects, session.getRequest());
+ processPackagingAttribute(projects, session.getRequest());
enrichRequestFromResumptionData(projects,
session.getRequest());
result = reactorDependencyGraph(session, projects);
}
@@ -390,4 +391,17 @@ public class DefaultGraphBuilder implements GraphBuilder {
}
}
}
+
+ private void processPackagingAttribute(List<MavenProject> projects,
MavenExecutionRequest request)
+ throws MavenExecutionException {
+ List<MavenProject> projectsInRequestScope =
getProjectsInRequestScope(request, projects);
+ for (MavenProject p : projectsInRequestScope) {
+ if ("bom".equals(p.getPackaging())) {
+ LOGGER.info(
+ "The packaging attribute of the '{}' project is
configured as 'bom' and changed to 'pom'",
+ p.getName());
+ p.setPackaging("pom");
+ }
+ }
+ }
}
diff --git
a/maven-core/src/main/java/org/apache/maven/internal/transformation/impl/DefaultConsumerPomBuilder.java
b/maven-core/src/main/java/org/apache/maven/internal/transformation/impl/DefaultConsumerPomBuilder.java
index cf5bafac3d..f825cd1c12 100644
---
a/maven-core/src/main/java/org/apache/maven/internal/transformation/impl/DefaultConsumerPomBuilder.java
+++
b/maven-core/src/main/java/org/apache/maven/internal/transformation/impl/DefaultConsumerPomBuilder.java
@@ -29,6 +29,8 @@ import java.util.Map;
import java.util.Properties;
import java.util.stream.Collectors;
+import org.apache.maven.api.model.Dependency;
+import org.apache.maven.api.model.DependencyManagement;
import org.apache.maven.api.model.DistributionManagement;
import org.apache.maven.api.model.Model;
import org.apache.maven.api.model.ModelBase;
@@ -70,9 +72,12 @@ import org.eclipse.aether.RepositorySystem;
import org.eclipse.aether.RepositorySystemSession;
import org.eclipse.aether.RequestTrace;
import org.eclipse.aether.impl.RemoteRepositoryManager;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
@Named
class DefaultConsumerPomBuilder implements ConsumerPomBuilder {
+ private static final Logger LOGGER =
LoggerFactory.getLogger(DefaultConsumerPomBuilder.class);
private static final String BOM_PACKAGING = "bom";
@@ -88,7 +93,8 @@ class DefaultConsumerPomBuilder implements ConsumerPomBuilder
{
throws ModelBuildingException, ComponentLookupException {
Model model = project.getModel().getDelegate();
String packaging = model.getPackaging();
- if (POM_PACKAGING.equals(packaging)) {
+ String originalPackaging = project.getOriginalModel().getPackaging();
+ if (POM_PACKAGING.equals(packaging) &&
!BOM_PACKAGING.equals(originalPackaging)) {
return buildPom(session, project, src);
} else {
return buildNonPom(session, project, src);
@@ -99,14 +105,14 @@ class DefaultConsumerPomBuilder implements
ConsumerPomBuilder {
throws ModelBuildingException, ComponentLookupException {
ModelBuildingResult result = buildModel(session, project, src);
Model model = result.getRawModel().getDelegate();
- return transform(model);
+ return transform(model, project);
}
protected Model buildNonPom(RepositorySystemSession session, MavenProject
project, Path src)
throws ModelBuildingException, ComponentLookupException {
ModelBuildingResult result = buildModel(session, project, src);
Model model = result.getEffectiveModel().getDelegate();
- return transform(model);
+ return transform(model, project);
}
private ModelBuildingResult buildModel(RepositorySystemSession session,
MavenProject project, Path src)
@@ -171,7 +177,7 @@ class DefaultConsumerPomBuilder implements
ConsumerPomBuilder {
return container.lookup(clazz);
}
- static Model transform(Model model) {
+ static Model transform(Model model, MavenProject project) {
String packaging = model.getPackaging();
if (POM_PACKAGING.equals(packaging)) {
// raw to consumer transform
@@ -182,9 +188,34 @@ class DefaultConsumerPomBuilder implements
ConsumerPomBuilder {
if (!model.isPreserveModelVersion()) {
model = model.withPreserveModelVersion(false);
- String version = new
MavenModelVersion().getModelVersion(model);
- model = model.withModelVersion(version);
+ String modelVersion = new
MavenModelVersion().getModelVersion(model);
+ model = model.withModelVersion(modelVersion);
}
+ } else if (BOM_PACKAGING.equals(packaging)) {
+ DependencyManagement dependencyManagement =
+
project.getOriginalModel().getDependencyManagement().getDelegate();
+ List<Dependency> dependencies = new ArrayList<>();
+ String version = model.getVersion();
+
+ dependencyManagement
+ .getDependencies()
+ .forEach((dependency) ->
dependencies.add(dependency.withVersion(version)));
+ Model.Builder builder = prune(
+ Model.newBuilder(model, true)
+ .preserveModelVersion(false)
+ .root(false)
+ .parent(null)
+
.dependencyManagement(dependencyManagement.withDependencies(dependencies))
+ .build(null),
+ model);
+ builder.packaging(POM_PACKAGING);
+ builder.profiles(model.getProfiles().stream()
+ .map(p -> prune(Profile.newBuilder(p, true), p).build())
+ .collect(Collectors.toList()));
+
+ model = builder.build();
+ String modelVersion = new
MavenModelVersion().getModelVersion(model);
+ model = model.withModelVersion(modelVersion);
} else {
Model.Builder builder = prune(
Model.newBuilder(model, true)
@@ -193,16 +224,12 @@ class DefaultConsumerPomBuilder implements
ConsumerPomBuilder {
.parent(null)
.build(null),
model);
- boolean isBom = BOM_PACKAGING.equals(packaging);
- if (isBom) {
- builder.packaging(POM_PACKAGING);
- }
builder.profiles(model.getProfiles().stream()
.map(p -> prune(Profile.newBuilder(p, true), p).build())
.collect(Collectors.toList()));
model = builder.build();
- String version = new MavenModelVersion().getModelVersion(model);
- model = model.withModelVersion(version);
+ String modelVersion = new
MavenModelVersion().getModelVersion(model);
+ model = model.withModelVersion(modelVersion);
}
return model;
}
diff --git
a/maven-core/src/test/java/org/apache/maven/graph/DefaultGraphBuilderTest.java
b/maven-core/src/test/java/org/apache/maven/graph/DefaultGraphBuilderTest.java
index 6074ba66fb..4bc76e44ec 100644
---
a/maven-core/src/test/java/org/apache/maven/graph/DefaultGraphBuilderTest.java
+++
b/maven-core/src/test/java/org/apache/maven/graph/DefaultGraphBuilderTest.java
@@ -40,6 +40,7 @@ import org.apache.maven.model.locator.DefaultModelLocator;
import org.apache.maven.model.locator.ModelLocator;
import org.apache.maven.project.MavenProject;
import org.apache.maven.project.ProjectBuilder;
+import org.apache.maven.project.ProjectBuildingException;
import org.apache.maven.project.ProjectBuildingRequest;
import org.apache.maven.project.ProjectBuildingResult;
import org.apache.maven.project.collector.DefaultProjectsSelector;
@@ -48,6 +49,7 @@ import
org.apache.maven.project.collector.PomlessCollectionStrategy;
import org.apache.maven.project.collector.ProjectsSelector;
import org.apache.maven.project.collector.RequestPomCollectionStrategy;
import org.junit.jupiter.api.BeforeEach;
+import org.junit.jupiter.api.Test;
import org.junit.jupiter.params.ParameterizedTest;
import org.junit.jupiter.params.provider.Arguments;
import org.junit.jupiter.params.provider.MethodSource;
@@ -79,6 +81,7 @@ class DefaultGraphBuilderTest {
module-c
└─── module-c-1
module-c-2 (depends on module-b)
+ module-d (packaging is bom)
*/
private static final String GROUP_ID = "unittest";
private static final String PARENT_MODULE = "module-parent";
@@ -86,6 +89,7 @@ class DefaultGraphBuilderTest {
private static final String MODULE_A = "module-a";
private static final String MODULE_B = "module-b";
private static final String MODULE_C = "module-c";
+ private static final String MODULE_D = "module-d";
private static final String MODULE_C_1 = "module-c-1";
private static final String MODULE_C_2 = "module-c-2";
@@ -329,6 +333,46 @@ class DefaultGraphBuilderTest {
}
}
+ @Test
+ void testProcessPackagingAttribute() throws ProjectBuildingException {
+ graphBuilder = new DefaultGraphBuilder(
+ mock(BuildResumptionDataRepository.class),
+ pomlessCollectionStrategy,
+ multiModuleCollectionStrategy,
+ requestPomCollectionStrategy);
+
+ // Create projects
+ MavenProject projectParent = getMavenProject(PARENT_MODULE);
+ MavenProject projectModuleD = getMavenProject(MODULE_D, projectParent,
"bom");
+
+ projectParent.setCollectedProjects(singletonList(projectModuleD));
+
+ // Set up needed mocks
+ when(session.getRequest()).thenReturn(mavenExecutionRequest);
+ when(session.getProjects()).thenReturn(null); // needed, otherwise it
will be an empty list by default
+
when(mavenExecutionRequest.getProjectBuildingRequest()).thenReturn(mock(ProjectBuildingRequest.class));
+ List<ProjectBuildingResult> projectBuildingResults =
+ createProjectBuildingResultMocks(Stream.of(projectParent,
projectModuleD)
+ .collect(Collectors.toMap(MavenProject::getArtifactId,
identity()))
+ .values());
+ when(projectBuilder.build(anyList(), anyBoolean(),
any(ProjectBuildingRequest.class)))
+ .thenReturn(projectBuildingResults);
+
+ ProjectActivation projectActivation = new ProjectActivation();
+
+
when(mavenExecutionRequest.getProjectActivation()).thenReturn(projectActivation);
+ when(mavenExecutionRequest.getPom()).thenReturn(new
File(PARENT_MODULE, "pom.xml"));
+
+ Result<ProjectDependencyGraph> result = graphBuilder.build(session);
+
+ assertThat(result.hasErrors())
+ .withFailMessage("Expected result not to have errors")
+ .isFalse();
+ List<MavenProject> actualReactorProjects =
result.get().getSortedProjects();
+ assertEquals(2, actualReactorProjects.size());
+ assertEquals("pom", actualReactorProjects.get(1).getPackaging());
+ }
+
@BeforeEach
void before() throws Exception {
graphBuilder = new DefaultGraphBuilder(
@@ -397,6 +441,16 @@ class DefaultGraphBuilderTest {
return mavenProject;
}
+ private MavenProject getMavenProject(String artifactId, MavenProject
parentProject, String packaging) {
+ MavenProject project = getMavenProject(artifactId);
+ Parent parent = new Parent();
+ parent.setGroupId(parentProject.getGroupId());
+ parent.setArtifactId(parentProject.getArtifactId());
+ project.getModel().setParent(parent);
+ project.setPackaging(packaging);
+ return project;
+ }
+
private Dependency toDependency(MavenProject mavenProject) {
Dependency dependency = new Dependency();
dependency.setGroupId(mavenProject.getGroupId());
diff --git
a/maven-core/src/test/java/org/apache/maven/internal/transformation/impl/ConsumerPomArtifactTransformerTest.java
b/maven-core/src/test/java/org/apache/maven/internal/transformation/impl/ConsumerPomArtifactTransformerTest.java
index ceb8f5128c..970881aa4d 100644
---
a/maven-core/src/test/java/org/apache/maven/internal/transformation/impl/ConsumerPomArtifactTransformerTest.java
+++
b/maven-core/src/test/java/org/apache/maven/internal/transformation/impl/ConsumerPomArtifactTransformerTest.java
@@ -56,9 +56,10 @@ class ConsumerPomArtifactTransformerTest {
try (InputStream expected = Files.newInputStream(beforePomFile)) {
Model model = new Model(new MavenStaxReader().read(expected));
MavenProject project = new MavenProject(model);
+ project.setOriginalModel(model);
DefaultConsumerPomArtifactTransformer t = new
DefaultConsumerPomArtifactTransformer((s, p, f) -> {
try (InputStream is = Files.newInputStream(f)) {
- return DefaultConsumerPomBuilder.transform(new
MavenStaxReader().read(is));
+ return DefaultConsumerPomBuilder.transform(new
MavenStaxReader().read(is), project);
}
});
diff --git
a/maven-core/src/test/java/org/apache/maven/internal/transformation/impl/ConsumerPomBuilderTest.java
b/maven-core/src/test/java/org/apache/maven/internal/transformation/impl/ConsumerPomBuilderTest.java
index 6eac02bd9a..9cf8c93126 100644
---
a/maven-core/src/test/java/org/apache/maven/internal/transformation/impl/ConsumerPomBuilderTest.java
+++
b/maven-core/src/test/java/org/apache/maven/internal/transformation/impl/ConsumerPomBuilderTest.java
@@ -20,6 +20,8 @@ package org.apache.maven.internal.transformation.impl;
import javax.inject.Inject;
+import java.io.InputStream;
+import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.util.Collections;
@@ -28,6 +30,7 @@ import org.apache.maven.api.model.Model;
import org.apache.maven.artifact.repository.MavenArtifactRepository;
import org.apache.maven.artifact.repository.layout.DefaultRepositoryLayout;
import org.apache.maven.internal.transformation.AbstractRepositoryTestCase;
+import org.apache.maven.model.v4.MavenStaxReader;
import org.apache.maven.project.MavenProject;
import org.eclipse.aether.DefaultRepositorySystemSession;
import org.junit.jupiter.api.Test;
@@ -42,11 +45,17 @@ public class ConsumerPomBuilderTest extends
AbstractRepositoryTestCase {
@Test
void testTrivialConsumer() throws Exception {
- MavenProject project = new MavenProject();
-
project.setRootDirectory(Paths.get("src/test/resources/consumer/trivial"));
- project.setRemoteArtifactRepositories(Collections.singletonList(new
MavenArtifactRepository(
- "central", "http://repo.maven.apache.org/", new
DefaultRepositoryLayout(), null, null)));
+ MavenProject project;
Path file =
Paths.get("src/test/resources/consumer/trivial/child/pom.xml");
+ try (InputStream inputStream = Files.newInputStream(file)) {
+ org.apache.maven.model.Model model =
+ new org.apache.maven.model.Model(new
MavenStaxReader().read(inputStream));
+ project = new MavenProject(model);
+
project.setRootDirectory(Paths.get("src/test/resources/consumer/trivial"));
+ project.setOriginalModel(model);
+
project.setRemoteArtifactRepositories(Collections.singletonList(new
MavenArtifactRepository(
+ "central", "http://repo.maven.apache.org/", new
DefaultRepositoryLayout(), null, null)));
+ }
Model model = builder.build(session, project, file);
assertNotNull(model);
@@ -54,12 +63,18 @@ public class ConsumerPomBuilderTest extends
AbstractRepositoryTestCase {
@Test
void testSimpleConsumer() throws Exception {
- MavenProject project = new MavenProject();
-
project.setRootDirectory(Paths.get("src/test/resources/consumer/simple"));
- project.setRemoteArtifactRepositories(Collections.singletonList(new
MavenArtifactRepository(
- "central", "http://repo.maven.apache.org/", new
DefaultRepositoryLayout(), null, null)));
+ MavenProject project;
Path file =
Paths.get("src/test/resources/consumer/simple/simple-parent/simple-weather/pom.xml");
((DefaultRepositorySystemSession)
session).setUserProperty("changelist", "MNG6957");
+ try (InputStream inputStream = Files.newInputStream(file)) {
+ org.apache.maven.model.Model model =
+ new org.apache.maven.model.Model(new
MavenStaxReader().read(inputStream));
+ project = new MavenProject(model);
+
project.setRootDirectory(Paths.get("src/test/resources/consumer/simple"));
+
project.setRemoteArtifactRepositories(Collections.singletonList(new
MavenArtifactRepository(
+ "central", "http://repo.maven.apache.org/", new
DefaultRepositoryLayout(), null, null)));
+ project.setOriginalModel(model);
+ }
Model model = builder.build(session, project, file);
assertNotNull(model);