This is an automated email from the ASF dual-hosted git repository.

cstamas 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 20f7cfc361 [MNG-8026] Maven drives regarding scopes (#1392)
20f7cfc361 is described below

commit 20f7cfc36132d486167750546039044601854c7a
Author: Tamas Cservenak <[email protected]>
AuthorDate: Thu Jan 25 14:58:24 2024 +0100

    [MNG-8026] Maven drives regarding scopes (#1392)
    
    Maven should be fully in control regarding dependency scope definitions and 
their interpretations (and transformations).
    This PR makes following changes:
    * no change in behaviour (all works as before), but
    * maven codebase contains now all the code related to scopes
    * no resolver code is in use that was deprecated (as it was wrong to have 
it in resolver), see issue 
[MRESOLVER-471](https://issues.apache.org/jira/browse/MRESOLVER-471)
    * this also stops scope definitions duplication as well, they are now 
defined in one single project: Maven
    
    ---
    
    https://issues.apache.org/jira/browse/MNG-8026
---
 .../AbstractArtifactComponentTestCase.java         |  12 +-
 .../DefaultRepositorySystemSessionFactory.java     |   6 +-
 .../DefaultPluginDependenciesResolver.java         |   6 +-
 .../Maven3CompatDependenciesValidator.java         |   4 +-
 .../internal/MavenScopeDependenciesValidator.java  |   5 +-
 .../DefaultProjectDependenciesResolver.java        |   4 +-
 .../maven/AbstractCoreMavenComponentTestCase.java  |  22 ++--
 .../maven/internal/impl/DefaultSessionTest.java    |   6 +-
 .../org/apache/maven/internal/impl/TestApi.java    |   9 +-
 .../transformation/AbstractRepositoryTestCase.java |   3 +-
 .../project/AbstractMavenProjectTestCase.java      |   3 +-
 .../apache/maven/project/PomConstructionTest.java  |   3 +-
 .../maven/project/ProjectModelResolverTest.java    |   3 +-
 .../settings/PomConstructionWithSettingsTest.java  |   3 +-
 .../internal/MavenRepositorySystemUtils.java       |  20 ++--
 ...Utils.java => MavenSessionBuilderSupplier.java} | 127 +++++++++------------
 .../scopes/MavenDependencyContextRefiner.java      |  81 +++++++++++++
 .../internal/scopes/MavenDependencyScopes.java     |  53 +++++++++
 .../internal/scopes/MavenScopeDeriver.java         |  62 ++++++++++
 .../internal/scopes/MavenScopeSelector.java        |  86 ++++++++++++++
 .../internal/AbstractRepositoryTestCase.java       |   7 +-
 21 files changed, 399 insertions(+), 126 deletions(-)

diff --git 
a/maven-compat/src/test/java/org/apache/maven/artifact/AbstractArtifactComponentTestCase.java
 
b/maven-compat/src/test/java/org/apache/maven/artifact/AbstractArtifactComponentTestCase.java
index 5ffffb62ba..47c8c646d7 100644
--- 
a/maven-compat/src/test/java/org/apache/maven/artifact/AbstractArtifactComponentTestCase.java
+++ 
b/maven-compat/src/test/java/org/apache/maven/artifact/AbstractArtifactComponentTestCase.java
@@ -42,6 +42,9 @@ import org.apache.maven.execution.MavenSession;
 import org.apache.maven.internal.impl.DefaultLookup;
 import org.apache.maven.internal.impl.DefaultSessionFactory;
 import org.apache.maven.plugin.LegacySupport;
+import 
org.apache.maven.repository.internal.scopes.MavenDependencyContextRefiner;
+import org.apache.maven.repository.internal.scopes.MavenScopeDeriver;
+import org.apache.maven.repository.internal.scopes.MavenScopeSelector;
 import org.apache.maven.repository.legacy.repository.ArtifactRepositoryFactory;
 import org.apache.maven.rtinfo.RuntimeInformation;
 import org.codehaus.plexus.PlexusContainer;
@@ -62,9 +65,6 @@ import 
org.eclipse.aether.util.graph.selector.OptionalDependencySelector;
 import org.eclipse.aether.util.graph.selector.ScopeDependencySelector;
 import 
org.eclipse.aether.util.graph.transformer.ChainedDependencyGraphTransformer;
 import org.eclipse.aether.util.graph.transformer.ConflictResolver;
-import org.eclipse.aether.util.graph.transformer.JavaDependencyContextRefiner;
-import org.eclipse.aether.util.graph.transformer.JavaScopeDeriver;
-import org.eclipse.aether.util.graph.transformer.JavaScopeSelector;
 import org.eclipse.aether.util.graph.transformer.NearestVersionSelector;
 import org.eclipse.aether.util.graph.transformer.SimpleOptionalitySelector;
 import org.eclipse.aether.util.graph.traverser.FatArtifactTraverser;
@@ -314,9 +314,9 @@ public abstract class AbstractArtifactComponentTestCase // 
extends PlexusTestCas
         session.setDependencySelector(depFilter);
 
         DependencyGraphTransformer transformer = new ConflictResolver(
-                new NearestVersionSelector(), new JavaScopeSelector(),
-                new SimpleOptionalitySelector(), new JavaScopeDeriver());
-        transformer = new ChainedDependencyGraphTransformer(transformer, new 
JavaDependencyContextRefiner());
+                new NearestVersionSelector(), new MavenScopeSelector(),
+                new SimpleOptionalitySelector(), new MavenScopeDeriver());
+        transformer = new ChainedDependencyGraphTransformer(transformer, new 
MavenDependencyContextRefiner());
         session.setDependencyGraphTransformer(transformer);
 
         LocalRepository localRepo = new 
LocalRepository(localRepository().getBasedir());
diff --git 
a/maven-core/src/main/java/org/apache/maven/internal/aether/DefaultRepositorySystemSessionFactory.java
 
b/maven-core/src/main/java/org/apache/maven/internal/aether/DefaultRepositorySystemSessionFactory.java
index e080f0d87e..210f876bab 100644
--- 
a/maven-core/src/main/java/org/apache/maven/internal/aether/DefaultRepositorySystemSessionFactory.java
+++ 
b/maven-core/src/main/java/org/apache/maven/internal/aether/DefaultRepositorySystemSessionFactory.java
@@ -36,7 +36,7 @@ import org.apache.maven.execution.MavenExecutionRequest;
 import org.apache.maven.internal.xml.XmlNodeImpl;
 import org.apache.maven.internal.xml.XmlPlexusConfiguration;
 import org.apache.maven.model.ModelBase;
-import org.apache.maven.repository.internal.MavenRepositorySystemUtils;
+import org.apache.maven.repository.internal.MavenSessionBuilderSupplier;
 import org.apache.maven.resolver.RepositorySystemSessionFactory;
 import org.apache.maven.rtinfo.RuntimeInformation;
 import org.apache.maven.settings.Mirror;
@@ -220,8 +220,8 @@ class DefaultRepositorySystemSessionFactory implements 
RepositorySystemSessionFa
             requestExtender.extend(request);
         }
 
