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 46707e0f28 [MNG-8340] Resolve parent according to the exact model location (#1857) 46707e0f28 is described below commit 46707e0f2858ddc438c32bafe8fef57f2880dd66 Author: Guillaume Nodet <gno...@gmail.com> AuthorDate: Wed Nov 13 20:26:56 2024 +0100 [MNG-8340] Resolve parent according to the exact model location (#1857) --- .../maven/api/services/ModelBuilderRequest.java | 17 +- .../impl/DefaultConsumerPomBuilder.java | 70 +-------- .../maven/project/DefaultProjectBuilder.java | 10 +- .../impl/ConsumerPomBuilderTest.java | 4 +- .../internal/impl/model/DefaultModelBuilder.java | 173 +++++++++++---------- .../impl/model/DefaultModelInterpolator.java | 2 +- .../resolver/DefaultArtifactDescriptorReader.java | 2 +- .../internal/impl/model/ComplexActivationTest.java | 4 +- .../impl/standalone/TestApiStandalone.java | 2 +- .../it/MavenITmng8340GeneratedPomInTargetTest.java | 54 +++++++ .../org/apache/maven/it/TestSuiteOrdering.java | 1 + .../src/test/resources/mng-8340/.mvn/.gitkeep | 0 .../src/test/resources/mng-8340/child1/pom.xml | 42 +++++ .../src/test/resources/mng-8340/child2/pom.xml | 21 +++ .../src/test/resources/mng-8340/pom.xml | 15 ++ 15 files changed, 251 insertions(+), 166 deletions(-) diff --git a/api/maven-api-core/src/main/java/org/apache/maven/api/services/ModelBuilderRequest.java b/api/maven-api-core/src/main/java/org/apache/maven/api/services/ModelBuilderRequest.java index b9b3ebed9e..f29d253e4d 100644 --- a/api/maven-api-core/src/main/java/org/apache/maven/api/services/ModelBuilderRequest.java +++ b/api/maven-api-core/src/main/java/org/apache/maven/api/services/ModelBuilderRequest.java @@ -49,21 +49,26 @@ public interface ModelBuilderRequest { */ enum RequestType { /** - * The request is for building a model from a POM file in a project on the filesystem. + * The request is for building an initial model from a POM file in a project on the filesystem. */ - BUILD_POM, + BUILD_PROJECT, /** - * The request is for building the consumer POM. + * The request is for rebuilding the effective POM in a project on the filesystem. */ - CONSUMER_POM, + BUILD_EFFECTIVE, + /** + * The request is used specifically to parse the POM used as a basis for creating the consumer POM. + * This POM will not ungergo any profile activation. + */ + BUILD_CONSUMER, /** * The request is for building a model from a parent POM file from a downloaded artifact. */ - PARENT_POM, + CONSUMER_PARENT, /** * The request is for building a model from a dependency POM file from a downloaded artifact. */ - DEPENDENCY + CONSUMER_DEPENDENCY } /** diff --git a/impl/maven-core/src/main/java/org/apache/maven/internal/transformation/impl/DefaultConsumerPomBuilder.java b/impl/maven-core/src/main/java/org/apache/maven/internal/transformation/impl/DefaultConsumerPomBuilder.java index 265dabdcd7..138fc8c11d 100644 --- a/impl/maven-core/src/main/java/org/apache/maven/internal/transformation/impl/DefaultConsumerPomBuilder.java +++ b/impl/maven-core/src/main/java/org/apache/maven/internal/transformation/impl/DefaultConsumerPomBuilder.java @@ -21,14 +21,9 @@ package org.apache.maven.internal.transformation.impl; import javax.inject.Inject; import javax.inject.Named; -import java.io.File; -import java.io.IOException; -import java.io.InputStream; -import java.nio.file.Files; import java.nio.file.Path; import java.util.ArrayList; import java.util.List; -import java.util.Objects; import java.util.stream.Collectors; import org.apache.maven.api.SessionData; @@ -44,7 +39,6 @@ import org.apache.maven.api.services.ModelBuilderException; import org.apache.maven.api.services.ModelBuilderRequest; import org.apache.maven.api.services.ModelBuilderResult; import org.apache.maven.api.services.ModelSource; -import org.apache.maven.api.services.Source; import org.apache.maven.api.services.model.LifecycleBindingsInjector; import org.apache.maven.internal.impl.InternalSession; import org.apache.maven.model.v4.MavenModelVersion; @@ -95,10 +89,9 @@ class DefaultConsumerPomBuilder implements ConsumerPomBuilder { throws ModelBuilderException { InternalSession iSession = InternalSession.from(session); ModelBuilderRequest.ModelBuilderRequestBuilder request = ModelBuilderRequest.builder(); - request.requestType(ModelBuilderRequest.RequestType.CONSUMER_POM); + request.requestType(ModelBuilderRequest.RequestType.BUILD_CONSUMER); request.session(iSession); - // in order to resolve parents, we need to fake being at the correct location - request.source(new PomConsumerModelSource(project.getModel().getPomPath(), src)); + request.source(ModelSource.fromPath(src)); request.locationTracking(false); request.systemProperties(session.getSystemProperties()); request.userProperties(session.getUserProperties()); @@ -208,63 +201,4 @@ class DefaultConsumerPomBuilder implements ConsumerPomBuilder { .filter(r -> !org.apache.maven.api.Repository.CENTRAL_ID.equals(r.getId())) .collect(Collectors.toList()); } - - static class PomConsumerModelSource implements ModelSource { - final Path path; - final Path src; - - PomConsumerModelSource(Path path, Path src) { - this.path = path; - this.src = src; - } - - @Override - public Path getPath() { - return path; - } - - @Override - public InputStream openStream() throws IOException { - return Files.newInputStream(src); - } - - @Override - public String getLocation() { - return src.toString(); - } - - @Override - public Source resolve(String relative) { - return ModelSource.fromPath(path.resolve(relative)); - } - - @Override - public ModelSource resolve(ModelLocator locator, String relative) { - String norm = relative.replace('\\', File.separatorChar).replace('/', File.separatorChar); - Path path = getPath().getParent().resolve(norm); - Path relatedPom = locator.locateExistingPom(path); - if (relatedPom != null) { - return ModelSource.fromPath(relatedPom); - } - return null; - } - - @Override - public boolean equals(Object o) { - return this == o - || o.getClass() == getClass() - && Objects.equals(path, ((PomConsumerModelSource) o).path) - && Objects.equals(src, ((PomConsumerModelSource) o).src); - } - - @Override - public int hashCode() { - return Objects.hash(path, src); - } - - @Override - public String toString() { - return "PomConsumerModelSource[" + "path=" + path + ']'; - } - } } diff --git a/impl/maven-core/src/main/java/org/apache/maven/project/DefaultProjectBuilder.java b/impl/maven-core/src/main/java/org/apache/maven/project/DefaultProjectBuilder.java index 9de384e9e6..c473f43774 100644 --- a/impl/maven-core/src/main/java/org/apache/maven/project/DefaultProjectBuilder.java +++ b/impl/maven-core/src/main/java/org/apache/maven/project/DefaultProjectBuilder.java @@ -351,8 +351,8 @@ public class DefaultProjectBuilder implements ProjectBuilder { ModelBuilderRequest.RequestType type = pomFile != null && this.request.isProcessPlugins() && this.request.getValidationLevel() == ModelBuildingRequest.VALIDATION_LEVEL_STRICT - ? ModelBuilderRequest.RequestType.BUILD_POM - : ModelBuilderRequest.RequestType.PARENT_POM; + ? ModelBuilderRequest.RequestType.BUILD_EFFECTIVE + : ModelBuilderRequest.RequestType.CONSUMER_PARENT; MavenProject theProject = project; ModelBuilderRequest request = builder.source(modelSource) .requestType(type) @@ -489,7 +489,7 @@ public class DefaultProjectBuilder implements ProjectBuilder { }; ModelBuilderRequest modelBuildingRequest = getModelBuildingRequest() .source(ModelSource.fromPath(pomFile.toPath())) - .requestType(ModelBuilderRequest.RequestType.BUILD_POM) + .requestType(ModelBuilderRequest.RequestType.BUILD_PROJECT) .locationTracking(true) .recursive(recursive) .lifecycleBindingsInjector(injector) @@ -780,7 +780,7 @@ public class DefaultProjectBuilder implements ProjectBuilder { InternalSession internalSession = InternalSession.from(session); modelBuildingRequest.session(internalSession); - modelBuildingRequest.requestType(ModelBuilderRequest.RequestType.BUILD_POM); + modelBuildingRequest.requestType(ModelBuilderRequest.RequestType.BUILD_PROJECT); modelBuildingRequest.profiles( request.getProfiles() != null ? request.getProfiles().stream() @@ -913,7 +913,7 @@ public class DefaultProjectBuilder implements ProjectBuilder { } project.setPluginArtifactRepositories(pluginRepositories); - if (request.getRequestType() == ModelBuilderRequest.RequestType.BUILD_POM) { + if (request.getRequestType() == ModelBuilderRequest.RequestType.BUILD_PROJECT) { try { ProjectRealmCache.CacheRecord record = projectBuildingHelper.createProjectRealm(project, model3, projectBuildingRequest); diff --git a/impl/maven-core/src/test/java/org/apache/maven/internal/transformation/impl/ConsumerPomBuilderTest.java b/impl/maven-core/src/test/java/org/apache/maven/internal/transformation/impl/ConsumerPomBuilderTest.java index 510d5d6196..4b25258210 100644 --- a/impl/maven-core/src/test/java/org/apache/maven/internal/transformation/impl/ConsumerPomBuilderTest.java +++ b/impl/maven-core/src/test/java/org/apache/maven/internal/transformation/impl/ConsumerPomBuilderTest.java @@ -77,7 +77,7 @@ public class ConsumerPomBuilderTest extends AbstractRepositoryTestCase { Model orgModel = mbs.build(ModelBuilderRequest.builder() .session(InternalSession.from(session)) .source(ModelSource.fromPath(file)) - .requestType(ModelBuilderRequest.RequestType.BUILD_POM) + .requestType(ModelBuilderRequest.RequestType.BUILD_PROJECT) .build()) .getEffectiveModel(); @@ -103,7 +103,7 @@ public class ConsumerPomBuilderTest extends AbstractRepositoryTestCase { Model orgModel = mbs.build(ModelBuilderRequest.builder() .session(InternalSession.from(session)) .source(ModelSource.fromPath(file)) - .requestType(ModelBuilderRequest.RequestType.BUILD_POM) + .requestType(ModelBuilderRequest.RequestType.BUILD_PROJECT) .build()) .getEffectiveModel(); diff --git a/impl/maven-impl/src/main/java/org/apache/maven/internal/impl/model/DefaultModelBuilder.java b/impl/maven-impl/src/main/java/org/apache/maven/internal/impl/model/DefaultModelBuilder.java index c403bacd94..95a364bdd1 100644 --- a/impl/maven-impl/src/main/java/org/apache/maven/internal/impl/model/DefaultModelBuilder.java +++ b/impl/maven-impl/src/main/java/org/apache/maven/internal/impl/model/DefaultModelBuilder.java @@ -200,40 +200,42 @@ public class DefaultModelBuilder implements ModelBuilder { } public ModelBuilderSession newSession() { - return new ModelBuilderSession() { - DefaultModelBuilderSession mainSession; - - /** - * Builds a model based on the provided ModelBuilderRequest. - * - * @param request The request containing the parameters for building the model. - * @return The result of the model building process. - * @throws ModelBuilderException If an error occurs during model building. - */ - @Override - public ModelBuilderResult build(ModelBuilderRequest request) throws ModelBuilderException { - // Create or derive a session based on the request - DefaultModelBuilderSession session; - if (mainSession == null) { - mainSession = new DefaultModelBuilderSession(request); - session = mainSession; - } else { - session = mainSession.derive(request, new DefaultModelBuilderResult()); - } - // Build the request - if (request.getRequestType() == ModelBuilderRequest.RequestType.BUILD_POM) { - // build the build poms - session.buildBuildPom(); - } else { - // simply build the effective model - session.buildEffectiveModel(new LinkedHashSet<>()); - } - return session.result; + return new ModelBuilderSessionImpl(); + } + + protected class ModelBuilderSessionImpl implements ModelBuilderSession { + ModelBuilderSessionState mainSession; + + /** + * Builds a model based on the provided ModelBuilderRequest. + * + * @param request The request containing the parameters for building the model. + * @return The result of the model building process. + * @throws ModelBuilderException If an error occurs during model building. + */ + @Override + public ModelBuilderResult build(ModelBuilderRequest request) throws ModelBuilderException { + // Create or derive a session based on the request + ModelBuilderSessionState session; + if (mainSession == null) { + mainSession = new ModelBuilderSessionState(request); + session = mainSession; + } else { + session = mainSession.derive(request, new DefaultModelBuilderResult()); + } + // Build the request + if (request.getRequestType() == ModelBuilderRequest.RequestType.BUILD_PROJECT) { + // build the build poms + session.buildBuildPom(); + } else { + // simply build the effective model + session.buildEffectiveModel(new LinkedHashSet<>()); } - }; + return session.result; + } } - protected class DefaultModelBuilderSession implements ModelProblemCollector { + protected class ModelBuilderSessionState implements ModelProblemCollector { private static final Pattern REGEX = Pattern.compile("\\$\\{([^}]+)}"); final Session session; @@ -251,7 +253,7 @@ public class DefaultModelBuilder implements ModelBuilder { List<RemoteRepository> externalRepositories; List<RemoteRepository> repositories; - DefaultModelBuilderSession(ModelBuilderRequest request) { + ModelBuilderSessionState(ModelBuilderRequest request) { this( request.getSession(), request, @@ -274,7 +276,7 @@ public class DefaultModelBuilder implements ModelBuilder { } @SuppressWarnings("checkstyle:ParameterNumber") - private DefaultModelBuilderSession( + private ModelBuilderSessionState( Session session, ModelBuilderRequest request, DefaultModelBuilderResult result, @@ -296,26 +298,26 @@ public class DefaultModelBuilder implements ModelBuilder { this.result.setSource(this.request.getSource()); } - DefaultModelBuilderSession derive(ModelSource source) { + ModelBuilderSessionState derive(ModelSource source) { return derive(source, new DefaultModelBuilderResult(result)); } - DefaultModelBuilderSession derive(ModelSource source, DefaultModelBuilderResult result) { + ModelBuilderSessionState derive(ModelSource source, DefaultModelBuilderResult result) { return derive(ModelBuilderRequest.build(request, source), result); } /** * Creates a new session, sharing cached datas and propagating errors. */ - DefaultModelBuilderSession derive(ModelBuilderRequest request) { + ModelBuilderSessionState derive(ModelBuilderRequest request) { return derive(request, new DefaultModelBuilderResult(result)); } - DefaultModelBuilderSession derive(ModelBuilderRequest request, DefaultModelBuilderResult result) { + ModelBuilderSessionState derive(ModelBuilderRequest request, DefaultModelBuilderResult result) { if (session != request.getSession()) { throw new IllegalArgumentException("Session mismatch"); } - return new DefaultModelBuilderSession( + return new ModelBuilderSessionState( session, request, result, @@ -669,7 +671,7 @@ public class DefaultModelBuilder implements ModelBuilder { try (PhasingExecutor executor = createExecutor()) { for (DefaultModelBuilderResult r : allResults) { executor.execute(() -> { - DefaultModelBuilderSession mbs = derive(r.getSource(), r); + ModelBuilderSessionState mbs = derive(r.getSource(), r); try { mbs.buildEffectiveModel(new LinkedHashSet<>()); } catch (ModelBuilderException e) { @@ -815,7 +817,7 @@ public class DefaultModelBuilder implements ModelBuilder { resultModel = pluginManagementInjector.injectManagement(resultModel, request, this); // lifecycle bindings injection - if (request.getRequestType() != ModelBuilderRequest.RequestType.DEPENDENCY) { + if (request.getRequestType() != ModelBuilderRequest.RequestType.CONSUMER_DEPENDENCY) { org.apache.maven.api.services.ModelTransformer lifecycleBindingsInjector = request.getLifecycleBindingsInjector(); if (lifecycleBindingsInjector != null) { @@ -831,7 +833,7 @@ public class DefaultModelBuilder implements ModelBuilder { resultModel = modelNormalizer.injectDefaultValues(resultModel, request, this); - if (request.getRequestType() != ModelBuilderRequest.RequestType.DEPENDENCY) { + if (request.getRequestType() != ModelBuilderRequest.RequestType.CONSUMER_DEPENDENCY) { // plugins configuration resultModel = pluginConfigurationExpander.expandPluginConfiguration(resultModel, request, this); } @@ -853,9 +855,7 @@ public class DefaultModelBuilder implements ModelBuilder { // effective model validation modelValidator.validateEffectiveModel( resultModel, - request.getRequestType() == ModelBuilderRequest.RequestType.BUILD_POM - ? ModelValidator.VALIDATION_LEVEL_STRICT - : ModelValidator.VALIDATION_LEVEL_MINIMAL, + isBuildRequest() ? ModelValidator.VALIDATION_LEVEL_STRICT : ModelValidator.VALIDATION_LEVEL_MINIMAL, request, this); @@ -896,8 +896,7 @@ public class DefaultModelBuilder implements ModelBuilder { private Model resolveParent(Model childModel) { Model parentModel = null; - if (request.getRequestType() == ModelBuilderRequest.RequestType.BUILD_POM - || request.getRequestType() == ModelBuilderRequest.RequestType.CONSUMER_POM) { + if (isBuildRequest()) { parentModel = readParentLocally(childModel); } if (parentModel == null) { @@ -911,18 +910,30 @@ public class DefaultModelBuilder implements ModelBuilder { Parent parent = childModel.getParent(); String parentPath = parent.getRelativePath(); - if (parentPath != null && !parentPath.isEmpty()) { - candidateSource = request.getSource().resolve(modelProcessor::locateExistingPom, parentPath); - if (candidateSource == null) { - wrongParentRelativePath(childModel); - return null; + if (request.getRequestType() == ModelBuilderRequest.RequestType.BUILD_PROJECT) { + if (parentPath != null && !parentPath.isEmpty()) { + candidateSource = request.getSource().resolve(modelProcessor::locateExistingPom, parentPath); + if (candidateSource == null) { + wrongParentRelativePath(childModel); + return null; + } + } else { + candidateSource = + resolveReactorModel(parent.getGroupId(), parent.getArtifactId(), parent.getVersion()); + if (candidateSource == null && parentPath == null) { + candidateSource = request.getSource().resolve(modelProcessor::locateExistingPom, ".."); + } } - } - if (candidateSource == null) { + } else { candidateSource = resolveReactorModel(parent.getGroupId(), parent.getArtifactId(), parent.getVersion()); - } - if (candidateSource == null && parentPath == null) { - candidateSource = request.getSource().resolve(modelProcessor::locateExistingPom, ".."); + if (candidateSource == null) { + if (parentPath == null) { + parentPath = ".."; + } + if (!parentPath.isEmpty()) { + candidateSource = request.getSource().resolve(modelProcessor::locateExistingPom, parentPath); + } + } } if (candidateSource == null) { @@ -1056,7 +1067,7 @@ public class DefaultModelBuilder implements ModelBuilder { buffer.append(" for ").append(ModelProblemUtils.toId(childModel)); } buffer.append(": ").append(e.getMessage()); - if (request.getRequestType() == ModelBuilderRequest.RequestType.BUILD_POM) { + if (request.getRequestType() == ModelBuilderRequest.RequestType.BUILD_PROJECT) { buffer.append(" and parent could not be found in reactor"); } @@ -1065,7 +1076,7 @@ public class DefaultModelBuilder implements ModelBuilder { } ModelBuilderRequest lenientRequest = ModelBuilderRequest.builder(request) - .requestType(ModelBuilderRequest.RequestType.PARENT_POM) + .requestType(ModelBuilderRequest.RequestType.CONSUMER_PARENT) .source(modelSource) .build(); @@ -1163,13 +1174,13 @@ public class DefaultModelBuilder implements ModelBuilder { // path correctly if it was not set in the input model if (inputModel.getParent() != null && inputModel.getParent().getRelativePath() == null) { String relPath; - if (parentModel.getPomFile() != null - && (request.getRequestType() == ModelBuilderRequest.RequestType.BUILD_POM - || request.getRequestType() == ModelBuilderRequest.RequestType.CONSUMER_POM)) { + if (parentModel.getPomFile() != null && isBuildRequest()) { relPath = inputModel .getPomFile() .getParent() - .relativize(parentModel.getPomFile().getParent()) + .toAbsolutePath() + .relativize( + parentModel.getPomFile().toAbsolutePath().getParent()) .toString(); } else { relPath = ".."; @@ -1232,7 +1243,7 @@ public class DefaultModelBuilder implements ModelBuilder { private List<Profile> getActiveProfiles( Collection<Profile> interpolatedProfiles, DefaultProfileActivationContext profileActivationContext) { - if (request.getRequestType() != ModelBuilderRequest.RequestType.CONSUMER_POM) { + if (isBuildRequestWithActivation()) { return profileSelector.getActiveProfiles(interpolatedProfiles, profileActivationContext, this); } else { return List.of(); @@ -1254,7 +1265,7 @@ public class DefaultModelBuilder implements ModelBuilder { setSource(modelSource.getLocation()); logger.debug("Reading file model from " + modelSource.getLocation()); try { - boolean strict = request.getRequestType() == ModelBuilderRequest.RequestType.BUILD_POM; + boolean strict = isBuildRequest(); try { rootDirectory = request.getSession().getRootDirectory(); } catch (IllegalStateException ignore) { @@ -1335,8 +1346,7 @@ public class DefaultModelBuilder implements ModelBuilder { } } - if (request.getRequestType() == ModelBuilderRequest.RequestType.BUILD_POM - || request.getRequestType() == ModelBuilderRequest.RequestType.CONSUMER_POM) { + if (isBuildRequest()) { model = model.withPomFile(modelSource.getPath()); Parent parent = model.getParent(); @@ -1437,9 +1447,7 @@ public class DefaultModelBuilder implements ModelBuilder { setSource(model); modelValidator.validateFileModel( model, - request.getRequestType() == ModelBuilderRequest.RequestType.BUILD_POM - ? ModelValidator.VALIDATION_LEVEL_STRICT - : ModelValidator.VALIDATION_LEVEL_MINIMAL, + isBuildRequest() ? ModelValidator.VALIDATION_LEVEL_STRICT : ModelValidator.VALIDATION_LEVEL_MINIMAL, request, this); if (hasFatalErrors()) { @@ -1459,12 +1467,9 @@ public class DefaultModelBuilder implements ModelBuilder { } private Model doReadRawModel() throws ModelBuilderException { - ModelBuilderRequest request = this.request; Model rawModel = readFileModel(); - if (!MODEL_VERSION_4_0_0.equals(rawModel.getModelVersion()) - && (request.getRequestType() == ModelBuilderRequest.RequestType.BUILD_POM - || request.getRequestType() == ModelBuilderRequest.RequestType.CONSUMER_POM)) { + if (!MODEL_VERSION_4_0_0.equals(rawModel.getModelVersion()) && isBuildRequest()) { rawModel = transformFileToRaw(rawModel); } @@ -1474,9 +1479,7 @@ public class DefaultModelBuilder implements ModelBuilder { modelValidator.validateRawModel( rawModel, - request.getRequestType() == ModelBuilderRequest.RequestType.BUILD_POM - ? ModelValidator.VALIDATION_LEVEL_STRICT - : ModelValidator.VALIDATION_LEVEL_MINIMAL, + isBuildRequest() ? ModelValidator.VALIDATION_LEVEL_STRICT : ModelValidator.VALIDATION_LEVEL_MINIMAL, request, this); @@ -1679,7 +1682,7 @@ public class DefaultModelBuilder implements ModelBuilder { } catch (IllegalStateException e) { rootDirectory = null; } - if (request.getRequestType() == ModelBuilderRequest.RequestType.BUILD_POM && rootDirectory != null) { + if (request.getRequestType() == ModelBuilderRequest.RequestType.BUILD_PROJECT && rootDirectory != null) { Path sourcePath = importSource.getPath(); if (sourcePath != null && sourcePath.startsWith(rootDirectory)) { add( @@ -1694,13 +1697,13 @@ public class DefaultModelBuilder implements ModelBuilder { try { ModelBuilderRequest importRequest = ModelBuilderRequest.builder() .session(request.getSession()) - .requestType(ModelBuilderRequest.RequestType.DEPENDENCY) + .requestType(ModelBuilderRequest.RequestType.CONSUMER_DEPENDENCY) .systemProperties(request.getSystemProperties()) .userProperties(request.getUserProperties()) .source(importSource) .repositories(repositories) .build(); - DefaultModelBuilderSession modelBuilderSession = derive(importRequest); + ModelBuilderSessionState modelBuilderSession = derive(importRequest); // build the effective model modelBuilderSession.buildEffectiveModel(importIds); importResult = modelBuilderSession.result; @@ -1738,6 +1741,16 @@ public class DefaultModelBuilder implements ModelBuilder { return cache.computeIfAbsent(source, tag, supplier); } + boolean isBuildRequest() { + return request.getRequestType() == ModelBuilderRequest.RequestType.BUILD_PROJECT + || request.getRequestType() == ModelBuilderRequest.RequestType.BUILD_EFFECTIVE + || request.getRequestType() == ModelBuilderRequest.RequestType.BUILD_CONSUMER; + } + + boolean isBuildRequestWithActivation() { + return request.getRequestType() != ModelBuilderRequest.RequestType.BUILD_CONSUMER; + } + private List<Profile> interpolateActivations( List<Profile> profiles, DefaultProfileActivationContext context, ModelProblemCollector problems) { if (profiles.stream() @@ -1816,7 +1829,7 @@ public class DefaultModelBuilder implements ModelBuilder { } public Model buildRawModel(ModelBuilderRequest request) throws ModelBuilderException { - DefaultModelBuilderSession build = new DefaultModelBuilderSession(request); + ModelBuilderSessionState build = new ModelBuilderSessionState(request); Model model = build.readRawModel(); if (((ModelProblemCollector) build).hasErrors()) { throw build.newModelBuilderException(); diff --git a/impl/maven-impl/src/main/java/org/apache/maven/internal/impl/model/DefaultModelInterpolator.java b/impl/maven-impl/src/main/java/org/apache/maven/internal/impl/model/DefaultModelInterpolator.java index 927ed72f35..c15e34380c 100644 --- a/impl/maven-impl/src/main/java/org/apache/maven/internal/impl/model/DefaultModelInterpolator.java +++ b/impl/maven-impl/src/main/java/org/apache/maven/internal/impl/model/DefaultModelInterpolator.java @@ -123,7 +123,7 @@ public class DefaultModelInterpolator implements ModelInterpolator { } protected List<String> getProjectPrefixes(ModelBuilderRequest request) { - return request.getRequestType() == ModelBuilderRequest.RequestType.BUILD_POM + return request.getRequestType() == ModelBuilderRequest.RequestType.BUILD_PROJECT ? PROJECT_PREFIXES_4_0 : PROJECT_PREFIXES_3_1; } diff --git a/impl/maven-impl/src/main/java/org/apache/maven/internal/impl/resolver/DefaultArtifactDescriptorReader.java b/impl/maven-impl/src/main/java/org/apache/maven/internal/impl/resolver/DefaultArtifactDescriptorReader.java index 82bae431cf..29d7b5439d 100644 --- a/impl/maven-impl/src/main/java/org/apache/maven/internal/impl/resolver/DefaultArtifactDescriptorReader.java +++ b/impl/maven-impl/src/main/java/org/apache/maven/internal/impl/resolver/DefaultArtifactDescriptorReader.java @@ -194,7 +194,7 @@ public class DefaultArtifactDescriptorReader implements ArtifactDescriptorReader pomArtifact.getGroupId() + ":" + pomArtifact.getArtifactId() + ":" + pomArtifact.getVersion(); ModelBuilderRequest modelRequest = ModelBuilderRequest.builder() .session(iSession) - .requestType(ModelBuilderRequest.RequestType.DEPENDENCY) + .requestType(ModelBuilderRequest.RequestType.CONSUMER_DEPENDENCY) .source(ModelSource.fromPath(pomArtifact.getPath(), gav)) // This merge is on purpose because otherwise user properties would override model // properties in dependencies the user does not know. See MNG-7563 for details. diff --git a/impl/maven-impl/src/test/java/org/apache/maven/internal/impl/model/ComplexActivationTest.java b/impl/maven-impl/src/test/java/org/apache/maven/internal/impl/model/ComplexActivationTest.java index 3a7c5130df..df86fcc956 100644 --- a/impl/maven-impl/src/test/java/org/apache/maven/internal/impl/model/ComplexActivationTest.java +++ b/impl/maven-impl/src/test/java/org/apache/maven/internal/impl/model/ComplexActivationTest.java @@ -56,7 +56,7 @@ class ComplexActivationTest { void testAndConditionInActivation() throws Exception { ModelBuilderRequest request = ModelBuilderRequest.builder() .session(session) - .requestType(ModelBuilderRequest.RequestType.BUILD_POM) + .requestType(ModelBuilderRequest.RequestType.BUILD_PROJECT) .source(ModelSource.fromPath(getPom("complex"))) .systemProperties(Map.of("myproperty", "test")) .build(); @@ -71,7 +71,7 @@ class ComplexActivationTest { public void testConditionExistingAndMissingInActivation() throws Exception { ModelBuilderRequest request = ModelBuilderRequest.builder() .session(session) - .requestType(ModelBuilderRequest.RequestType.BUILD_POM) + .requestType(ModelBuilderRequest.RequestType.BUILD_PROJECT) .source(ModelSource.fromPath(getPom("complexExistsAndMissing"))) .build(); ModelBuilderResult result = builder.newSession().build(request); diff --git a/impl/maven-impl/src/test/java/org/apache/maven/internal/impl/standalone/TestApiStandalone.java b/impl/maven-impl/src/test/java/org/apache/maven/internal/impl/standalone/TestApiStandalone.java index d6a6f29f1e..646ee273e0 100644 --- a/impl/maven-impl/src/test/java/org/apache/maven/internal/impl/standalone/TestApiStandalone.java +++ b/impl/maven-impl/src/test/java/org/apache/maven/internal/impl/standalone/TestApiStandalone.java @@ -47,7 +47,7 @@ class TestApiStandalone { .build(ModelBuilderRequest.builder() .session(session) .source(ModelSource.fromPath(Paths.get("pom.xml").toAbsolutePath())) - .requestType(ModelBuilderRequest.RequestType.BUILD_POM) + .requestType(ModelBuilderRequest.RequestType.BUILD_PROJECT) .recursive(true) .build()); assertNotNull(result.getEffectiveModel()); diff --git a/its/core-it-suite/src/test/java/org/apache/maven/it/MavenITmng8340GeneratedPomInTargetTest.java b/its/core-it-suite/src/test/java/org/apache/maven/it/MavenITmng8340GeneratedPomInTargetTest.java new file mode 100644 index 0000000000..f3d10b3315 --- /dev/null +++ b/its/core-it-suite/src/test/java/org/apache/maven/it/MavenITmng8340GeneratedPomInTargetTest.java @@ -0,0 +1,54 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ +package org.apache.maven.it; + +import java.io.File; +import java.util.List; + +import org.apache.maven.shared.verifier.Verifier; +import org.apache.maven.shared.verifier.util.ResourceExtractor; +import org.junit.jupiter.api.Test; + +/** + * This is a test set for <a href="https://issues.apache.org/jira/browse/MNG-8340">MNG-8340</a>. + */ +class MavenITmng8340GeneratedPomInTargetTest extends AbstractMavenIntegrationTestCase { + + MavenITmng8340GeneratedPomInTargetTest() { + super("[3.8.6,4.0.0-beta-5),[4.0.0-beta-6,)"); + } + + /** + * Verify that the build succeeds. + */ + @Test + void testProjectWithShadePluginAndGeneratedPomUnderTarget() throws Exception { + File testDir = ResourceExtractor.simpleExtractResources(getClass(), "/mng-8340"); + + Verifier verifier = newVerifier(testDir.getAbsolutePath()); + verifier.addCliArgument("install"); + verifier.execute(); + verifier.verifyErrorFreeLog(); + + List<String> l = verifier.loadLines(verifier.getLogFileName(), "UTF-8"); + assertFalse(l.stream() + .anyMatch(i -> i.contains( + "[FATAL] 'parent.relativePath' points at '../../pom.xml' but no POM could be found"))); + } +} diff --git a/its/core-it-suite/src/test/java/org/apache/maven/it/TestSuiteOrdering.java b/its/core-it-suite/src/test/java/org/apache/maven/it/TestSuiteOrdering.java index e864606d7b..4bf5b649eb 100644 --- a/its/core-it-suite/src/test/java/org/apache/maven/it/TestSuiteOrdering.java +++ b/its/core-it-suite/src/test/java/org/apache/maven/it/TestSuiteOrdering.java @@ -120,6 +120,7 @@ public class TestSuiteOrdering implements ClassOrderer { * the tests are to finishing. Newer tests are also more likely to fail, so this is * a fail fast technique as well. */ + suite.addTestSuite(MavenITmng8340GeneratedPomInTargetTest.class); suite.addTestSuite(MavenITmng8360SubprojectProfileActivationTest.class); suite.addTestSuite(MavenITmng8347TransitiveDependencyManagerTest.class); suite.addTestSuite(MavenITmng8341DeadlockTest.class); diff --git a/its/core-it-suite/src/test/resources/mng-8340/.mvn/.gitkeep b/its/core-it-suite/src/test/resources/mng-8340/.mvn/.gitkeep new file mode 100644 index 0000000000..e69de29bb2 diff --git a/its/core-it-suite/src/test/resources/mng-8340/child1/pom.xml b/its/core-it-suite/src/test/resources/mng-8340/child1/pom.xml new file mode 100644 index 0000000000..be68873dd6 --- /dev/null +++ b/its/core-it-suite/src/test/resources/mng-8340/child1/pom.xml @@ -0,0 +1,42 @@ +<?xml version="1.0" encoding="UTF-8"?> +<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/maven-v4_0_0.xsd"> + + <modelVersion>4.0.0</modelVersion> + <parent> + <groupId>org.apache.maven.it.mng8340</groupId> + <artifactId>root</artifactId> + <version>1.0.0</version> + </parent> + + <artifactId>child1</artifactId> + + <dependencies> + <dependency> + <groupId>org.slf4j</groupId> + <artifactId>slf4j-api</artifactId> + <version>2.0.16</version> + </dependency> + </dependencies> + + <build> + <plugins> + <plugin> + <groupId>org.apache.maven.plugins</groupId> + <artifactId>maven-shade-plugin</artifactId> + <version>3.5.0</version> + <executions> + <execution> + <id>shade</id> + <goals> + <goal>shade</goal> + </goals> + <phase>package</phase> + <configuration> + <dependencyReducedPomLocation>${basedir}/target/dr-pom.xml</dependencyReducedPomLocation> + </configuration> + </execution> + </executions> + </plugin> + </plugins> + </build> +</project> diff --git a/its/core-it-suite/src/test/resources/mng-8340/child2/pom.xml b/its/core-it-suite/src/test/resources/mng-8340/child2/pom.xml new file mode 100644 index 0000000000..defeefc3c5 --- /dev/null +++ b/its/core-it-suite/src/test/resources/mng-8340/child2/pom.xml @@ -0,0 +1,21 @@ +<?xml version="1.0" encoding="UTF-8"?> +<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/maven-v4_0_0.xsd"> + + <modelVersion>4.0.0</modelVersion> + <parent> + <groupId>org.apache.maven.it.mng8340</groupId> + <artifactId>root</artifactId> + <version>1.0.0</version> + </parent> + + <artifactId>child2</artifactId> + + <dependencies> + <dependency> + <groupId>org.apache.maven.it.mng8340</groupId> + <artifactId>child1</artifactId> + <version>${project.version}</version> + </dependency> + </dependencies> + +</project> diff --git a/its/core-it-suite/src/test/resources/mng-8340/pom.xml b/its/core-it-suite/src/test/resources/mng-8340/pom.xml new file mode 100644 index 0000000000..2a04859db9 --- /dev/null +++ b/its/core-it-suite/src/test/resources/mng-8340/pom.xml @@ -0,0 +1,15 @@ +<?xml version="1.0" encoding="UTF-8"?> +<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/maven-v4_0_0.xsd"> + + <modelVersion>4.0.0</modelVersion> + + <groupId>org.apache.maven.it.mng8340</groupId> + <artifactId>root</artifactId> + <version>1.0.0</version> + <packaging>pom</packaging> + + <modules> + <module>child1</module> + <module>child2</module> + </modules> +</project>