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 2b13a43c09 [MNG-8235] Move remote repositories into requests (#1712)
2b13a43c09 is described below

commit 2b13a43c09896ffbdb10dc247a618b6b4fd97f85
Author: Guillaume Nodet <[email protected]>
AuthorDate: Thu Sep 12 08:19:14 2024 +0200

    [MNG-8235] Move remote repositories into requests (#1712)
---
 .../main/java/org/apache/maven/api/Session.java    | 59 +++++++++++++++++++++-
 .../maven/api/services/ArtifactResolver.java       | 20 ++++++++
 .../api/services/ArtifactResolverRequest.java      | 41 ++++++++++++++-
 .../api/services/DependencyResolverRequest.java    | 24 ++++++++-
 .../maven/api/services/ModelBuilderRequest.java    | 24 ++++++++-
 .../maven/api/services/ModelBuilderResult.java     |  2 +-
 .../apache/maven/api/services/ModelResolver.java   | 18 ++++++-
 .../maven/api/services/ProjectBuilderRequest.java  | 24 ++++++++-
 .../maven/api/services/VersionRangeResolver.java   | 27 ++++++++++
 .../api/services/VersionRangeResolverRequest.java  | 37 +++++++++++++-
 .../maven/api/services/VersionResolverRequest.java | 40 ++++++++++++++-
 .../maven/internal/impl/AbstractSession.java       | 49 ++++++++++++++++++
 .../internal/impl/DefaultArtifactResolver.java     |  3 +-
 .../internal/impl/DefaultDependencyResolver.java   | 11 ++--
 .../internal/impl/DefaultVersionRangeResolver.java |  5 +-
 .../internal/impl/DefaultVersionResolver.java      |  5 +-
 .../internal/impl/model/DefaultModelBuilder.java   | 20 ++++----
 .../resolver/DefaultArtifactDescriptorReader.java  | 42 +++++++--------
 .../impl/resolver/DefaultModelResolver.java        | 19 ++++---
 .../impl/resolver/DefaultModelResolverTest.java    | 20 ++++----
 .../maven/internal/impl/DefaultProjectBuilder.java |  7 +--
 .../plugin/internal/DefaultMavenPluginManager.java |  5 --
 .../maven/project/DefaultProjectBuilder.java       | 38 +++++++++-----
 .../impl/ConsumerPomBuilderTest.java               |  9 +++-
 24 files changed, 457 insertions(+), 92 deletions(-)

diff --git a/api/maven-api-core/src/main/java/org/apache/maven/api/Session.java 
b/api/maven-api-core/src/main/java/org/apache/maven/api/Session.java
index bc20c35b7d..26eeaf118d 100644
--- a/api/maven-api-core/src/main/java/org/apache/maven/api/Session.java
+++ b/api/maven-api-core/src/main/java/org/apache/maven/api/Session.java
@@ -38,7 +38,6 @@ import org.apache.maven.api.settings.Settings;
 /**
  * The session to install / deploy / resolve artifacts and dependencies.
  *
- * TODO: move the remote repositories in the requests (plugins will need to 
access this list somehow)
  * TODO: add request trace so that requests can be linked together and through 
the resolver
  * TODO: add a Request interface holding session + parent request
  *
@@ -425,6 +424,19 @@ public interface Session {
     @Nonnull
     DownloadedArtifact resolveArtifact(@Nonnull ArtifactCoordinates 
coordinates);
 
+    /**
+     * Shortcut for {@code getService(ArtifactResolver.class).resolve(...)}.
+     *
+     * @param coordinates coordinates of the artifact to resolve
+     * @param repositories repositories to use, if {@code null}, the session 
repositories are used
+     * @return requested artifact together with the path to its file
+     * @throws org.apache.maven.api.services.ArtifactResolverException if the 
artifact resolution failed
+     *
+     * @see org.apache.maven.api.services.ArtifactResolver#resolve(Session, 
Collection)
+     */
+    @Nonnull
+    DownloadedArtifact resolveArtifact(@Nonnull ArtifactCoordinates 
coordinates, List<RemoteRepository> repositories);
+
     /**
      * Shortcut for {@code getService(ArtifactResolver.class).resolve(...)}.
      *
@@ -449,6 +461,21 @@ public interface Session {
     @Nonnull
     Collection<DownloadedArtifact> resolveArtifacts(@Nonnull Collection<? 
extends ArtifactCoordinates> coordinates);
 
+    /**
+     * Shortcut for {@code getService(ArtifactResolver.class).resolve(...)}.
+     *
+     * @param coordinates coordinates of all artifacts to resolve
+     * @param repositories repositories to use, if {@code null}, the session 
repositories are used
+     * @return requested artifacts together with the paths to their files
+     * @throws org.apache.maven.api.services.ArtifactResolverException if the 
artifact resolution failed
+     *
+     * @see org.apache.maven.api.services.ArtifactResolver#resolve(Session, 
Collection)
+     */
+    @Nonnull
+    Collection<DownloadedArtifact> resolveArtifacts(
+            @Nonnull Collection<? extends ArtifactCoordinates> coordinates,
+            @Nullable List<RemoteRepository> repositories);
+
     /**
      * Shortcut for {@code getService(ArtifactResolver.class).resolve(...)}.
      *
@@ -461,6 +488,19 @@ public interface Session {
     @Nonnull
     DownloadedArtifact resolveArtifact(@Nonnull Artifact artifact);
 
+    /**
+     * Shortcut for {@code getService(ArtifactResolver.class).resolve(...)}.
+     *
+     * @param artifact the artifact to resolve
+     * @param repositories repositories to use, if {@code null}, the session 
repositories are used
+     * @return requested artifact together with the path to its file
+     * @throws org.apache.maven.api.services.ArtifactResolverException if the 
artifact resolution failed
+     *
+     * @see org.apache.maven.api.services.ArtifactResolver#resolve(Session, 
Collection)
+     */
+    @Nonnull
+    DownloadedArtifact resolveArtifact(@Nonnull Artifact artifact, @Nullable 
List<RemoteRepository> repositories);
+
     /**
      * Shortcut for {@code getService(ArtifactResolver.class).resolve(...)}.
      *
@@ -717,6 +757,23 @@ public interface Session {
     @Nonnull
     List<Version> resolveVersionRange(@Nonnull ArtifactCoordinates artifact);
 
+    /**
+     * Expands a version range to a list of matching versions, in ascending 
order.
+     * For example, resolves "[3.8,4.0)" to "3.8", "3.8.1", "3.8.2".
+     * The returned list of versions is only dependent on the configured 
repositories and their contents.
+     * The supplied request may also refer to a single concrete version rather 
than a version range.
+     * In this case though, the result contains simply the (parsed) input 
version, regardless of the
+     * repositories and their contents.
+     *
+     * @param artifact the artifact for which to resolve the versions
+     * @param repositories the repositories to use, or the session 
repositories if {@code null}
+     * @return a list of resolved {@code Version}s.
+     * @throws org.apache.maven.api.services.VersionRangeResolverException if 
the resolution failed
+     * @see 
org.apache.maven.api.services.VersionRangeResolver#resolve(Session, 
ArtifactCoordinates) (String)
+     */
+    @Nonnull
+    List<Version> resolveVersionRange(@Nonnull ArtifactCoordinates artifact, 
List<RemoteRepository> repositories);
+
     /**
      * Parses the specified version string, for example "1.0".
      * <p>
diff --git 
a/api/maven-api-core/src/main/java/org/apache/maven/api/services/ArtifactResolver.java
 
b/api/maven-api-core/src/main/java/org/apache/maven/api/services/ArtifactResolver.java
index 31e2d8d276..c4c413c547 100644
--- 
a/api/maven-api-core/src/main/java/org/apache/maven/api/services/ArtifactResolver.java
+++ 
b/api/maven-api-core/src/main/java/org/apache/maven/api/services/ArtifactResolver.java
@@ -19,8 +19,10 @@
 package org.apache.maven.api.services;
 
 import java.util.Collection;
+import java.util.List;
 
 import org.apache.maven.api.ArtifactCoordinates;
+import org.apache.maven.api.RemoteRepository;
 import org.apache.maven.api.Service;
 import org.apache.maven.api.Session;
 import org.apache.maven.api.annotations.Experimental;
@@ -55,4 +57,22 @@ public interface ArtifactResolver extends Service {
     default ArtifactResolverResult resolve(Session session, Collection<? 
extends ArtifactCoordinates> coordinates) {
         return resolve(ArtifactResolverRequest.build(session, coordinates));
     }
+
+    /**
+     * Resolves several artifacts from their coordinates.
+     *
+     * @param session {@link Session}
+     * @param repositories the list of remote repositories or {@code null} to 
use the session repositories
+     * @param coordinates array of {@link ArtifactCoordinates}
+     * @return {@link ArtifactResolverResult}
+     * @throws ArtifactResolverException in case of an error.
+     * @throws IllegalArgumentException in case of parameter {@code 
buildingRequest} is {@code null} or
+     *             parameter {@code coordinates} is {@code null} or invalid
+     */
+    default ArtifactResolverResult resolve(
+            Session session,
+            Collection<? extends ArtifactCoordinates> coordinates,
+            List<RemoteRepository> repositories) {
+        return resolve(ArtifactResolverRequest.build(session, coordinates, 
repositories));
+    }
 }
diff --git 
a/api/maven-api-core/src/main/java/org/apache/maven/api/services/ArtifactResolverRequest.java
 
b/api/maven-api-core/src/main/java/org/apache/maven/api/services/ArtifactResolverRequest.java
index 7cfbcbc7c4..6fa14cc4fb 100644
--- 
a/api/maven-api-core/src/main/java/org/apache/maven/api/services/ArtifactResolverRequest.java
+++ 
b/api/maven-api-core/src/main/java/org/apache/maven/api/services/ArtifactResolverRequest.java
@@ -19,13 +19,16 @@
 package org.apache.maven.api.services;
 
 import java.util.Collection;
+import java.util.List;
 
 import org.apache.maven.api.ArtifactCoordinates;
+import org.apache.maven.api.RemoteRepository;
 import org.apache.maven.api.Session;
 import org.apache.maven.api.annotations.Experimental;
 import org.apache.maven.api.annotations.Immutable;
 import org.apache.maven.api.annotations.Nonnull;
 import org.apache.maven.api.annotations.NotThreadSafe;
+import org.apache.maven.api.annotations.Nullable;
 
 import static org.apache.maven.api.services.BaseRequest.nonNull;
 
@@ -43,6 +46,9 @@ public interface ArtifactResolverRequest {
     @Nonnull
     Collection<? extends ArtifactCoordinates> getCoordinates();
 
+    @Nonnull
+    List<RemoteRepository> getRepositories();
+
     @Nonnull
     static ArtifactResolverRequestBuilder builder() {
         return new ArtifactResolverRequestBuilder();
@@ -57,10 +63,23 @@ public interface ArtifactResolverRequest {
                 .build();
     }
 
+    @Nonnull
+    static ArtifactResolverRequest build(
+            @Nonnull Session session,
+            @Nonnull Collection<? extends ArtifactCoordinates> coordinates,
+            List<RemoteRepository> repositories) {
+        return builder()
+                .session(nonNull(session, "session cannot be null"))
+                .coordinates(nonNull(coordinates, "coordinates cannot be 
null"))
+                .repositories(repositories)
+                .build();
+    }
+
     @NotThreadSafe
     class ArtifactResolverRequestBuilder {
         Session session;
         Collection<? extends ArtifactCoordinates> coordinates;
+        List<RemoteRepository> repositories;
 
         ArtifactResolverRequestBuilder() {}
 
@@ -76,19 +95,31 @@ public interface ArtifactResolverRequest {
             return this;
         }
 
+        @Nonnull
+        public ArtifactResolverRequestBuilder 
repositories(List<RemoteRepository> repositories) {
+            this.repositories = repositories;
+            return this;
+        }
+
         @Nonnull
         public ArtifactResolverRequest build() {
-            return new DefaultArtifactResolverRequest(session, coordinates);
+            return new DefaultArtifactResolverRequest(session, coordinates, 
repositories);
         }
 
         private static class DefaultArtifactResolverRequest extends 
BaseRequest implements ArtifactResolverRequest {
             @Nonnull
             private final Collection<? extends ArtifactCoordinates> 
coordinates;
 
+            @Nullable
+            private final List<RemoteRepository> repositories;
+
             DefaultArtifactResolverRequest(
-                    @Nonnull Session session, @Nonnull Collection<? extends 
ArtifactCoordinates> coordinates) {
+                    @Nonnull Session session,
+                    @Nonnull Collection<? extends ArtifactCoordinates> 
coordinates,
+                    @Nonnull List<RemoteRepository> repositories) {
                 super(session);
                 this.coordinates = unmodifiable(nonNull(coordinates, 
"coordinates cannot be null"));
+                this.repositories = repositories;
             }
 
             @Nonnull
@@ -96,6 +127,12 @@ public interface ArtifactResolverRequest {
             public Collection<? extends ArtifactCoordinates> getCoordinates() {
                 return coordinates;
             }
+
+            @Nullable
+            @Override
+            public List<RemoteRepository> getRepositories() {
+                return repositories;
+            }
         }
     }
 }
diff --git 
a/api/maven-api-core/src/main/java/org/apache/maven/api/services/DependencyResolverRequest.java
 
b/api/maven-api-core/src/main/java/org/apache/maven/api/services/DependencyResolverRequest.java
index 6b18394f96..928f99a742 100644
--- 
a/api/maven-api-core/src/main/java/org/apache/maven/api/services/DependencyResolverRequest.java
+++ 
b/api/maven-api-core/src/main/java/org/apache/maven/api/services/DependencyResolverRequest.java
@@ -31,6 +31,7 @@ import org.apache.maven.api.JavaPathType;
 import org.apache.maven.api.PathScope;
 import org.apache.maven.api.PathType;
 import org.apache.maven.api.Project;
+import org.apache.maven.api.RemoteRepository;
 import org.apache.maven.api.Session;
 import org.apache.maven.api.annotations.Experimental;
 import org.apache.maven.api.annotations.Immutable;
@@ -94,6 +95,9 @@ public interface DependencyResolverRequest {
     @Nullable
     Predicate<PathType> getPathTypeFilter();
 
+    @Nullable
+    List<RemoteRepository> getRepositories();
+
     @Nonnull
     static DependencyResolverRequestBuilder builder() {
         return new DependencyResolverRequestBuilder();
@@ -170,6 +174,7 @@ public interface DependencyResolverRequest {
         boolean verbose;
         PathScope pathScope;
         Predicate<PathType> pathTypeFilter;
+        List<RemoteRepository> repositories;
 
         DependencyResolverRequestBuilder() {}
 
@@ -327,6 +332,12 @@ public interface DependencyResolverRequest {
             return pathTypeFilter(desiredTypes::contains);
         }
 
+        @Nonnull
+        public DependencyResolverRequestBuilder repositories(@Nonnull 
List<RemoteRepository> repositories) {
+            this.repositories = repositories;
+            return this;
+        }
+
         @Nonnull
         public DependencyResolverRequest build() {
             return new DefaultDependencyResolverRequest(
@@ -339,7 +350,8 @@ public interface DependencyResolverRequest {
                     managedDependencies,
                     verbose,
                     pathScope,
-                    pathTypeFilter);
+                    pathTypeFilter,
+                    repositories);
         }
 
         static class DefaultDependencyResolverRequest extends BaseRequest 
implements DependencyResolverRequest {
@@ -352,6 +364,7 @@ public interface DependencyResolverRequest {
             private final boolean verbose;
             private final PathScope pathScope;
             private final Predicate<PathType> pathTypeFilter;
+            private final List<RemoteRepository> repositories;
 
             /**
              * Creates a request with the specified properties.
@@ -371,7 +384,8 @@ public interface DependencyResolverRequest {
                     @Nonnull Collection<DependencyCoordinates> 
managedDependencies,
                     boolean verbose,
                     @Nullable PathScope pathScope,
-                    @Nullable Predicate<PathType> pathTypeFilter) {
+                    @Nullable Predicate<PathType> pathTypeFilter,
+                    @Nullable List<RemoteRepository> repositories) {
                 super(session);
                 this.requestType = nonNull(requestType, "requestType cannot be 
null");
                 this.project = project;
@@ -383,6 +397,7 @@ public interface DependencyResolverRequest {
                 this.verbose = verbose;
                 this.pathScope = pathScope;
                 this.pathTypeFilter = (pathTypeFilter != null) ? 
pathTypeFilter : (t) -> true;
+                this.repositories = repositories;
                 if (verbose && requestType != RequestType.COLLECT) {
                     throw new IllegalArgumentException("verbose cannot only be 
true when collecting dependencies");
                 }
@@ -439,6 +454,11 @@ public interface DependencyResolverRequest {
                 return pathTypeFilter;
             }
 
+            @Override
+            public List<RemoteRepository> getRepositories() {
+                return repositories;
+            }
+
             @Nonnull
             @Override
             public String toString() {
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 31e639867f..323ba6466b 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
@@ -23,6 +23,7 @@ import java.util.Collection;
 import java.util.List;
 import java.util.Map;
 
+import org.apache.maven.api.RemoteRepository;
 import org.apache.maven.api.Session;
 import org.apache.maven.api.annotations.Experimental;
 import org.apache.maven.api.annotations.Immutable;
@@ -157,6 +158,9 @@ public interface ModelBuilderRequest {
     @Nullable
     ModelTransformerContextBuilder getTransformerContextBuilder();
 
+    @Nullable
+    List<RemoteRepository> getRepositories();
+
     @Nonnull
     static ModelBuilderRequest build(@Nonnull ModelBuilderRequest request, 
@Nonnull ModelSource source) {
         return builder(nonNull(request, "request cannot be null"))
@@ -210,6 +214,7 @@ public interface ModelBuilderRequest {
         Object listener;
         ModelBuilderResult interimResult;
         ModelTransformerContextBuilder transformerContextBuilder;
+        List<RemoteRepository> repositories;
 
         ModelBuilderRequestBuilder() {}
 
@@ -232,6 +237,7 @@ public interface ModelBuilderRequest {
             this.listener = request.getListener();
             this.interimResult = request.getInterimResult();
             this.transformerContextBuilder = 
request.getTransformerContextBuilder();
+            this.repositories = request.getRepositories();
         }
 
         public ModelBuilderRequestBuilder session(Session session) {
@@ -325,6 +331,11 @@ public interface ModelBuilderRequest {
             return this;
         }
 
+        public ModelBuilderRequestBuilder repositories(List<RemoteRepository> 
repositories) {
+            this.repositories = repositories;
+            return this;
+        }
+
         public ModelBuilderRequest build() {
             return new DefaultModelBuilderRequest(
                     session,
@@ -344,7 +355,8 @@ public interface ModelBuilderRequest {
                     modelCache,
                     listener,
                     interimResult,
-                    transformerContextBuilder);
+                    transformerContextBuilder,
+                    repositories);
         }
 
         private static class DefaultModelBuilderRequest extends BaseRequest 
implements ModelBuilderRequest {
@@ -365,6 +377,7 @@ public interface ModelBuilderRequest {
             private final Object listener;
             private final ModelBuilderResult interimResult;
             private final ModelTransformerContextBuilder 
transformerContextBuilder;
+            private final List<RemoteRepository> repositories;
 
             @SuppressWarnings("checkstyle:ParameterNumber")
             DefaultModelBuilderRequest(
@@ -385,7 +398,8 @@ public interface ModelBuilderRequest {
                     ModelCache modelCache,
                     Object listener,
                     ModelBuilderResult interimResult,
-                    ModelTransformerContextBuilder transformerContextBuilder) {
+                    ModelTransformerContextBuilder transformerContextBuilder,
+                    List<RemoteRepository> repositories) {
                 super(session);
                 this.validationLevel = validationLevel;
                 this.locationTracking = locationTracking;
@@ -405,6 +419,7 @@ public interface ModelBuilderRequest {
                 this.listener = listener;
                 this.interimResult = interimResult;
                 this.transformerContextBuilder = transformerContextBuilder;
+                this.repositories = repositories != null ? 
List.copyOf(repositories) : null;
             }
 
             @Override
@@ -489,6 +504,11 @@ public interface ModelBuilderRequest {
             public ModelTransformerContextBuilder 
getTransformerContextBuilder() {
                 return transformerContextBuilder;
             }
+
+            @Override
+            public List<RemoteRepository> getRepositories() {
+                return repositories;
+            }
         }
     }
 }
diff --git 
a/api/maven-api-core/src/main/java/org/apache/maven/api/services/ModelBuilderResult.java
 
b/api/maven-api-core/src/main/java/org/apache/maven/api/services/ModelBuilderResult.java
index 9c7829295e..fcaf26b81d 100644
--- 
a/api/maven-api-core/src/main/java/org/apache/maven/api/services/ModelBuilderResult.java
+++ 
b/api/maven-api-core/src/main/java/org/apache/maven/api/services/ModelBuilderResult.java
@@ -119,7 +119,7 @@ public interface ModelBuilderResult {
     List<ModelProblem> getProblems();
 
     /**
-     * Creates a human readable representation of these errors.
+     * Creates a human-readable representation of these errors.
      */
     String toString();
 }
diff --git 
a/api/maven-api-core/src/main/java/org/apache/maven/api/services/ModelResolver.java
 
b/api/maven-api-core/src/main/java/org/apache/maven/api/services/ModelResolver.java
index 560cbd0186..9bec734917 100644
--- 
a/api/maven-api-core/src/main/java/org/apache/maven/api/services/ModelResolver.java
+++ 
b/api/maven-api-core/src/main/java/org/apache/maven/api/services/ModelResolver.java
@@ -18,12 +18,15 @@
  */
 package org.apache.maven.api.services;
 
+import java.util.List;
 import java.util.concurrent.atomic.AtomicReference;
 import java.util.function.Consumer;
 
+import org.apache.maven.api.RemoteRepository;
 import org.apache.maven.api.Service;
 import org.apache.maven.api.Session;
 import org.apache.maven.api.annotations.Nonnull;
+import org.apache.maven.api.annotations.Nullable;
 import org.apache.maven.api.model.Dependency;
 import org.apache.maven.api.model.Parent;
 
@@ -36,6 +39,7 @@ public interface ModelResolver extends Service {
      * Tries to resolve the POM for the specified parent coordinates possibly 
updating {@code parent}.
      *
      * @param session The session to use to resolve the model, must not be 
{@code null}.
+     * @param repositories The repositories to use to resolve the model, may 
be {@code null} in which case the {@code Session} repositories will be used.
      * @param parent The parent coordinates to resolve, must not be {@code 
null}.
      * @param modified a holder for the updated parent, must not be {@code 
null}.
      * @return The source of the requested POM, never {@code null}.
@@ -43,10 +47,14 @@ public interface ModelResolver extends Service {
      */
     @Nonnull
     default ModelSource resolveModel(
-            @Nonnull Session session, @Nonnull Parent parent, @Nonnull 
AtomicReference<Parent> modified)
+            @Nonnull Session session,
+            @Nullable List<RemoteRepository> repositories,
+            @Nonnull Parent parent,
+            @Nonnull AtomicReference<Parent> modified)
             throws ModelResolverException {
         return resolveModel(
                 session,
+                repositories,
                 parent.getGroupId(),
                 parent.getArtifactId(),
                 parent.getVersion(),
@@ -57,6 +65,7 @@ public interface ModelResolver extends Service {
      * Tries to resolve the POM for the specified dependency coordinates 
possibly updating {@code dependency}.
      *
      * @param session The session to use to resolve the model, must not be 
{@code null}.
+     * @param repositories The repositories to use to resolve the model, may 
be {@code null} in which case the {@code Session} repositories will be used.
      * @param dependency The dependency coordinates to resolve, must not be 
{@code null}.
      * @param modified a holder for the updated dependency, must not be {@code 
null}.
      * @return The source of the requested POM, never {@code null}.
@@ -64,10 +73,14 @@ public interface ModelResolver extends Service {
      */
     @Nonnull
     default ModelSource resolveModel(
-            @Nonnull Session session, @Nonnull Dependency dependency, @Nonnull 
AtomicReference<Dependency> modified)
+            @Nonnull Session session,
+            @Nullable List<RemoteRepository> repositories,
+            @Nonnull Dependency dependency,
+            @Nonnull AtomicReference<Dependency> modified)
             throws ModelResolverException {
         return resolveModel(
                 session,
+                repositories,
                 dependency.getGroupId(),
                 dependency.getArtifactId(),
                 dependency.getVersion(),
@@ -77,6 +90,7 @@ public interface ModelResolver extends Service {
     @Nonnull
     ModelSource resolveModel(
             @Nonnull Session session,
+            @Nullable List<RemoteRepository> repositories,
             @Nonnull String groupId,
             @Nonnull String artifactId,
             @Nonnull String version,
diff --git 
a/api/maven-api-core/src/main/java/org/apache/maven/api/services/ProjectBuilderRequest.java
 
b/api/maven-api-core/src/main/java/org/apache/maven/api/services/ProjectBuilderRequest.java
index 697b3643ad..35e0081356 100644
--- 
a/api/maven-api-core/src/main/java/org/apache/maven/api/services/ProjectBuilderRequest.java
+++ 
b/api/maven-api-core/src/main/java/org/apache/maven/api/services/ProjectBuilderRequest.java
@@ -19,8 +19,10 @@
 package org.apache.maven.api.services;
 
 import java.nio.file.Path;
+import java.util.List;
 import java.util.Optional;
 
+import org.apache.maven.api.RemoteRepository;
 import org.apache.maven.api.Session;
 import org.apache.maven.api.annotations.Experimental;
 import org.apache.maven.api.annotations.Immutable;
@@ -57,6 +59,9 @@ public interface ProjectBuilderRequest {
 
     boolean isProcessPlugins();
 
+    @Nullable
+    List<RemoteRepository> getRepositories();
+
     @Nonnull
     static ProjectBuilderRequest build(@Nonnull Session session, @Nonnull 
Source source) {
         return builder()
@@ -86,6 +91,7 @@ public interface ProjectBuilderRequest {
         boolean allowStubModel;
         boolean recursive;
         boolean processPlugins = true;
+        List<RemoteRepository> repositories;
 
         ProjectBuilderRequestBuilder() {}
 
@@ -109,8 +115,14 @@ public interface ProjectBuilderRequest {
             return this;
         }
 
+        public ProjectBuilderRequestBuilder 
repositories(List<RemoteRepository> repositories) {
+            this.repositories = repositories;
+            return this;
+        }
+
         public ProjectBuilderRequest build() {
-            return new DefaultProjectBuilderRequest(session, path, source, 
allowStubModel, recursive, processPlugins);
+            return new DefaultProjectBuilderRequest(
+                    session, path, source, allowStubModel, recursive, 
processPlugins, repositories);
         }
 
         private static class DefaultProjectBuilderRequest extends BaseRequest 
implements ProjectBuilderRequest {
@@ -119,6 +131,7 @@ public interface ProjectBuilderRequest {
             private final boolean allowStubModel;
             private final boolean recursive;
             private final boolean processPlugins;
+            private final List<RemoteRepository> repositories;
 
             @SuppressWarnings("checkstyle:ParameterNumber")
             DefaultProjectBuilderRequest(
@@ -127,13 +140,15 @@ public interface ProjectBuilderRequest {
                     @Nullable Source source,
                     boolean allowStubModel,
                     boolean recursive,
-                    boolean processPlugins) {
+                    boolean processPlugins,
+                    @Nullable List<RemoteRepository> repositories) {
                 super(session);
                 this.path = path;
                 this.source = source;
                 this.allowStubModel = allowStubModel;
                 this.recursive = recursive;
                 this.processPlugins = processPlugins;
+                this.repositories = repositories;
             }
 
             @Nonnull
@@ -162,6 +177,11 @@ public interface ProjectBuilderRequest {
             public boolean isProcessPlugins() {
                 return processPlugins;
             }
+
+            @Override
+            public List<RemoteRepository> getRepositories() {
+                return repositories;
+            }
         }
     }
 }
diff --git 
a/api/maven-api-core/src/main/java/org/apache/maven/api/services/VersionRangeResolver.java
 
b/api/maven-api-core/src/main/java/org/apache/maven/api/services/VersionRangeResolver.java
index 8e288d6433..aec999dd28 100644
--- 
a/api/maven-api-core/src/main/java/org/apache/maven/api/services/VersionRangeResolver.java
+++ 
b/api/maven-api-core/src/main/java/org/apache/maven/api/services/VersionRangeResolver.java
@@ -18,12 +18,16 @@
  */
 package org.apache.maven.api.services;
 
+import java.util.List;
+
 import org.apache.maven.api.ArtifactCoordinates;
+import org.apache.maven.api.RemoteRepository;
 import org.apache.maven.api.Service;
 import org.apache.maven.api.Session;
 import org.apache.maven.api.annotations.Consumer;
 import org.apache.maven.api.annotations.Experimental;
 import org.apache.maven.api.annotations.Nonnull;
+import org.apache.maven.api.annotations.Nullable;
 
 /**
  * Parses and evaluates version ranges encountered in dependency declarations.
@@ -54,6 +58,29 @@ public interface VersionRangeResolver extends Service {
         return resolve(VersionRangeResolverRequest.build(session, 
artifactCoordinates));
     }
 
+    /**
+     * Expands a version range to a list of matching versions, in ascending 
order.
+     * For example, resolves "[3.8,4.0)" to "3.8", "3.8.1", "3.8.2".
+     * The returned list of versions is only dependent on the configured 
repositories and their contents.
+     * The supplied request may also refer to a single concrete version rather 
than a version range.
+     * In this case though, the result contains simply the (parsed) input 
version, regardless of the
+     * repositories and their contents.
+     *
+     * @param session the session to use
+     * @param artifactCoordinates t
+     * @param repositories the repositories to use (if {@code null}, the 
session repositories are used)
+     * @return the version range resolution result
+     * @throws VersionResolverException if an errors occurs
+     */
+    @Nonnull
+    default VersionRangeResolverResult resolve(
+            @Nonnull Session session,
+            @Nonnull ArtifactCoordinates artifactCoordinates,
+            @Nullable List<RemoteRepository> repositories)
+            throws VersionResolverException {
+        return resolve(VersionRangeResolverRequest.build(session, 
artifactCoordinates, repositories));
+    }
+
     @Nonnull
     VersionRangeResolverResult resolve(@Nonnull VersionRangeResolverRequest 
request)
             throws VersionRangeResolverException;
diff --git 
a/api/maven-api-core/src/main/java/org/apache/maven/api/services/VersionRangeResolverRequest.java
 
b/api/maven-api-core/src/main/java/org/apache/maven/api/services/VersionRangeResolverRequest.java
index 1ba7f8ec58..99f4f3ecc9 100644
--- 
a/api/maven-api-core/src/main/java/org/apache/maven/api/services/VersionRangeResolverRequest.java
+++ 
b/api/maven-api-core/src/main/java/org/apache/maven/api/services/VersionRangeResolverRequest.java
@@ -18,11 +18,15 @@
  */
 package org.apache.maven.api.services;
 
+import java.util.List;
+
 import org.apache.maven.api.ArtifactCoordinates;
+import org.apache.maven.api.RemoteRepository;
 import org.apache.maven.api.Session;
 import org.apache.maven.api.annotations.Experimental;
 import org.apache.maven.api.annotations.Nonnull;
 import org.apache.maven.api.annotations.NotThreadSafe;
+import org.apache.maven.api.annotations.Nullable;
 
 import static org.apache.maven.api.services.BaseRequest.nonNull;
 
@@ -39,12 +43,24 @@ public interface VersionRangeResolverRequest {
     @Nonnull
     ArtifactCoordinates getArtifactCoordinates();
 
+    @Nullable
+    List<RemoteRepository> getRepositories();
+
     @Nonnull
     static VersionRangeResolverRequest build(
             @Nonnull Session session, @Nonnull ArtifactCoordinates 
artifactCoordinates) {
+        return build(session, artifactCoordinates, null);
+    }
+
+    @Nonnull
+    static VersionRangeResolverRequest build(
+            @Nonnull Session session,
+            @Nonnull ArtifactCoordinates artifactCoordinates,
+            @Nullable List<RemoteRepository> repositories) {
         return builder()
                 .session(nonNull(session, "session cannot be null"))
                 .artifactCoordinates(nonNull(artifactCoordinates, 
"artifactCoordinates cannot be null"))
+                .repositories(repositories)
                 .build();
     }
 
@@ -57,6 +73,7 @@ public interface VersionRangeResolverRequest {
     class VersionResolverRequestBuilder {
         Session session;
         ArtifactCoordinates artifactCoordinates;
+        List<RemoteRepository> repositories;
 
         public VersionResolverRequestBuilder session(Session session) {
             this.session = session;
@@ -68,17 +85,27 @@ public interface VersionRangeResolverRequest {
             return this;
         }
 
+        public VersionResolverRequestBuilder 
repositories(List<RemoteRepository> repositories) {
+            this.repositories = repositories;
+            return this;
+        }
+
         public VersionRangeResolverRequest build() {
-            return new DefaultVersionResolverRequest(session, 
artifactCoordinates);
+            return new DefaultVersionResolverRequest(session, 
artifactCoordinates, repositories);
         }
 
         private static class DefaultVersionResolverRequest extends BaseRequest 
implements VersionRangeResolverRequest {
             private final ArtifactCoordinates artifactCoordinates;
+            private final List<RemoteRepository> repositories;
 
             @SuppressWarnings("checkstyle:ParameterNumber")
-            DefaultVersionResolverRequest(@Nonnull Session session, @Nonnull 
ArtifactCoordinates artifactCoordinates) {
+            DefaultVersionResolverRequest(
+                    @Nonnull Session session,
+                    @Nonnull ArtifactCoordinates artifactCoordinates,
+                    @Nullable List<RemoteRepository> repositories) {
                 super(session);
                 this.artifactCoordinates = artifactCoordinates;
+                this.repositories = repositories;
             }
 
             @Nonnull
@@ -86,6 +113,12 @@ public interface VersionRangeResolverRequest {
             public ArtifactCoordinates getArtifactCoordinates() {
                 return artifactCoordinates;
             }
+
+            @Nullable
+            @Override
+            public List<RemoteRepository> getRepositories() {
+                return repositories;
+            }
         }
     }
 }
diff --git 
a/api/maven-api-core/src/main/java/org/apache/maven/api/services/VersionResolverRequest.java
 
b/api/maven-api-core/src/main/java/org/apache/maven/api/services/VersionResolverRequest.java
index dd16d9d5f6..b0c9fe2f7f 100644
--- 
a/api/maven-api-core/src/main/java/org/apache/maven/api/services/VersionResolverRequest.java
+++ 
b/api/maven-api-core/src/main/java/org/apache/maven/api/services/VersionResolverRequest.java
@@ -18,11 +18,15 @@
  */
 package org.apache.maven.api.services;
 
+import java.util.List;
+
 import org.apache.maven.api.ArtifactCoordinates;
+import org.apache.maven.api.RemoteRepository;
 import org.apache.maven.api.Session;
 import org.apache.maven.api.annotations.Experimental;
 import org.apache.maven.api.annotations.Nonnull;
 import org.apache.maven.api.annotations.NotThreadSafe;
+import org.apache.maven.api.annotations.Nullable;
 
 import static org.apache.maven.api.services.BaseRequest.nonNull;
 
@@ -39,6 +43,9 @@ public interface VersionResolverRequest {
     @Nonnull
     ArtifactCoordinates getArtifactCoordinates();
 
+    @Nullable
+    List<RemoteRepository> getRepositories();
+
     @Nonnull
     static VersionResolverRequest build(@Nonnull Session session, @Nonnull 
ArtifactCoordinates artifactCoordinates) {
         return builder()
@@ -47,6 +54,18 @@ public interface VersionResolverRequest {
                 .build();
     }
 
+    @Nonnull
+    static VersionResolverRequest build(
+            @Nonnull Session session,
+            @Nonnull ArtifactCoordinates artifactCoordinates,
+            @Nullable List<RemoteRepository> repositories) {
+        return builder()
+                .session(nonNull(session, "session cannot be null"))
+                .artifactCoordinates(nonNull(artifactCoordinates, 
"artifactCoordinates cannot be null"))
+                .repositories(repositories)
+                .build();
+    }
+
     @Nonnull
     static VersionResolverRequestBuilder builder() {
         return new VersionResolverRequestBuilder();
@@ -56,6 +75,7 @@ public interface VersionResolverRequest {
     class VersionResolverRequestBuilder {
         Session session;
         ArtifactCoordinates artifactCoordinates;
+        List<RemoteRepository> repositories;
 
         public VersionResolverRequestBuilder session(Session session) {
             this.session = session;
@@ -67,17 +87,27 @@ public interface VersionResolverRequest {
             return this;
         }
 
+        public VersionResolverRequestBuilder 
repositories(List<RemoteRepository> repositories) {
+            this.repositories = repositories;
+            return this;
+        }
+
         public VersionResolverRequest build() {
-            return new DefaultVersionResolverRequest(session, 
artifactCoordinates);
+            return new DefaultVersionResolverRequest(session, 
artifactCoordinates, repositories);
         }
 
         private static class DefaultVersionResolverRequest extends BaseRequest 
implements VersionResolverRequest {
             private final ArtifactCoordinates artifactCoordinates;
+            private final List<RemoteRepository> repositories;
 
             @SuppressWarnings("checkstyle:ParameterNumber")
-            DefaultVersionResolverRequest(@Nonnull Session session, @Nonnull 
ArtifactCoordinates artifactCoordinates) {
+            DefaultVersionResolverRequest(
+                    @Nonnull Session session,
+                    @Nonnull ArtifactCoordinates artifactCoordinates,
+                    @Nullable List<RemoteRepository> repositories) {
                 super(session);
                 this.artifactCoordinates = artifactCoordinates;
+                this.repositories = repositories;
             }
 
             @Nonnull
@@ -85,6 +115,12 @@ public interface VersionResolverRequest {
             public ArtifactCoordinates getArtifactCoordinates() {
                 return artifactCoordinates;
             }
+
+            @Nullable
+            @Override
+            public List<RemoteRepository> getRepositories() {
+                return repositories;
+            }
         }
     }
 }
diff --git 
a/maven-api-impl/src/main/java/org/apache/maven/internal/impl/AbstractSession.java
 
b/maven-api-impl/src/main/java/org/apache/maven/internal/impl/AbstractSession.java
index 77a9da652c..ece39133d3 100644
--- 
a/maven-api-impl/src/main/java/org/apache/maven/internal/impl/AbstractSession.java
+++ 
b/maven-api-impl/src/main/java/org/apache/maven/internal/impl/AbstractSession.java
@@ -547,6 +547,21 @@ public abstract class AbstractSession implements 
InternalSession {
                 .next();
     }
 
+    /**
+     * Shortcut for 
<code>getService(ArtifactResolver.class).resolve(...)</code>
+     *
+     * @throws ArtifactResolverException if the artifact resolution failed
+     * @see ArtifactResolver#resolve(Session, Collection)
+     */
+    @Override
+    public DownloadedArtifact resolveArtifact(ArtifactCoordinates coordinates, 
List<RemoteRepository> repositories) {
+        return getService(ArtifactResolver.class)
+                .resolve(this, Collections.singletonList(coordinates), 
repositories)
+                .getArtifacts()
+                .iterator()
+                .next();
+    }
+
     /**
      * Shortcut for 
<code>getService(ArtifactResolver.class).resolve(...)</code>
      *
@@ -569,6 +584,20 @@ public abstract class AbstractSession implements 
InternalSession {
         return getService(ArtifactResolver.class).resolve(this, 
coordinates).getArtifacts();
     }
 
+    /**
+     * Shortcut for 
<code>getService(ArtifactResolver.class).resolve(...)</code>
+     *
+     * @throws ArtifactResolverException if the artifact resolution failed
+     * @see ArtifactResolver#resolve(Session, Collection)
+     */
+    @Override
+    public Collection<DownloadedArtifact> resolveArtifacts(
+            Collection<? extends ArtifactCoordinates> coordinates, 
List<RemoteRepository> repositories) {
+        return getService(ArtifactResolver.class)
+                .resolve(this, coordinates, repositories)
+                .getArtifacts();
+    }
+
     /**
      * Shortcut for 
<code>getService(ArtifactResolver.class).resolve(...)</code>
      *
@@ -582,6 +611,19 @@ public abstract class AbstractSession implements 
InternalSession {
         return resolveArtifact(coordinates);
     }
 
+    /**
+     * Shortcut for 
<code>getService(ArtifactResolver.class).resolve(...)</code>
+     *
+     * @throws ArtifactResolverException if the artifact resolution failed
+     * @see ArtifactResolver#resolve(Session, Collection)
+     */
+    @Override
+    public DownloadedArtifact resolveArtifact(Artifact artifact, 
List<RemoteRepository> repositories) {
+        ArtifactCoordinates coordinates =
+                getService(ArtifactCoordinatesFactory.class).create(this, 
artifact);
+        return resolveArtifact(coordinates, repositories);
+    }
+
     @Override
     public Collection<DownloadedArtifact> resolveArtifacts(Artifact... 
artifacts) {
         ArtifactCoordinatesFactory acf = 
getService(ArtifactCoordinatesFactory.class);
@@ -803,6 +845,13 @@ public abstract class AbstractSession implements 
InternalSession {
         return getService(VersionRangeResolver.class).resolve(this, 
artifact).getVersions();
     }
 
+    @Override
+    public List<Version> resolveVersionRange(ArtifactCoordinates artifact, 
List<RemoteRepository> repositories) {
+        return getService(VersionRangeResolver.class)
+                .resolve(this, artifact, repositories)
+                .getVersions();
+    }
+
     @Override
     public Type requireType(String id) {
         return getService(TypeRegistry.class).require(id);
diff --git 
a/maven-api-impl/src/main/java/org/apache/maven/internal/impl/DefaultArtifactResolver.java
 
b/maven-api-impl/src/main/java/org/apache/maven/internal/impl/DefaultArtifactResolver.java
index c7821b4163..49f6991666 100644
--- 
a/maven-api-impl/src/main/java/org/apache/maven/internal/impl/DefaultArtifactResolver.java
+++ 
b/maven-api-impl/src/main/java/org/apache/maven/internal/impl/DefaultArtifactResolver.java
@@ -54,7 +54,8 @@ public class DefaultArtifactResolver implements 
ArtifactResolver {
         try {
             Map<DownloadedArtifact, Path> paths = new HashMap<>();
             ArtifactManager artifactManager = 
session.getService(ArtifactManager.class);
-            List<RemoteRepository> repositories = 
session.toRepositories(session.getRemoteRepositories());
+            List<RemoteRepository> repositories = session.toRepositories(
+                    request.getRepositories() != null ? 
request.getRepositories() : session.getRemoteRepositories());
             List<ArtifactRequest> requests = new ArrayList<>();
             for (ArtifactCoordinates coords : request.getCoordinates()) {
                 org.eclipse.aether.artifact.Artifact aetherArtifact = 
session.toArtifact(coords);
diff --git 
a/maven-api-impl/src/main/java/org/apache/maven/internal/impl/DefaultDependencyResolver.java
 
b/maven-api-impl/src/main/java/org/apache/maven/internal/impl/DefaultDependencyResolver.java
index d5a1746cfe..6675d7bf96 100644
--- 
a/maven-api-impl/src/main/java/org/apache/maven/internal/impl/DefaultDependencyResolver.java
+++ 
b/maven-api-impl/src/main/java/org/apache/maven/internal/impl/DefaultDependencyResolver.java
@@ -85,13 +85,16 @@ public class DefaultDependencyResolver implements 
DependencyResolver {
             root = null;
             dependencies = project.getDependencies();
             managedDependencies = project.getManagedDependencies();
-            remoteRepositories = 
session.getService(ProjectManager.class).getRemoteProjectRepositories(project);
+            remoteRepositories = request.getRepositories() != null
+                    ? request.getRepositories()
+                    : 
session.getService(ProjectManager.class).getRemoteProjectRepositories(project);
         } else {
             rootArtifact = request.getRootArtifact().orElse(null);
             root = request.getRoot().orElse(null);
             dependencies = request.getDependencies();
             managedDependencies = request.getManagedDependencies();
-            remoteRepositories = session.getRemoteRepositories();
+            remoteRepositories =
+                    request.getRepositories() != null ? 
request.getRepositories() : session.getRemoteRepositories();
         }
         CollectRequest collectRequest = new CollectRequest()
                 .setRootArtifact(rootArtifact != null ? 
session.toArtifact(rootArtifact) : null)
@@ -149,6 +152,8 @@ public class DefaultDependencyResolver implements 
DependencyResolver {
                 InternalSession.from(nonNull(request, "request").getSession());
         DependencyResolverResult result;
         DependencyResolverResult collectorResult = collect(request);
+        List<RemoteRepository> repositories =
+                request.getRepositories() != null ? request.getRepositories() 
: session.getRemoteRepositories();
         if (request.getRequestType() == 
DependencyResolverRequest.RequestType.COLLECT) {
             result = collectorResult;
         } else {
@@ -171,7 +176,7 @@ public class DefaultDependencyResolver implements 
DependencyResolver {
                 DefaultDependencyResolverResult resolverResult = new 
DefaultDependencyResolverResult(
                         cache, collectorResult.getExceptions(), 
collectorResult.getRoot(), nodes.size());
                 ArtifactResolverResult artifactResolverResult =
-                        
session.getService(ArtifactResolver.class).resolve(session, coordinates);
+                        
session.getService(ArtifactResolver.class).resolve(session, coordinates, 
repositories);
                 for (Node node : nodes) {
                     Dependency d = node.getDependency();
                     Path path = (d != null) ? 
artifactResolverResult.getPath(d) : null;
diff --git 
a/maven-api-impl/src/main/java/org/apache/maven/internal/impl/DefaultVersionRangeResolver.java
 
b/maven-api-impl/src/main/java/org/apache/maven/internal/impl/DefaultVersionRangeResolver.java
index bed8ec9b93..2de529f6fc 100644
--- 
a/maven-api-impl/src/main/java/org/apache/maven/internal/impl/DefaultVersionRangeResolver.java
+++ 
b/maven-api-impl/src/main/java/org/apache/maven/internal/impl/DefaultVersionRangeResolver.java
@@ -63,7 +63,10 @@ public class DefaultVersionRangeResolver implements 
VersionRangeResolver {
                     session.getSession(),
                     new VersionRangeRequest(
                             
session.toArtifact(request.getArtifactCoordinates()),
-                            
session.toRepositories(session.getRemoteRepositories()),
+                            session.toRepositories(
+                                    request.getRepositories() != null
+                                            ? request.getRepositories()
+                                            : session.getRemoteRepositories()),
                             null));
 
             Map<String, ArtifactRepository> repos = res.getVersions().stream()
diff --git 
a/maven-api-impl/src/main/java/org/apache/maven/internal/impl/DefaultVersionResolver.java
 
b/maven-api-impl/src/main/java/org/apache/maven/internal/impl/DefaultVersionResolver.java
index e8a9643705..6c9f0ec916 100644
--- 
a/maven-api-impl/src/main/java/org/apache/maven/internal/impl/DefaultVersionResolver.java
+++ 
b/maven-api-impl/src/main/java/org/apache/maven/internal/impl/DefaultVersionResolver.java
@@ -58,7 +58,10 @@ public class DefaultVersionResolver implements 
VersionResolver {
                     session.getSession(),
                     new VersionRequest(
                             
session.toArtifact(request.getArtifactCoordinates()),
-                            
session.toRepositories(session.getRemoteRepositories()),
+                            session.toRepositories(
+                                    request.getRepositories() != null
+                                            ? request.getRepositories()
+                                            : session.getRemoteRepositories()),
                             null));
 
             return new VersionResolverResult() {
diff --git 
a/maven-api-impl/src/main/java/org/apache/maven/internal/impl/model/DefaultModelBuilder.java
 
b/maven-api-impl/src/main/java/org/apache/maven/internal/impl/model/DefaultModelBuilder.java
index a0a563167f..fb83c160f8 100644
--- 
a/maven-api-impl/src/main/java/org/apache/maven/internal/impl/model/DefaultModelBuilder.java
+++ 
b/maven-api-impl/src/main/java/org/apache/maven/internal/impl/model/DefaultModelBuilder.java
@@ -42,7 +42,6 @@ import java.util.function.UnaryOperator;
 import java.util.stream.Collectors;
 import java.util.stream.Stream;
 
-import org.apache.maven.api.Session;
 import org.apache.maven.api.Type;
 import org.apache.maven.api.VersionRange;
 import org.apache.maven.api.annotations.Nullable;
@@ -1180,9 +1179,8 @@ public class DefaultModelBuilder implements ModelBuilder {
         ModelSource modelSource;
         try {
             AtomicReference<Parent> modified = new AtomicReference<>();
-            Session session = request.getSession()
-                    
.withRemoteRepositories(request.getModelRepositoryHolder().getRepositories());
-            modelSource = modelResolver.resolveModel(session, parent, 
modified);
+            modelSource = modelResolver.resolveModel(
+                    request.getSession(), 
request.getModelRepositoryHolder().getRepositories(), parent, modified);
             if (modified.get() != null) {
                 parent = modified.get();
             }
@@ -1422,10 +1420,11 @@ public class DefaultModelBuilder implements 
ModelBuilder {
         if (importModel == null) {
             final ModelSource importSource;
             try {
-                Session session = request.getSession()
-                        .withRemoteRepositories(
-                                
request.getModelRepositoryHolder().getRepositories());
-                importSource = modelResolver.resolveModel(session, dependency, 
new AtomicReference<>());
+                importSource = modelResolver.resolveModel(
+                        request.getSession(),
+                        request.getModelRepositoryHolder().getRepositories(),
+                        dependency,
+                        new AtomicReference<>());
             } catch (ModelBuilderException e) {
                 StringBuilder buffer = new StringBuilder(256);
                 buffer.append("Non-resolvable import POM");
@@ -1459,9 +1458,8 @@ public class DefaultModelBuilder implements ModelBuilder {
             final ModelBuilderResult importResult;
             try {
                 ModelBuilderRequest importRequest = 
ModelBuilderRequest.builder()
-                        .session(request.getSession()
-                                .withRemoteRepositories(
-                                        
request.getModelRepositoryHolder().getRepositories()))
+                        .session(request.getSession())
+                        
.repositories(request.getModelRepositoryHolder().getRepositories())
                         
.validationLevel(ModelBuilderRequest.VALIDATION_LEVEL_MINIMAL)
                         .systemProperties(request.getSystemProperties())
                         .userProperties(request.getUserProperties())
diff --git 
a/maven-api-impl/src/main/java/org/apache/maven/internal/impl/resolver/DefaultArtifactDescriptorReader.java
 
b/maven-api-impl/src/main/java/org/apache/maven/internal/impl/resolver/DefaultArtifactDescriptorReader.java
index 1c5839e094..2498441804 100644
--- 
a/maven-api-impl/src/main/java/org/apache/maven/internal/impl/resolver/DefaultArtifactDescriptorReader.java
+++ 
b/maven-api-impl/src/main/java/org/apache/maven/internal/impl/resolver/DefaultArtifactDescriptorReader.java
@@ -24,7 +24,7 @@ import java.util.List;
 import java.util.Map;
 import java.util.Objects;
 
-import org.apache.maven.api.Session;
+import org.apache.maven.api.RemoteRepository;
 import org.apache.maven.api.di.Inject;
 import org.apache.maven.api.di.Named;
 import org.apache.maven.api.di.Singleton;
@@ -40,7 +40,6 @@ import org.apache.maven.api.services.ModelResolverException;
 import org.apache.maven.api.services.ModelSource;
 import org.apache.maven.internal.impl.InternalSession;
 import org.apache.maven.internal.impl.model.ModelProblemUtils;
-import org.codehaus.plexus.interpolation.util.StringUtils;
 import org.eclipse.aether.RepositoryEvent;
 import org.eclipse.aether.RepositoryEvent.EventType;
 import org.eclipse.aether.RepositoryException;
@@ -199,18 +198,16 @@ public class DefaultArtifactDescriptorReader implements 
ArtifactDescriptorReader
 
             try {
                 InternalSession iSession = InternalSession.from(session);
-                Session iSessionWithRepos = 
iSession.withRemoteRepositories(request.getRepositories().stream()
+                List<RemoteRepository> repositories = 
request.getRepositories().stream()
                         .map(iSession::getRemoteRepository)
-                        .toList());
+                        .toList();
                 String gav =
                         pomArtifact.getGroupId() + ":" + 
pomArtifact.getArtifactId() + ":" + pomArtifact.getVersion();
                 ModelResolver modelResolver = new DefaultModelResolver();
                 ModelRepositoryHolder modelRepositoryHolder = new 
DefaultModelRepositoryHolder(
-                        iSessionWithRepos,
-                        
DefaultModelRepositoryHolder.RepositoryMerging.REQUEST_DOMINANT,
-                        iSessionWithRepos.getRemoteRepositories());
+                        iSession, 
DefaultModelRepositoryHolder.RepositoryMerging.REQUEST_DOMINANT, repositories);
                 ModelBuilderRequest modelRequest = 
ModelBuilderRequest.builder()
-                        .session(iSessionWithRepos)
+                        .session(iSession)
                         .projectBuild(false)
                         .processPlugins(false)
                         .twoPhaseBuilding(false)
@@ -222,6 +219,7 @@ public class DefaultArtifactDescriptorReader implements 
ArtifactDescriptorReader
                         .modelResolver(modelResolver)
                         .modelRepositoryHolder(modelRepositoryHolder)
                         .modelCache(DefaultModelCache.newInstance(session, 
false))
+                        .repositories(repositories)
                         .build();
 
                 ModelBuilderResult modelResult = 
modelBuilder.build(modelRequest);
@@ -230,21 +228,23 @@ public class DefaultArtifactDescriptorReader implements 
ArtifactDescriptorReader
                 if (!modelResult.getProblems().isEmpty()) {
                     List<ModelProblem> problems = modelResult.getProblems();
                     if (logger.isDebugEnabled()) {
-                        String problem = (problems.size() == 1) ? "problem" : 
"problems";
-                        String problemPredicate = problem + ((problems.size() 
== 1) ? " was" : " were");
-                        String message = String.format(
-                                "%s %s encountered while building the 
effective model for %s during %s\n",
-                                problems.size(),
-                                problemPredicate,
-                                request.getArtifact(),
-                                RequestTraceHelper.interpretTrace(true, 
request.getTrace()));
-                        message += StringUtils.capitalizeFirstLetter(problem);
+                        StringBuilder sb = new StringBuilder();
+                        sb.append(problems.size())
+                                .append(" ")
+                                .append((problems.size() == 1) ? "problem was" 
: "problems were")
+                                .append(" encountered while building the 
effective model for ")
+                                .append(request.getArtifact())
+                                .append(" during ")
+                                
.append(RequestTraceHelper.interpretTrace(true, request.getTrace()))
+                                .append("\n")
+                                .append((problems.size() == 1) ? "Problem" : 
"Problems");
                         for (ModelProblem modelProblem : problems) {
-                            message += String.format(
-                                    "\n* %s @ %s",
-                                    modelProblem.getMessage(), 
ModelProblemUtils.formatLocation(modelProblem, null));
+                            sb.append("\n* ")
+                                    .append(modelProblem.getMessage())
+                                    .append(" @ ")
+                                    
.append(ModelProblemUtils.formatLocation(modelProblem, null));
                         }
-                        logger.warn(message);
+                        logger.warn(sb.toString());
                     } else {
                         logger.warn(
                                 "{} {} encountered while building the 
effective model for {} during {} (use -X to see details)",
diff --git 
a/maven-api-impl/src/main/java/org/apache/maven/internal/impl/resolver/DefaultModelResolver.java
 
b/maven-api-impl/src/main/java/org/apache/maven/internal/impl/resolver/DefaultModelResolver.java
index 3b5a0da8e9..0a16b9696c 100644
--- 
a/maven-api-impl/src/main/java/org/apache/maven/internal/impl/resolver/DefaultModelResolver.java
+++ 
b/maven-api-impl/src/main/java/org/apache/maven/internal/impl/resolver/DefaultModelResolver.java
@@ -28,6 +28,7 @@ import java.util.stream.Collectors;
 
 import org.apache.maven.api.ArtifactCoordinates;
 import org.apache.maven.api.DownloadedArtifact;
+import org.apache.maven.api.RemoteRepository;
 import org.apache.maven.api.Session;
 import org.apache.maven.api.Version;
 import org.apache.maven.api.di.Named;
@@ -50,7 +51,12 @@ public class DefaultModelResolver implements ModelResolver {
 
     @Override
     public ModelSource resolveModel(
-            Session session, String groupId, String artifactId, String 
version, Consumer<String> resolvedVersion)
+            Session session,
+            List<RemoteRepository> repositories,
+            String groupId,
+            String artifactId,
+            String version,
+            Consumer<String> resolvedVersion)
             throws ModelResolverException {
         try {
             ArtifactCoordinates coords = 
session.createArtifactCoordinates(groupId, artifactId, version, "pom");
@@ -63,7 +69,7 @@ public class DefaultModelResolver implements ModelResolver {
                         artifactId,
                         version);
             }
-            List<Version> versions = session.resolveVersionRange(coords);
+            List<Version> versions = session.resolveVersionRange(coords, 
repositories);
             if (versions.isEmpty()) {
                 throw new ModelResolverException(
                         String.format("No versions matched the requested 
version range '%s'", version),
@@ -76,8 +82,8 @@ public class DefaultModelResolver implements ModelResolver {
                 resolvedVersion.accept(newVersion);
             }
 
-            DownloadedArtifact resolved =
-                    
session.resolveArtifact(session.createArtifactCoordinates(groupId, artifactId, 
newVersion, "pom"));
+            DownloadedArtifact resolved = session.resolveArtifact(
+                    session.createArtifactCoordinates(groupId, artifactId, 
newVersion, "pom"), repositories);
             Path path = resolved.getPath();
             String location = groupId + ":" + artifactId + ":" + newVersion;
             return new ModelSource() {
@@ -109,9 +115,8 @@ public class DefaultModelResolver implements ModelResolver {
         } catch (VersionRangeResolverException | ArtifactResolverException e) {
             throw new ModelResolverException(
                     e.getMessage() + " (remote repositories: "
-                            + session.getRemoteRepositories().stream()
-                                    .map(Object::toString)
-                                    .collect(Collectors.joining(", "))
+                            + (repositories != null ? repositories : 
session.getRemoteRepositories())
+                                    
.stream().map(Object::toString).collect(Collectors.joining(", "))
                             + ")",
                     groupId,
                     artifactId,
diff --git 
a/maven-api-impl/src/test/java/org/apache/maven/internal/impl/resolver/DefaultModelResolverTest.java
 
b/maven-api-impl/src/test/java/org/apache/maven/internal/impl/resolver/DefaultModelResolverTest.java
index a6088b80f0..51daf7079a 100644
--- 
a/maven-api-impl/src/test/java/org/apache/maven/internal/impl/resolver/DefaultModelResolverTest.java
+++ 
b/maven-api-impl/src/test/java/org/apache/maven/internal/impl/resolver/DefaultModelResolverTest.java
@@ -69,7 +69,7 @@ class DefaultModelResolverTest {
 
         ModelResolverException e = assertThrows(
                 ModelResolverException.class,
-                () -> newModelResolver().resolveModel(session, parent, new 
AtomicReference<>()),
+                () -> newModelResolver().resolveModel(session, null, parent, 
new AtomicReference<>()),
                 "Expected 'ModelResolverException' not thrown.");
         assertNotNull(e.getMessage());
         assertThat(e.getMessage(), containsString("Could not find artifact 
org.apache:apache:pom:0 in central"));
@@ -85,7 +85,7 @@ class DefaultModelResolverTest {
 
         ModelResolverException e = assertThrows(
                 ModelResolverException.class,
-                () -> newModelResolver().resolveModel(session, parent, new 
AtomicReference<>()),
+                () -> newModelResolver().resolveModel(session, null, parent, 
new AtomicReference<>()),
                 "Expected 'ModelResolverException' not thrown.");
         assertEquals("No versions matched the requested version range 
'[2.0,2.1)'", e.getMessage());
     }
@@ -100,7 +100,7 @@ class DefaultModelResolverTest {
 
         ModelResolverException e = assertThrows(
                 ModelResolverException.class,
-                () -> newModelResolver().resolveModel(session, parent, new 
AtomicReference<>()),
+                () -> newModelResolver().resolveModel(session, null, parent, 
new AtomicReference<>()),
                 "Expected 'ModelResolverException' not thrown.");
         assertEquals("The requested version range '[1,)' does not specify an 
upper bound", e.getMessage());
     }
@@ -113,7 +113,7 @@ class DefaultModelResolverTest {
                 .version("1")
                 .build();
 
-        assertNotNull(this.newModelResolver().resolveModel(session, parent, 
new AtomicReference<>()));
+        assertNotNull(this.newModelResolver().resolveModel(session, null, 
parent, new AtomicReference<>()));
         assertEquals("1", parent.getVersion());
     }
 
@@ -126,7 +126,7 @@ class DefaultModelResolverTest {
                 .build();
 
         AtomicReference<org.apache.maven.api.model.Parent> modified = new 
AtomicReference<>();
-        assertNotNull(this.newModelResolver().resolveModel(session, parent, 
modified));
+        assertNotNull(this.newModelResolver().resolveModel(session, null, 
parent, modified));
         assertEquals("1", modified.get().getVersion());
     }
 
@@ -140,7 +140,7 @@ class DefaultModelResolverTest {
 
         ModelResolverException e = assertThrows(
                 ModelResolverException.class,
-                () -> newModelResolver().resolveModel(session, dependency, new 
AtomicReference<>()),
+                () -> newModelResolver().resolveModel(session, null, 
dependency, new AtomicReference<>()),
                 "Expected 'ModelResolverException' not thrown.");
         assertNotNull(e.getMessage());
         assertThat(e.getMessage(), containsString("Could not find artifact 
org.apache:apache:pom:0 in central"));
@@ -156,7 +156,7 @@ class DefaultModelResolverTest {
 
         ModelResolverException e = assertThrows(
                 ModelResolverException.class,
-                () -> newModelResolver().resolveModel(session, dependency, new 
AtomicReference<>()),
+                () -> newModelResolver().resolveModel(session, null, 
dependency, new AtomicReference<>()),
                 "Expected 'ModelResolverException' not thrown.");
         assertEquals("No versions matched the requested version range 
'[2.0,2.1)'", e.getMessage());
     }
@@ -171,7 +171,7 @@ class DefaultModelResolverTest {
 
         ModelResolverException e = assertThrows(
                 ModelResolverException.class,
-                () -> newModelResolver().resolveModel(session, dependency, new 
AtomicReference<>()),
+                () -> newModelResolver().resolveModel(session, null, 
dependency, new AtomicReference<>()),
                 "Expected 'ModelResolverException' not thrown.");
         assertEquals("The requested version range '[1,)' does not specify an 
upper bound", e.getMessage());
     }
@@ -184,7 +184,7 @@ class DefaultModelResolverTest {
                 .version("1")
                 .build();
 
-        assertNotNull(this.newModelResolver().resolveModel(session, 
dependency, new AtomicReference<>()));
+        assertNotNull(this.newModelResolver().resolveModel(session, null, 
dependency, new AtomicReference<>()));
         assertEquals("1", dependency.getVersion());
     }
 
@@ -197,7 +197,7 @@ class DefaultModelResolverTest {
                 .build();
 
         AtomicReference<org.apache.maven.api.model.Dependency> modified = new 
AtomicReference<>();
-        assertNotNull(this.newModelResolver().resolveModel(session, 
dependency, modified));
+        assertNotNull(this.newModelResolver().resolveModel(session, null, 
dependency, modified));
         assertEquals("1", modified.get().getVersion());
     }
 
diff --git 
a/maven-core/src/main/java/org/apache/maven/internal/impl/DefaultProjectBuilder.java
 
b/maven-core/src/main/java/org/apache/maven/internal/impl/DefaultProjectBuilder.java
index cbc2e0afd7..a446f63b26 100644
--- 
a/maven-core/src/main/java/org/apache/maven/internal/impl/DefaultProjectBuilder.java
+++ 
b/maven-core/src/main/java/org/apache/maven/internal/impl/DefaultProjectBuilder.java
@@ -66,7 +66,8 @@ public class DefaultProjectBuilder implements ProjectBuilder {
             throws ProjectBuilderException, IllegalArgumentException {
         InternalMavenSession session = 
InternalMavenSession.from(request.getSession());
         try {
-            List<ArtifactRepository> repositories = 
session.toArtifactRepositories(session.getRemoteRepositories());
+            List<ArtifactRepository> repositories = 
session.toArtifactRepositories(
+                    request.getRepositories() != null ? 
request.getRepositories() : session.getRemoteRepositories());
             ProjectBuildingRequest req = new DefaultProjectBuildingRequest()
                     .setRepositorySession(session.getSession())
                     .setRemoteRepositories(repositories)
@@ -134,14 +135,14 @@ public class DefaultProjectBuilder implements 
ProjectBuilder {
                             }
 
                             if (getLineNumber() > 0) {
-                                if (buffer.length() > 0) {
+                                if (!buffer.isEmpty()) {
                                     buffer.append(", ");
                                 }
                                 buffer.append("line ").append(getLineNumber());
                             }
 
                             if (getColumnNumber() > 0) {
-                                if (buffer.length() > 0) {
+                                if (!buffer.isEmpty()) {
                                     buffer.append(", ");
                                 }
                                 buffer.append("column 
").append(getColumnNumber());
diff --git 
a/maven-core/src/main/java/org/apache/maven/plugin/internal/DefaultMavenPluginManager.java
 
b/maven-core/src/main/java/org/apache/maven/plugin/internal/DefaultMavenPluginManager.java
index 77d11a2706..76d359f461 100644
--- 
a/maven-core/src/main/java/org/apache/maven/plugin/internal/DefaultMavenPluginManager.java
+++ 
b/maven-core/src/main/java/org/apache/maven/plugin/internal/DefaultMavenPluginManager.java
@@ -54,7 +54,6 @@ import org.apache.maven.api.plugin.descriptor.Resolution;
 import org.apache.maven.api.services.DependencyResolver;
 import org.apache.maven.api.services.DependencyResolverResult;
 import org.apache.maven.api.services.PathScopeRegistry;
-import org.apache.maven.api.services.ProjectManager;
 import org.apache.maven.api.xml.XmlNode;
 import org.apache.maven.artifact.Artifact;
 import org.apache.maven.classrealm.ClassRealmManager;
@@ -549,10 +548,6 @@ public class DefaultMavenPluginManager implements 
MavenPluginManager {
         InternalMavenSession sessionV4 = 
InternalMavenSession.from(session.getSession());
         Project project = sessionV4.getProject(session.getCurrentProject());
 
-        List<org.apache.maven.api.RemoteRepository> repos =
-                
sessionV4.getService(ProjectManager.class).getRemoteProjectRepositories(project);
-        sessionV4 = 
InternalMavenSession.from(sessionV4.withRemoteRepositories(repos));
-
         org.apache.maven.api.MojoExecution execution = new 
DefaultMojoExecution(sessionV4, mojoExecution);
         org.apache.maven.api.plugin.Log log = new DefaultLog(
                 
LoggerFactory.getLogger(mojoExecution.getMojoDescriptor().getFullGoalName()));
diff --git 
a/maven-core/src/main/java/org/apache/maven/project/DefaultProjectBuilder.java 
b/maven-core/src/main/java/org/apache/maven/project/DefaultProjectBuilder.java
index ee945eff3f..ba7ca435f5 100644
--- 
a/maven-core/src/main/java/org/apache/maven/project/DefaultProjectBuilder.java
+++ 
b/maven-core/src/main/java/org/apache/maven/project/DefaultProjectBuilder.java
@@ -1108,9 +1108,7 @@ public class DefaultProjectBuilder implements 
ProjectBuilder {
             ModelBuilderRequest.ModelBuilderRequestBuilder 
modelBuildingRequest = ModelBuilderRequest.builder();
 
             InternalSession internalSession = InternalSession.from(session);
-            
modelBuildingRequest.session(internalSession.withRemoteRepositories(request.getRemoteRepositories().stream()
-                    .map(r -> 
internalSession.getRemoteRepository(RepositoryUtils.toRepo(r)))
-                    .toList()));
+            modelBuildingRequest.session(internalSession);
             modelBuildingRequest.validationLevel(request.getValidationLevel());
             modelBuildingRequest.processPlugins(request.isProcessPlugins());
             modelBuildingRequest.profiles(
@@ -1135,6 +1133,9 @@ public class DefaultProjectBuilder implements 
ProjectBuilder {
             modelBuildingRequest.modelRepositoryHolder(holder);
             modelBuildingRequest.modelCache(modelCache);
             
modelBuildingRequest.transformerContextBuilder(transformerContextBuilder);
+            
modelBuildingRequest.repositories(request.getRemoteRepositories().stream()
+                    .map(r -> 
internalSession.getRemoteRepository(RepositoryUtils.toRepo(r)))
+                    .toList());
             /* TODO: bv4
             InternalMavenSession session =
                     (InternalMavenSession) 
this.session.getData().get(InternalMavenSession.class);
@@ -1300,12 +1301,17 @@ public class DefaultProjectBuilder implements 
ProjectBuilder {
 
         @Override
         public ModelSource resolveModel(
-                Session session, String groupId, String artifactId, String 
version, Consumer<String> resolved)
+                Session session,
+                List<org.apache.maven.api.RemoteRepository> repositories,
+                String groupId,
+                String artifactId,
+                String version,
+                Consumer<String> resolved)
                 throws ModelResolverException {
             try {
                 InternalSession internalSession = 
InternalSession.from(session);
-                org.apache.maven.model.resolution.ModelResolver resolver =
-                        
getResolver(internalSession.toRepositories(internalSession.getRemoteRepositories()));
+                org.apache.maven.model.resolution.ModelResolver resolver = 
getResolver(internalSession.toRepositories(
+                        repositories != null ? repositories : 
internalSession.getRemoteRepositories()));
                 org.apache.maven.model.Parent p = new 
org.apache.maven.model.Parent(Parent.newBuilder()
                         .groupId(groupId)
                         .artifactId(artifactId)
@@ -1322,13 +1328,17 @@ public class DefaultProjectBuilder implements 
ProjectBuilder {
         }
 
         @Override
-        public ModelSource resolveModel(Session session, Parent parent, 
AtomicReference<Parent> modified)
+        public ModelSource resolveModel(
+                Session session,
+                List<org.apache.maven.api.RemoteRepository> repositories,
+                Parent parent,
+                AtomicReference<Parent> modified)
                 throws ModelResolverException {
             try {
                 org.apache.maven.model.Parent p = new 
org.apache.maven.model.Parent(parent);
                 InternalSession internalSession = 
InternalSession.from(session);
-                org.apache.maven.model.resolution.ModelResolver resolver =
-                        
getResolver(internalSession.toRepositories(internalSession.getRemoteRepositories()));
+                org.apache.maven.model.resolution.ModelResolver resolver = 
getResolver(internalSession.toRepositories(
+                        repositories != null ? repositories : 
internalSession.getRemoteRepositories()));
                 ModelSource source = toSource(resolver.resolveModel(p));
                 if (p.getDelegate() != parent) {
                     modified.set(p.getDelegate());
@@ -1340,13 +1350,17 @@ public class DefaultProjectBuilder implements 
ProjectBuilder {
         }
 
         @Override
-        public ModelSource resolveModel(Session session, Dependency 
dependency, AtomicReference<Dependency> modified)
+        public ModelSource resolveModel(
+                Session session,
+                List<org.apache.maven.api.RemoteRepository> repositories,
+                Dependency dependency,
+                AtomicReference<Dependency> modified)
                 throws ModelResolverException {
             try {
                 org.apache.maven.model.Dependency d = new 
org.apache.maven.model.Dependency(dependency);
                 InternalSession internalSession = 
InternalSession.from(session);
-                org.apache.maven.model.resolution.ModelResolver resolver =
-                        
getResolver(internalSession.toRepositories(internalSession.getRemoteRepositories()));
+                org.apache.maven.model.resolution.ModelResolver resolver = 
getResolver(internalSession.toRepositories(
+                        repositories != null ? repositories : 
internalSession.getRemoteRepositories()));
                 ModelSource source = toSource(resolver.resolveModel(d));
                 if (d.getDelegate() != dependency) {
                     modified.set(d.getDelegate());
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 92308e2f2e..c21e890238 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
@@ -27,8 +27,10 @@ import java.nio.file.Files;
 import java.nio.file.Path;
 import java.nio.file.Paths;
 import java.util.Collections;
+import java.util.List;
 import java.util.function.Consumer;
 
+import org.apache.maven.api.RemoteRepository;
 import org.apache.maven.api.Session;
 import org.apache.maven.api.model.Model;
 import org.apache.maven.api.services.ModelResolver;
@@ -101,7 +103,12 @@ public class ConsumerPomBuilderTest extends 
AbstractRepositoryTestCase {
     public static class MyModelResolver implements ModelResolver {
         @Override
         public ModelSource resolveModel(
-                Session session, String groupId, String artifactId, String 
version, Consumer<String> resolvedVersion)
+                Session session,
+                List<RemoteRepository> repositories,
+                String groupId,
+                String artifactId,
+                String version,
+                Consumer<String> resolvedVersion)
                 throws ModelResolverException {
             String id = groupId + ":" + artifactId + ":" + version;
             if (id.startsWith("org.sonatype.mavenbook.multi:parent:")) {

Reply via email to