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 2024/11/13 19:27:02 UTC
(maven) branch master updated: [MNG-8340] Resolve parent according to the exact model location (#1857)
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 <gn...@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>