-        SessionBuilder sessionBuilder = MavenRepositorySystemUtils.newSession(
-                repoSystem.createSessionBuilder(), new 
TypeRegistryAdapter(typeRegistry));
+        SessionBuilder sessionBuilder = new 
MavenSessionBuilderSupplier(repoSystem).get();
+        sessionBuilder.setArtifactTypeRegistry(new 
TypeRegistryAdapter(typeRegistry));
         sessionBuilder.setCache(request.getRepositoryCache());
 
         // this map is read ONLY to get config from (profiles + env + system + 
user)
diff --git 
a/maven-core/src/main/java/org/apache/maven/plugin/internal/DefaultPluginDependenciesResolver.java
 
b/maven-core/src/main/java/org/apache/maven/plugin/internal/DefaultPluginDependenciesResolver.java
index e3a6ed5b6e..4cc6082153 100644
--- 
a/maven-core/src/main/java/org/apache/maven/plugin/internal/DefaultPluginDependenciesResolver.java
+++ 
b/maven-core/src/main/java/org/apache/maven/plugin/internal/DefaultPluginDependenciesResolver.java
@@ -32,6 +32,7 @@ import org.apache.maven.RepositoryUtils;
 import org.apache.maven.model.Dependency;
 import org.apache.maven.model.Plugin;
 import org.apache.maven.plugin.PluginResolutionException;
+import org.apache.maven.repository.internal.scopes.MavenDependencyScopes;
 import org.eclipse.aether.DefaultRepositorySystemSession;
 import org.eclipse.aether.RepositorySystem;
 import org.eclipse.aether.RepositorySystemSession;
@@ -52,7 +53,6 @@ import 
org.eclipse.aether.resolution.ArtifactResolutionException;
 import org.eclipse.aether.resolution.DependencyRequest;
 import org.eclipse.aether.resolution.DependencyResolutionException;
 import org.eclipse.aether.resolution.DependencyResult;
-import org.eclipse.aether.util.artifact.JavaScopes;
 import org.eclipse.aether.util.filter.AndDependencyFilter;
 import org.eclipse.aether.util.filter.ScopeDependencyFilter;
 import org.eclipse.aether.util.graph.manager.DependencyManagerUtils;
@@ -211,8 +211,8 @@ public class DefaultPluginDependenciesResolver implements 
PluginDependenciesReso
             for (Dependency dependency : plugin.getDependencies()) {
                 org.eclipse.aether.graph.Dependency pluginDep =
                         RepositoryUtils.toDependency(dependency, 
session.getArtifactTypeRegistry());
-                if (!JavaScopes.SYSTEM.equals(pluginDep.getScope())) {
-                    pluginDep = pluginDep.setScope(JavaScopes.RUNTIME);
+                if 
(!MavenDependencyScopes.SYSTEM.equals(pluginDep.getScope())) {
+                    pluginDep = 
pluginDep.setScope(MavenDependencyScopes.RUNTIME);
                 }
                 request.addDependency(pluginDep);
             }
diff --git 
a/maven-core/src/main/java/org/apache/maven/plugin/internal/Maven3CompatDependenciesValidator.java
 
b/maven-core/src/main/java/org/apache/maven/plugin/internal/Maven3CompatDependenciesValidator.java
index 67812245d6..495436419d 100644
--- 
a/maven-core/src/main/java/org/apache/maven/plugin/internal/Maven3CompatDependenciesValidator.java
+++ 
b/maven-core/src/main/java/org/apache/maven/plugin/internal/Maven3CompatDependenciesValidator.java
@@ -23,10 +23,10 @@ import javax.inject.Named;
 import javax.inject.Singleton;
 
 import org.apache.maven.plugin.PluginValidationManager;
+import org.apache.maven.repository.internal.scopes.MavenDependencyScopes;
 import org.eclipse.aether.RepositorySystemSession;
 import org.eclipse.aether.artifact.Artifact;
 import org.eclipse.aether.resolution.ArtifactDescriptorResult;
-import org.eclipse.aether.util.artifact.JavaScopes;
 
 /**
  * Detects Maven3 plugins using maven-compat Maven2 compatibility layer.
@@ -50,7 +50,7 @@ class Maven3CompatDependenciesValidator extends 
AbstractMavenPluginDependenciesV
         for (org.eclipse.aether.graph.Dependency dependency : 
artifactDescriptorResult.getDependencies()) {
             if 
("org.apache.maven".equals(dependency.getArtifact().getGroupId())
                     && 
"maven-compat".equals(dependency.getArtifact().getArtifactId())
-                    && !JavaScopes.TEST.equals(dependency.getScope())) {
+                    && 
!MavenDependencyScopes.TEST.equals(dependency.getScope())) {
                 pluginValidationManager.reportPluginValidationIssue(
                         PluginValidationManager.IssueLocality.EXTERNAL,
                         session,
diff --git 
a/maven-core/src/main/java/org/apache/maven/plugin/internal/MavenScopeDependenciesValidator.java
 
b/maven-core/src/main/java/org/apache/maven/plugin/internal/MavenScopeDependenciesValidator.java
index 844197fc03..796a5b95f6 100644
--- 
a/maven-core/src/main/java/org/apache/maven/plugin/internal/MavenScopeDependenciesValidator.java
+++ 
b/maven-core/src/main/java/org/apache/maven/plugin/internal/MavenScopeDependenciesValidator.java
@@ -26,10 +26,10 @@ import java.util.Set;
 import java.util.stream.Collectors;
 
 import org.apache.maven.plugin.PluginValidationManager;
+import org.apache.maven.repository.internal.scopes.MavenDependencyScopes;
 import org.eclipse.aether.RepositorySystemSession;
 import org.eclipse.aether.artifact.Artifact;
 import org.eclipse.aether.resolution.ArtifactDescriptorResult;
-import org.eclipse.aether.util.artifact.JavaScopes;
 
 /**
  * Detects Maven3 dependencies scope.
@@ -51,7 +51,8 @@ class MavenScopeDependenciesValidator extends 
AbstractMavenPluginDependenciesVal
             Artifact pluginArtifact,
             ArtifactDescriptorResult artifactDescriptorResult) {
         Set<String> mavenArtifacts = 
artifactDescriptorResult.getDependencies().stream()
-                .filter(d -> !JavaScopes.PROVIDED.equals(d.getScope()) && 
!JavaScopes.TEST.equals(d.getScope()))
+                .filter(d -> 
!MavenDependencyScopes.PROVIDED.equals(d.getScope())
+                        && !MavenDependencyScopes.TEST.equals(d.getScope()))
                 .map(org.eclipse.aether.graph.Dependency::getArtifact)
                 .filter(a -> "org.apache.maven".equals(a.getGroupId()))
                 .filter(a -> 
!DefaultPluginValidationManager.EXPECTED_PROVIDED_SCOPE_EXCLUSIONS_GA.contains(
diff --git 
a/maven-core/src/main/java/org/apache/maven/project/DefaultProjectDependenciesResolver.java
 
b/maven-core/src/main/java/org/apache/maven/project/DefaultProjectDependenciesResolver.java
index 202fc4b37f..87a974f0cd 100644
--- 
a/maven-core/src/main/java/org/apache/maven/project/DefaultProjectDependenciesResolver.java
+++ 
b/maven-core/src/main/java/org/apache/maven/project/DefaultProjectDependenciesResolver.java
@@ -33,6 +33,7 @@ import org.apache.maven.artifact.Artifact;
 import org.apache.maven.model.Dependency;
 import org.apache.maven.model.DependencyManagement;
 import org.apache.maven.model.Exclusion;
+import org.apache.maven.repository.internal.scopes.MavenDependencyScopes;
 import org.eclipse.aether.DefaultRepositorySystemSession;
 import org.eclipse.aether.RepositorySystem;
 import org.eclipse.aether.RepositorySystemSession;
@@ -47,7 +48,6 @@ import org.eclipse.aether.graph.DependencyVisitor;
 import org.eclipse.aether.resolution.ArtifactResult;
 import org.eclipse.aether.resolution.DependencyRequest;
 import org.eclipse.aether.util.artifact.ArtifactIdUtils;
-import org.eclipse.aether.util.artifact.JavaScopes;
 import org.eclipse.aether.util.graph.manager.DependencyManagerUtils;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
@@ -130,7 +130,7 @@ public class DefaultProjectDependenciesResolver implements 
ProjectDependenciesRe
                 Dependency dependency = dependencies.get(key);
                 Collection<Exclusion> exclusions = dependency != null ? 
dependency.getExclusions() : null;
                 org.eclipse.aether.graph.Dependency dep = 
RepositoryUtils.toDependency(artifact, exclusions);
-                if (!JavaScopes.SYSTEM.equals(dep.getScope())
+                if (!MavenDependencyScopes.SYSTEM.equals(dep.getScope())
                         && dep.getArtifact().getFile() != null) {
                     // enable re-resolution
                     org.eclipse.aether.artifact.Artifact art = 
dep.getArtifact();
diff --git 
a/maven-core/src/test/java/org/apache/maven/AbstractCoreMavenComponentTestCase.java
 
b/maven-core/src/test/java/org/apache/maven/AbstractCoreMavenComponentTestCase.java
index 51f9969258..8feff06717 100644
--- 
a/maven-core/src/test/java/org/apache/maven/AbstractCoreMavenComponentTestCase.java
+++ 
b/maven-core/src/test/java/org/apache/maven/AbstractCoreMavenComponentTestCase.java
@@ -45,13 +45,12 @@ import org.apache.maven.model.RepositoryPolicy;
 import org.apache.maven.project.DefaultProjectBuildingRequest;
 import org.apache.maven.project.MavenProject;
 import org.apache.maven.project.ProjectBuildingRequest;
-import org.apache.maven.repository.internal.MavenRepositorySystemUtils;
+import org.apache.maven.repository.internal.MavenSessionBuilderSupplier;
 import org.codehaus.plexus.PlexusContainer;
 import org.codehaus.plexus.testing.PlexusTest;
 import org.codehaus.plexus.util.FileUtils;
-import org.eclipse.aether.DefaultRepositorySystemSession;
 import org.eclipse.aether.RepositorySystem;
-import org.eclipse.aether.internal.impl.SimpleLocalRepositoryManagerFactory;
+import org.eclipse.aether.RepositorySystemSession;
 import org.eclipse.aether.repository.LocalRepository;
 
 import static org.codehaus.plexus.testing.PlexusExtension.getBasedir;
@@ -64,7 +63,10 @@ public abstract class AbstractCoreMavenComponentTestCase {
     protected PlexusContainer container;
 
     @Inject
-    protected MavenRepositorySystem repositorySystem;
+    protected RepositorySystem repositorySystem;
+
+    @Inject
+    protected MavenRepositorySystem mavenRepositorySystem;
 
     @Inject
     protected org.apache.maven.project.ProjectBuilder projectBuilder;
@@ -160,9 +162,11 @@ public abstract class AbstractCoreMavenComponentTestCase {
 
     protected void initRepoSession(ProjectBuildingRequest request) throws 
Exception {
         File localRepoDir = new 
File(request.getLocalRepository().getBasedir());
-        LocalRepository localRepo = new LocalRepository(localRepoDir);
-        DefaultRepositorySystemSession session = 
MavenRepositorySystemUtils.newSession();
-        session.setLocalRepositoryManager(new 
SimpleLocalRepositoryManagerFactory().newInstance(session, localRepo));
+        LocalRepository localRepo = new LocalRepository(localRepoDir, 
"simple");
+        RepositorySystemSession session = new 
MavenSessionBuilderSupplier(repositorySystem)
+                .get()
+                .withLocalRepositories(localRepo)
+                .build();
         request.setRepositorySession(session);
     }
 
@@ -188,7 +192,7 @@ public abstract class AbstractCoreMavenComponentTestCase {
         repository.setReleases(policy);
         repository.setSnapshots(policy);
 
-        return 
Arrays.asList(repositorySystem.buildArtifactRepository(repository));
+        return 
Arrays.asList(mavenRepositorySystem.buildArtifactRepository(repository));
     }
 
     protected List<ArtifactRepository> getPluginArtifactRepositories() throws 
InvalidRepositoryException {
@@ -198,7 +202,7 @@ public abstract class AbstractCoreMavenComponentTestCase {
     protected ArtifactRepository getLocalRepository() throws 
InvalidRepositoryException {
         File repoDir = new File(getBasedir(), 
"target/local-repo").getAbsoluteFile();
 
-        return repositorySystem.createLocalRepository(repoDir);
+        return mavenRepositorySystem.createLocalRepository(repoDir);
     }
 
     protected class ProjectBuilder {
diff --git 
a/maven-core/src/test/java/org/apache/maven/internal/impl/DefaultSessionTest.java
 
b/maven-core/src/test/java/org/apache/maven/internal/impl/DefaultSessionTest.java
index e8ff9c0443..a25276b22e 100644
--- 
a/maven-core/src/test/java/org/apache/maven/internal/impl/DefaultSessionTest.java
+++ 
b/maven-core/src/test/java/org/apache/maven/internal/impl/DefaultSessionTest.java
@@ -24,7 +24,7 @@ import java.util.Collections;
 import org.apache.maven.execution.DefaultMavenExecutionRequest;
 import org.apache.maven.execution.MavenSession;
 import org.apache.maven.model.root.RootLocator;
-import org.apache.maven.repository.internal.MavenRepositorySystemUtils;
+import org.eclipse.aether.DefaultRepositorySystemSession;
 import org.eclipse.aether.RepositorySystem;
 import org.eclipse.aether.RepositorySystemSession;
 import org.junit.jupiter.api.Test;
@@ -37,7 +37,7 @@ public class DefaultSessionTest {
 
     @Test
     void testRootDirectoryWithNull() {
-        RepositorySystemSession rss = MavenRepositorySystemUtils.newSession();
+        RepositorySystemSession rss = new DefaultRepositorySystemSession(h -> 
false);
         DefaultMavenExecutionRequest mer = new DefaultMavenExecutionRequest();
         MavenSession ms = new MavenSession(null, rss, mer, null);
         DefaultSession session =
@@ -51,7 +51,7 @@ public class DefaultSessionTest {
 
     @Test
     void testRootDirectory() {
-        RepositorySystemSession rss = MavenRepositorySystemUtils.newSession();
+        RepositorySystemSession rss = new DefaultRepositorySystemSession(h -> 
false);
         DefaultMavenExecutionRequest mer = new DefaultMavenExecutionRequest();
         MavenSession ms = new MavenSession(null, rss, mer, null);
         ms.getRequest().setRootDirectory(Paths.get("myRootDirectory"));
diff --git 
a/maven-core/src/test/java/org/apache/maven/internal/impl/TestApi.java 
b/maven-core/src/test/java/org/apache/maven/internal/impl/TestApi.java
index 2e6846d8e3..e00fb5f08a 100644
--- a/maven-core/src/test/java/org/apache/maven/internal/impl/TestApi.java
+++ b/maven-core/src/test/java/org/apache/maven/internal/impl/TestApi.java
@@ -20,6 +20,7 @@ package org.apache.maven.internal.impl;
 
 import javax.inject.Inject;
 
+import java.io.File;
 import java.nio.file.Path;
 import java.util.ArrayList;
 import java.util.Collections;
@@ -47,7 +48,7 @@ import 
org.apache.maven.execution.DefaultMavenExecutionRequest;
 import org.apache.maven.execution.DefaultMavenExecutionResult;
 import org.apache.maven.execution.MavenSession;
 import org.apache.maven.execution.scope.internal.MojoExecutionScope;
-import org.apache.maven.repository.internal.MavenRepositorySystemUtils;
+import org.apache.maven.repository.internal.MavenSessionBuilderSupplier;
 import org.apache.maven.rtinfo.RuntimeInformation;
 import org.apache.maven.session.scope.internal.SessionScope;
 import org.apache.maven.toolchain.DefaultToolchainManagerPrivate;
@@ -105,7 +106,11 @@ class TestApi {
 
     @BeforeEach
     void setup() {
-        RepositorySystemSession rss = MavenRepositorySystemUtils.newSession();
+        // create session with any local repo, is redefined anyway below
+        RepositorySystemSession rss = new 
MavenSessionBuilderSupplier(repositorySystem)
+                .get()
+                .withLocalRepositoryBaseDirectories(new File("target"))
+                .build();
         DefaultMavenExecutionRequest mer = new DefaultMavenExecutionRequest();
         DefaultMavenExecutionResult meres = new DefaultMavenExecutionResult();
         MavenSession ms = new MavenSession(rss, mer, meres);
diff --git 
a/maven-core/src/test/java/org/apache/maven/internal/transformation/AbstractRepositoryTestCase.java
 
b/maven-core/src/test/java/org/apache/maven/internal/transformation/AbstractRepositoryTestCase.java
index 728e7494ba..5e7f11f0b7 100644
--- 
a/maven-core/src/test/java/org/apache/maven/internal/transformation/AbstractRepositoryTestCase.java
+++ 
b/maven-core/src/test/java/org/apache/maven/internal/transformation/AbstractRepositoryTestCase.java
@@ -22,7 +22,6 @@ import javax.inject.Inject;
 
 import java.net.MalformedURLException;
 
-import org.apache.maven.repository.internal.MavenRepositorySystemUtils;
 import org.codehaus.plexus.PlexusContainer;
 import org.codehaus.plexus.testing.PlexusTest;
 import org.eclipse.aether.DefaultRepositorySystemSession;
@@ -57,7 +56,7 @@ public abstract class AbstractRepositoryTestCase {
     }
 
     public static RepositorySystemSession 
newMavenRepositorySystemSession(RepositorySystem system) {
-        DefaultRepositorySystemSession session = 
MavenRepositorySystemUtils.newSession();
+        DefaultRepositorySystemSession session = new 
DefaultRepositorySystemSession(h -> false);
 
         LocalRepository localRepo = new LocalRepository("target/local-repo");
         
session.setLocalRepositoryManager(system.newLocalRepositoryManager(session, 
localRepo));
diff --git 
a/maven-core/src/test/java/org/apache/maven/project/AbstractMavenProjectTestCase.java
 
b/maven-core/src/test/java/org/apache/maven/project/AbstractMavenProjectTestCase.java
index cd017cb837..e709719df8 100644
--- 
a/maven-core/src/test/java/org/apache/maven/project/AbstractMavenProjectTestCase.java
+++ 
b/maven-core/src/test/java/org/apache/maven/project/AbstractMavenProjectTestCase.java
@@ -30,7 +30,6 @@ import 
org.apache.maven.artifact.repository.ArtifactRepository;
 import org.apache.maven.bridge.MavenRepositorySystem;
 import org.apache.maven.model.building.ModelBuildingException;
 import org.apache.maven.model.building.ModelProblem;
-import org.apache.maven.repository.internal.MavenRepositorySystemUtils;
 import org.codehaus.plexus.PlexusContainer;
 import org.codehaus.plexus.testing.PlexusTest;
 import org.eclipse.aether.DefaultRepositoryCache;
@@ -145,7 +144,7 @@ public abstract class AbstractMavenProjectTestCase {
 
     protected void initRepoSession(ProjectBuildingRequest request) {
         File localRepo = new File(request.getLocalRepository().getBasedir());
-        DefaultRepositorySystemSession repoSession = 
MavenRepositorySystemUtils.newSession();
+        DefaultRepositorySystemSession repoSession = new 
DefaultRepositorySystemSession(h -> false);
         repoSession.setCache(new DefaultRepositoryCache());
         repoSession.setLocalRepositoryManager(new 
LegacyLocalRepositoryManager(localRepo));
         request.setRepositorySession(repoSession);
diff --git 
a/maven-core/src/test/java/org/apache/maven/project/PomConstructionTest.java 
b/maven-core/src/test/java/org/apache/maven/project/PomConstructionTest.java
index feb65563fe..0a39ed14a8 100644
--- a/maven-core/src/test/java/org/apache/maven/project/PomConstructionTest.java
+++ b/maven-core/src/test/java/org/apache/maven/project/PomConstructionTest.java
@@ -37,7 +37,6 @@ import org.apache.maven.model.ReportPlugin;
 import org.apache.maven.model.ReportSet;
 import org.apache.maven.model.building.ModelBuildingRequest;
 import org.apache.maven.project.harness.PomTestWrapper;
-import org.apache.maven.repository.internal.MavenRepositorySystemUtils;
 import org.codehaus.plexus.testing.PlexusTest;
 import org.eclipse.aether.DefaultRepositorySystemSession;
 import org.eclipse.aether.internal.impl.SimpleLocalRepositoryManagerFactory;
@@ -1887,7 +1886,7 @@ class PomConstructionTest {
                         ? ModelBuildingRequest.VALIDATION_LEVEL_MAVEN_2_0
                         : ModelBuildingRequest.VALIDATION_LEVEL_STRICT);
 
-        DefaultRepositorySystemSession repoSession = 
MavenRepositorySystemUtils.newSession();
+        DefaultRepositorySystemSession repoSession = new 
DefaultRepositorySystemSession(h -> false);
         LocalRepository localRepo =
                 new LocalRepository(config.getLocalRepository().getBasedir());
         repoSession.setLocalRepositoryManager(
diff --git 
a/maven-core/src/test/java/org/apache/maven/project/ProjectModelResolverTest.java
 
b/maven-core/src/test/java/org/apache/maven/project/ProjectModelResolverTest.java
index ec8cb759b8..e96d324d93 100644
--- 
a/maven-core/src/test/java/org/apache/maven/project/ProjectModelResolverTest.java
+++ 
b/maven-core/src/test/java/org/apache/maven/project/ProjectModelResolverTest.java
@@ -29,7 +29,6 @@ import org.apache.maven.model.Dependency;
 import org.apache.maven.model.Parent;
 import org.apache.maven.model.resolution.ModelResolver;
 import org.apache.maven.model.resolution.UnresolvableModelException;
-import org.apache.maven.repository.internal.MavenRepositorySystemUtils;
 import org.eclipse.aether.DefaultRepositorySystemSession;
 import org.eclipse.aether.RepositorySystem;
 import org.eclipse.aether.impl.RemoteRepositoryManager;
@@ -191,7 +190,7 @@ class ProjectModelResolverTest extends 
AbstractMavenProjectTestCase {
 
     private ModelResolver newModelResolver() throws Exception {
         final File localRepo = new 
File(this.getLocalRepository().getBasedir());
-        final DefaultRepositorySystemSession repoSession = 
MavenRepositorySystemUtils.newSession();
+        final DefaultRepositorySystemSession repoSession = new 
DefaultRepositorySystemSession(h -> false);
         repoSession.setLocalRepositoryManager(new 
LegacyLocalRepositoryManager(localRepo));
 
         return new ProjectModelResolver(
diff --git 
a/maven-core/src/test/java/org/apache/maven/settings/PomConstructionWithSettingsTest.java
 
b/maven-core/src/test/java/org/apache/maven/settings/PomConstructionWithSettingsTest.java
index bb7193d431..11c0bfda51 100644
--- 
a/maven-core/src/test/java/org/apache/maven/settings/PomConstructionWithSettingsTest.java
+++ 
b/maven-core/src/test/java/org/apache/maven/settings/PomConstructionWithSettingsTest.java
@@ -34,7 +34,6 @@ import org.apache.maven.project.DefaultProjectBuilder;
 import org.apache.maven.project.DefaultProjectBuildingRequest;
 import org.apache.maven.project.ProjectBuildingRequest;
 import org.apache.maven.project.harness.PomTestWrapper;
-import org.apache.maven.repository.internal.MavenRepositorySystemUtils;
 import org.apache.maven.settings.v4.SettingsStaxReader;
 import org.codehaus.plexus.testing.PlexusTest;
 import org.eclipse.aether.DefaultRepositorySystemSession;
@@ -111,7 +110,7 @@ class PomConstructionWithSettingsTest {
                 "local", localRepoUrl, new DefaultRepositoryLayout(), null, 
null));
         config.setActiveProfileIds(settings.getActiveProfiles());
 
-        DefaultRepositorySystemSession repoSession = 
MavenRepositorySystemUtils.newSession();
+        DefaultRepositorySystemSession repoSession = new 
DefaultRepositorySystemSession(h -> false);
         LocalRepository localRepo =
                 new LocalRepository(config.getLocalRepository().getBasedir());
         repoSession.setLocalRepositoryManager(
diff --git 
a/maven-resolver-provider/src/main/java/org/apache/maven/repository/internal/MavenRepositorySystemUtils.java
 
b/maven-resolver-provider/src/main/java/org/apache/maven/repository/internal/MavenRepositorySystemUtils.java
index 74da91fc9f..a87b6cefdc 100644
--- 
a/maven-resolver-provider/src/main/java/org/apache/maven/repository/internal/MavenRepositorySystemUtils.java
+++ 
b/maven-resolver-provider/src/main/java/org/apache/maven/repository/internal/MavenRepositorySystemUtils.java
@@ -18,6 +18,9 @@
  */
 package org.apache.maven.repository.internal;
 
+import 
org.apache.maven.repository.internal.scopes.MavenDependencyContextRefiner;
+import org.apache.maven.repository.internal.scopes.MavenScopeDeriver;
+import org.apache.maven.repository.internal.scopes.MavenScopeSelector;
 import org.eclipse.aether.DefaultRepositorySystemSession;
 import org.eclipse.aether.RepositorySystemSession.SessionBuilder;
 import org.eclipse.aether.artifact.ArtifactTypeRegistry;
@@ -34,9 +37,6 @@ import 
org.eclipse.aether.util.graph.selector.OptionalDependencySelector;
 import org.eclipse.aether.util.graph.selector.ScopeDependencySelector;
 import 
org.eclipse.aether.util.graph.transformer.ChainedDependencyGraphTransformer;
 import org.eclipse.aether.util.graph.transformer.ConflictResolver;
-import org.eclipse.aether.util.graph.transformer.JavaDependencyContextRefiner;
-import org.eclipse.aether.util.graph.transformer.JavaScopeDeriver;
-import org.eclipse.aether.util.graph.transformer.JavaScopeSelector;
 import org.eclipse.aether.util.graph.transformer.NearestVersionSelector;
 import org.eclipse.aether.util.graph.transformer.SimpleOptionalitySelector;
 import org.eclipse.aether.util.graph.traverser.FatArtifactTraverser;
@@ -49,7 +49,9 @@ import static java.util.Objects.requireNonNull;
  * assist those clients that employ the repository system outside of an IoC 
container, Maven plugins should instead
  * always use regular dependency injection to acquire the repository system.
  *
+ * @deprecated See {@link MavenSessionBuilderSupplier}
  */
+@Deprecated
 public final class MavenRepositorySystemUtils {
 
     private MavenRepositorySystemUtils() {
@@ -78,9 +80,9 @@ public final class MavenRepositorySystemUtils {
         session.setDependencySelector(depFilter);
 
         DependencyGraphTransformer transformer = new ConflictResolver(
-                new NearestVersionSelector(), new JavaScopeSelector(),
-                new SimpleOptionalitySelector(), new JavaScopeDeriver());
-        transformer = new ChainedDependencyGraphTransformer(transformer, new 
JavaDependencyContextRefiner());
+                new NearestVersionSelector(), new MavenScopeSelector(),
+                new SimpleOptionalitySelector(), new MavenScopeDeriver());
+        transformer = new ChainedDependencyGraphTransformer(transformer, new 
MavenDependencyContextRefiner());
         session.setDependencyGraphTransformer(transformer);
 
         session.setArtifactTypeRegistry(newArtifactTypeRegistry());
@@ -138,9 +140,9 @@ public final class MavenRepositorySystemUtils {
         session.setDependencySelector(depFilter);
 
         DependencyGraphTransformer transformer = new ConflictResolver(
-                new NearestVersionSelector(), new JavaScopeSelector(),
-                new SimpleOptionalitySelector(), new JavaScopeDeriver());
-        transformer = new ChainedDependencyGraphTransformer(transformer, new 
JavaDependencyContextRefiner());
+                new NearestVersionSelector(), new MavenScopeSelector(),
+                new SimpleOptionalitySelector(), new MavenScopeDeriver());
+        transformer = new ChainedDependencyGraphTransformer(transformer, new 
MavenDependencyContextRefiner());
         session.setDependencyGraphTransformer(transformer);
         session.setArtifactTypeRegistry(artifactTypeRegistry);
 
diff --git 
a/maven-resolver-provider/src/main/java/org/apache/maven/repository/internal/MavenRepositorySystemUtils.java
 
b/maven-resolver-provider/src/main/java/org/apache/maven/repository/internal/MavenSessionBuilderSupplier.java
similarity index 51%
copy from 
maven-resolver-provider/src/main/java/org/apache/maven/repository/internal/MavenRepositorySystemUtils.java
copy to 
maven-resolver-provider/src/main/java/org/apache/maven/repository/internal/MavenSessionBuilderSupplier.java
index 74da91fc9f..5400f43675 100644
--- 
a/maven-resolver-provider/src/main/java/org/apache/maven/repository/internal/MavenRepositorySystemUtils.java
+++ 
b/maven-resolver-provider/src/main/java/org/apache/maven/repository/internal/MavenSessionBuilderSupplier.java
@@ -18,7 +18,13 @@
  */
 package org.apache.maven.repository.internal;
 
-import org.eclipse.aether.DefaultRepositorySystemSession;
+import java.util.function.Supplier;
+
+import 
org.apache.maven.repository.internal.scopes.MavenDependencyContextRefiner;
+import org.apache.maven.repository.internal.scopes.MavenScopeDeriver;
+import org.apache.maven.repository.internal.scopes.MavenScopeSelector;
+import org.eclipse.aether.RepositorySystem;
+import org.eclipse.aether.RepositorySystemSession.CloseableSession;
 import org.eclipse.aether.RepositorySystemSession.SessionBuilder;
 import org.eclipse.aether.artifact.ArtifactTypeRegistry;
 import org.eclipse.aether.artifact.DefaultArtifactType;
@@ -26,6 +32,7 @@ import 
org.eclipse.aether.collection.DependencyGraphTransformer;
 import org.eclipse.aether.collection.DependencyManager;
 import org.eclipse.aether.collection.DependencySelector;
 import org.eclipse.aether.collection.DependencyTraverser;
+import org.eclipse.aether.resolution.ArtifactDescriptorPolicy;
 import org.eclipse.aether.util.artifact.DefaultArtifactTypeRegistry;
 import org.eclipse.aether.util.graph.manager.ClassicDependencyManager;
 import org.eclipse.aether.util.graph.selector.AndDependencySelector;
@@ -34,9 +41,6 @@ import 
org.eclipse.aether.util.graph.selector.OptionalDependencySelector;
 import org.eclipse.aether.util.graph.selector.ScopeDependencySelector;
 import 
org.eclipse.aether.util.graph.transformer.ChainedDependencyGraphTransformer;
 import org.eclipse.aether.util.graph.transformer.ConflictResolver;
-import org.eclipse.aether.util.graph.transformer.JavaDependencyContextRefiner;
-import org.eclipse.aether.util.graph.transformer.JavaScopeDeriver;
-import org.eclipse.aether.util.graph.transformer.JavaScopeSelector;
 import org.eclipse.aether.util.graph.transformer.NearestVersionSelector;
 import org.eclipse.aether.util.graph.transformer.SimpleOptionalitySelector;
 import org.eclipse.aether.util.graph.traverser.FatArtifactTraverser;
@@ -45,57 +49,45 @@ import 
org.eclipse.aether.util.repository.SimpleArtifactDescriptorPolicy;
 import static java.util.Objects.requireNonNull;
 
 /**
- * A utility class to assist in setting up a Maven-like repository system. 
<em>Note:</em> This component is meant to
- * assist those clients that employ the repository system outside of an IoC 
container, Maven plugins should instead
- * always use regular dependency injection to acquire the repository system.
+ * A simple {@link Supplier} of {@link SessionBuilder} instances, that on each 
call supplies newly
+ * constructed instance. To create session out of builder, use {@link 
SessionBuilder#build()}. For proper closing
+ * of sessions, use {@link CloseableSession#close()} method on built 
instance(s).
+ * <p>
+ * Extend this class and override methods to customize, if needed.
  *
+ * @since 4.0.0
  */
-public final class MavenRepositorySystemUtils {
+public class MavenSessionBuilderSupplier implements Supplier<SessionBuilder> {
+    protected final RepositorySystem repositorySystem;
 
-    private MavenRepositorySystemUtils() {
-        // hide constructor
+    public MavenSessionBuilderSupplier(RepositorySystem repositorySystem) {
+        this.repositorySystem = requireNonNull(repositorySystem);
     }
 
-    /**
-     * This method is deprecated, nobody should use it.
-     *
-     * @deprecated This method is here only for legacy uses (like UTs), 
nothing else should use it.
-     */
-    @Deprecated
-    public static DefaultRepositorySystemSession newSession() {
-        DefaultRepositorySystemSession session = new 
DefaultRepositorySystemSession(h -> false); // no close handle
-
-        DependencyTraverser depTraverser = new FatArtifactTraverser();
-        session.setDependencyTraverser(depTraverser);
+    protected DependencyTraverser getDependencyTraverser() {
+        return new FatArtifactTraverser();
+    }
 
-        DependencyManager depManager = new ClassicDependencyManager();
-        session.setDependencyManager(depManager);
+    protected DependencyManager getDependencyManager() {
+        return new ClassicDependencyManager(true); // same default as in Maven4
+    }
 
-        DependencySelector depFilter = new AndDependencySelector(
+    protected DependencySelector getDependencySelector() {
+        return new AndDependencySelector(
                 new ScopeDependencySelector("test", "provided"),
                 new OptionalDependencySelector(),
                 new ExclusionDependencySelector());
-        session.setDependencySelector(depFilter);
-
-        DependencyGraphTransformer transformer = new ConflictResolver(
-                new NearestVersionSelector(), new JavaScopeSelector(),
-                new SimpleOptionalitySelector(), new JavaScopeDeriver());
-        transformer = new ChainedDependencyGraphTransformer(transformer, new 
JavaDependencyContextRefiner());
-        session.setDependencyGraphTransformer(transformer);
-
-        session.setArtifactTypeRegistry(newArtifactTypeRegistry());
-
-        session.setArtifactDescriptorPolicy(new 
SimpleArtifactDescriptorPolicy(true, true));
+    }
 
-        return session;
+    protected DependencyGraphTransformer getDependencyGraphTransformer() {
+        return new ChainedDependencyGraphTransformer(
+                new ConflictResolver(
+                        new NearestVersionSelector(), new MavenScopeSelector(),
+                        new SimpleOptionalitySelector(), new 
MavenScopeDeriver()),
+                new MavenDependencyContextRefiner());
     }
 
-    /**
-     * Creates new Maven-like {@link ArtifactTypeRegistry}. This method should 
not be used from Maven.
-     *
-     * @since 4.0.0
-     */
-    public static ArtifactTypeRegistry newArtifactTypeRegistry() {
+    protected ArtifactTypeRegistry getArtifactTypeRegistry() {
         DefaultArtifactTypeRegistry stereotypes = new 
DefaultArtifactTypeRegistry();
         stereotypes.add(new DefaultArtifactType("pom"));
         stereotypes.add(new DefaultArtifactType("maven-plugin", "jar", "", 
"java"));
@@ -112,40 +104,33 @@ public final class MavenRepositorySystemUtils {
         return stereotypes;
     }
 
+    protected ArtifactDescriptorPolicy getArtifactDescriptorPolicy() {
+        return new SimpleArtifactDescriptorPolicy(true, true);
+    }
+
+    protected void configureSessionBuilder(SessionBuilder session) {
+        session.setDependencyTraverser(getDependencyTraverser());
+        session.setDependencyManager(getDependencyManager());
+        session.setDependencySelector(getDependencySelector());
+        session.setDependencyGraphTransformer(getDependencyGraphTransformer());
+        session.setArtifactTypeRegistry(getArtifactTypeRegistry());
+        session.setArtifactDescriptorPolicy(getArtifactDescriptorPolicy());
+    }
+
     /**
      * Creates a new Maven-like repository system session by initializing the 
session with values typical for
      * Maven-based resolution. In more detail, this method configures settings 
relevant for the processing of dependency
      * graphs, most other settings remain at their generic default value. Use 
the various setters to further configure
-     * the session with authentication, mirror, proxy and other information 
required for your environment.
+     * the session with authentication, mirror, proxy and other information 
required for your environment. At least,
+     * local repository manager needs to be configured to make session be able 
to create session instance.
      *
-     * @return The new repository system session, never {@code null}.
-     * @since 4.0.0
+     * @return SessionBuilder configured with minimally required things for 
"Maven-based resolution". At least LRM must
+     * be set on builder to make it able to create session instances.
      */
-    public static SessionBuilder newSession(SessionBuilder session, 
ArtifactTypeRegistry artifactTypeRegistry) {
-        requireNonNull(session, "null sessionBuilder");
-        requireNonNull(artifactTypeRegistry, "null artifactTypeRegistry");
-
-        DependencyTraverser depTraverser = new FatArtifactTraverser();
-        session.setDependencyTraverser(depTraverser);
-
-        DependencyManager depManager = new ClassicDependencyManager();
-        session.setDependencyManager(depManager);
-
-        DependencySelector depFilter = new AndDependencySelector(
-                new ScopeDependencySelector("test", "provided"),
-                new OptionalDependencySelector(),
-                new ExclusionDependencySelector());
-        session.setDependencySelector(depFilter);
-
-        DependencyGraphTransformer transformer = new ConflictResolver(
-                new NearestVersionSelector(), new JavaScopeSelector(),
-                new SimpleOptionalitySelector(), new JavaScopeDeriver());
-        transformer = new ChainedDependencyGraphTransformer(transformer, new 
JavaDependencyContextRefiner());
-        session.setDependencyGraphTransformer(transformer);
-        session.setArtifactTypeRegistry(artifactTypeRegistry);
-
-        session.setArtifactDescriptorPolicy(new 
SimpleArtifactDescriptorPolicy(true, true));
-
-        return session;
+    @Override
+    public SessionBuilder get() {
+        SessionBuilder builder = repositorySystem.createSessionBuilder();
+        configureSessionBuilder(builder);
+        return builder;
     }
 }
diff --git 
a/maven-resolver-provider/src/main/java/org/apache/maven/repository/internal/scopes/MavenDependencyContextRefiner.java
 
b/maven-resolver-provider/src/main/java/org/apache/maven/repository/internal/scopes/MavenDependencyContextRefiner.java
new file mode 100644
index 0000000000..533367cc08
--- /dev/null
+++ 
b/maven-resolver-provider/src/main/java/org/apache/maven/repository/internal/scopes/MavenDependencyContextRefiner.java
@@ -0,0 +1,81 @@
+/*
+ * 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.repository.internal.scopes;
+
+import org.eclipse.aether.RepositoryException;
+import org.eclipse.aether.collection.DependencyGraphTransformationContext;
+import org.eclipse.aether.collection.DependencyGraphTransformer;
+import org.eclipse.aether.graph.Dependency;
+import org.eclipse.aether.graph.DependencyNode;
+
+import static java.util.Objects.requireNonNull;
+
+/**
+ * A dependency graph transformer that refines the request context for nodes 
that belong to the "project" context by
+ * appending the buildpath type to which the node belongs. For instance, a 
compile-time project dependency will be
+ * assigned the request context "project/compile".
+ *
+ * @see DependencyNode#getRequestContext()
+ *
+ * @since 4.0.0
+ */
+public final class MavenDependencyContextRefiner implements 
DependencyGraphTransformer {
+
+    public DependencyNode transformGraph(DependencyNode node, 
DependencyGraphTransformationContext context)
+            throws RepositoryException {
+        requireNonNull(node, "node cannot be null");
+        requireNonNull(context, "context cannot be null");
+        String ctx = node.getRequestContext();
+
+        if ("project".equals(ctx)) {
+            String scope = getBuildpathScope(node);
+            if (scope != null) {
+                ctx += '/' + scope;
+                node.setRequestContext(ctx);
+            }
+        }
+
+        for (DependencyNode child : node.getChildren()) {
+            transformGraph(child, context);
+        }
+
+        return node;
+    }
+
+    private String getBuildpathScope(DependencyNode node) {
+        Dependency dependency = node.getDependency();
+        if (dependency == null) {
+            return null;
+        }
+
+        String scope = dependency.getScope();
+
+        if (MavenDependencyScopes.COMPILE.equals(scope)
+                || MavenDependencyScopes.SYSTEM.equals(scope)
+                || MavenDependencyScopes.PROVIDED.equals(scope)) {
+            return MavenDependencyScopes.COMPILE;
+        } else if (MavenDependencyScopes.RUNTIME.equals(scope)) {
+            return MavenDependencyScopes.RUNTIME;
+        } else if (MavenDependencyScopes.TEST.equals(scope)) {
+            return MavenDependencyScopes.TEST;
+        }
+
+        return null;
+    }
+}
diff --git 
a/maven-resolver-provider/src/main/java/org/apache/maven/repository/internal/scopes/MavenDependencyScopes.java
 
b/maven-resolver-provider/src/main/java/org/apache/maven/repository/internal/scopes/MavenDependencyScopes.java
new file mode 100644
index 0000000000..86b03eae1d
--- /dev/null
+++ 
b/maven-resolver-provider/src/main/java/org/apache/maven/repository/internal/scopes/MavenDependencyScopes.java
@@ -0,0 +1,53 @@
+/*
+ * 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.repository.internal.scopes;
+
+/**
+ * The dependency scopes used for Java dependencies in Maven. This class 
defines labels only, that are doing pass-thru
+ * over Resolver.
+ *
+ * @since 4.0.0
+ */
+public final class MavenDependencyScopes {
+
+    /**
+     * Important: keep this label in sync with Resolver.
+     *
+     * TODO: once Resolver 2.0.0-alpha-7 is out, use 
org.eclipse.aether.util.artifact.DependencyScopes#SYSTEM
+     */
+    public static final String SYSTEM = "system";
+
+    public static final String COMPILE_ONLY = "compile-only";
+
+    public static final String COMPILE = "compile";
+
+    public static final String PROVIDED = "provided";
+
+    public static final String RUNTIME = "runtime";
+
+    public static final String TEST_ONLY = "test-only";
+
+    public static final String TEST = "test";
+
+    public static final String TEST_RUNTIME = "test-runtime";
+
+    private MavenDependencyScopes() {
+        // hide constructor
+    }
+}
diff --git 
a/maven-resolver-provider/src/main/java/org/apache/maven/repository/internal/scopes/MavenScopeDeriver.java
 
b/maven-resolver-provider/src/main/java/org/apache/maven/repository/internal/scopes/MavenScopeDeriver.java
new file mode 100644
index 0000000000..1664dede1d
--- /dev/null
+++ 
b/maven-resolver-provider/src/main/java/org/apache/maven/repository/internal/scopes/MavenScopeDeriver.java
@@ -0,0 +1,62 @@
+/*
+ * 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.repository.internal.scopes;
+
+import org.eclipse.aether.RepositoryException;
+import org.eclipse.aether.util.graph.transformer.ConflictResolver;
+import org.eclipse.aether.util.graph.transformer.ConflictResolver.ScopeContext;
+import org.eclipse.aether.util.graph.transformer.ConflictResolver.ScopeDeriver;
+
+/**
+ * A scope deriver for use with {@link ConflictResolver} that supports the 
scopes from {@link MavenDependencyScopes}.
+ *
+ * @since 4.0.0
+ */
+public final class MavenScopeDeriver extends ScopeDeriver {
+
+    /**
+     * Creates a new instance of this scope deriver.
+     */
+    public MavenScopeDeriver() {}
+
+    @Override
+    public void deriveScope(ScopeContext context) throws RepositoryException {
+        context.setDerivedScope(getDerivedScope(context.getParentScope(), 
context.getChildScope()));
+    }
+
+    private String getDerivedScope(String parentScope, String childScope) {
+        String derivedScope;
+
+        if (MavenDependencyScopes.SYSTEM.equals(childScope) || 
MavenDependencyScopes.TEST.equals(childScope)) {
+            derivedScope = childScope;
+        } else if (parentScope == null || parentScope.isEmpty() || 
MavenDependencyScopes.COMPILE.equals(parentScope)) {
+            derivedScope = childScope;
+        } else if (MavenDependencyScopes.TEST.equals(parentScope)
+                || MavenDependencyScopes.RUNTIME.equals(parentScope)) {
+            derivedScope = parentScope;
+        } else if (MavenDependencyScopes.SYSTEM.equals(parentScope)
+                || MavenDependencyScopes.PROVIDED.equals(parentScope)) {
+            derivedScope = MavenDependencyScopes.PROVIDED;
+        } else {
+            derivedScope = MavenDependencyScopes.RUNTIME;
+        }
+
+        return derivedScope;
+    }
+}
diff --git 
a/maven-resolver-provider/src/main/java/org/apache/maven/repository/internal/scopes/MavenScopeSelector.java
 
b/maven-resolver-provider/src/main/java/org/apache/maven/repository/internal/scopes/MavenScopeSelector.java
new file mode 100644
index 0000000000..899dae5878
--- /dev/null
+++ 
b/maven-resolver-provider/src/main/java/org/apache/maven/repository/internal/scopes/MavenScopeSelector.java
@@ -0,0 +1,86 @@
+/*
+ * 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.repository.internal.scopes;
+
+import java.util.Collection;
+import java.util.HashSet;
+import java.util.Set;
+
+import org.eclipse.aether.RepositoryException;
+import org.eclipse.aether.util.graph.transformer.ConflictResolver;
+import 
org.eclipse.aether.util.graph.transformer.ConflictResolver.ConflictContext;
+import org.eclipse.aether.util.graph.transformer.ConflictResolver.ConflictItem;
+import 
org.eclipse.aether.util.graph.transformer.ConflictResolver.ScopeSelector;
+
+/**
+ * A scope selector for use with {@link ConflictResolver} that supports the 
scopes from {@link MavenDependencyScopes}.
+ * In general, this selector picks the widest scope present among conflicting 
dependencies where e.g. "compile" is
+ * wider than "runtime" which is wider than "test". If however a direct 
dependency is involved, its scope is selected.
+ *
+ * @since 4.0.0
+ */
+public final class MavenScopeSelector extends ScopeSelector {
+
+    /**
+     * Creates a new instance of this scope selector.
+     */
+    public MavenScopeSelector() {}
+
+    @Override
+    public void selectScope(ConflictContext context) throws 
RepositoryException {
+        String scope = context.getWinner().getDependency().getScope();
+        if (!MavenDependencyScopes.SYSTEM.equals(scope)) {
+            scope = chooseEffectiveScope(context.getItems());
+        }
+        context.setScope(scope);
+    }
+
+    private String chooseEffectiveScope(Collection<ConflictItem> items) {
+        Set<String> scopes = new HashSet<>();
+        for (ConflictItem item : items) {
+            if (item.getDepth() <= 1) {
+                return item.getDependency().getScope();
+            }
+            scopes.addAll(item.getScopes());
+        }
+        return chooseEffectiveScope(scopes);
+    }
+
+    private String chooseEffectiveScope(Set<String> scopes) {
+        if (scopes.size() > 1) {
+            scopes.remove(MavenDependencyScopes.SYSTEM);
+        }
+
+        String effectiveScope = "";
+
+        if (scopes.size() == 1) {
+            effectiveScope = scopes.iterator().next();
+        } else if (scopes.contains(MavenDependencyScopes.COMPILE)) {
+            effectiveScope = MavenDependencyScopes.COMPILE;
+        } else if (scopes.contains(MavenDependencyScopes.RUNTIME)) {
+            effectiveScope = MavenDependencyScopes.RUNTIME;
+        } else if (scopes.contains(MavenDependencyScopes.PROVIDED)) {
+            effectiveScope = MavenDependencyScopes.PROVIDED;
+        } else if (scopes.contains(MavenDependencyScopes.TEST)) {
+            effectiveScope = MavenDependencyScopes.TEST;
+        }
+
+        return effectiveScope;
+    }
+}
diff --git 
a/maven-resolver-provider/src/test/java/org/apache/maven/repository/internal/AbstractRepositoryTestCase.java
 
b/maven-resolver-provider/src/test/java/org/apache/maven/repository/internal/AbstractRepositoryTestCase.java
index c0ea5b5107..141e9c5257 100644
--- 
a/maven-resolver-provider/src/test/java/org/apache/maven/repository/internal/AbstractRepositoryTestCase.java
+++ 
b/maven-resolver-provider/src/test/java/org/apache/maven/repository/internal/AbstractRepositoryTestCase.java
@@ -20,6 +20,7 @@ package org.apache.maven.repository.internal;
 
 import javax.inject.Inject;
 
+import java.io.File;
 import java.net.MalformedURLException;
 
 import org.apache.maven.repository.internal.util.ConsoleRepositoryListener;
@@ -55,10 +56,8 @@ public abstract class AbstractRepositoryTestCase {
     }
 
     public static RepositorySystemSession 
newMavenRepositorySystemSession(RepositorySystem system) {
-        SessionBuilder session = MavenRepositorySystemUtils.newSession(
-                system.createSessionBuilder(), 
MavenRepositorySystemUtils.newArtifactTypeRegistry());
-
-        session.withLocalRepositories(new 
LocalRepository("target/local-repo"));
+        SessionBuilder session = new MavenSessionBuilderSupplier(system).get();
+        session.withLocalRepositories(new LocalRepository(new 
File("target/local-repo"), "simple"));
         session.setTransferListener(new ConsoleTransferListener());
         session.setRepositoryListener(new ConsoleRepositoryListener());
 

Reply via email to