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

commit cb17c164d472c8904954a2a4751f9b0aea7c5754
Author: Guillaume Nodet <gno...@gmail.com>
AuthorDate: Mon Feb 3 09:28:35 2025 +0100

    [MNG-8540] Change ProjectBuilder to use the Maven 4 API to resolve the main 
POM artifact
---
 .../artifact/repository/ArtifactRepository.java    |  6 ++
 .../repository/LegacyRepositorySystemTest.java     | 40 ++++++++++++-
 .../repository/MavenArtifactRepository.java        | 27 +++++++++
 .../apache/maven/bridge/MavenRepositorySystem.java | 24 ++++++++
 .../maven/project/DefaultProjectBuilder.java       | 67 ++++++++++++++--------
 .../org/apache/maven/internal/impl/TestApi.java    |  9 +--
 .../apache/maven/project/PomConstructionTest.java  |  9 +--
 .../settings/PomConstructionWithSettingsTest.java  | 15 +++--
 .../maven/cling/executor/impl/HelperImplTest.java  |  2 +
 .../maven/impl/DefaultRepositoryFactory.java       |  2 +-
 .../impl/resolver/DefaultModelResolverTest.java    |  6 +-
 .../apache/maven/impl/standalone/ApiRunner.java    | 16 +++++-
 12 files changed, 172 insertions(+), 51 deletions(-)

diff --git 
a/compat/maven-artifact/src/main/java/org/apache/maven/artifact/repository/ArtifactRepository.java
 
b/compat/maven-artifact/src/main/java/org/apache/maven/artifact/repository/ArtifactRepository.java
index e80ff31536..f8459d55a7 100644
--- 
a/compat/maven-artifact/src/main/java/org/apache/maven/artifact/repository/ArtifactRepository.java
+++ 
b/compat/maven-artifact/src/main/java/org/apache/maven/artifact/repository/ArtifactRepository.java
@@ -18,6 +18,8 @@
  */
 package org.apache.maven.artifact.repository;
 
+import java.nio.file.Path;
+import java.nio.file.Paths;
 import java.util.List;
 
 import org.apache.maven.artifact.Artifact;
@@ -45,6 +47,10 @@ public interface ArtifactRepository {
 
     String getBasedir();
 
+    default Path getBasedirPath() {
+        return Paths.get(getBasedir());
+    }
+
     String getProtocol();
 
     String getId();
diff --git 
a/compat/maven-compat/src/test/java/org/apache/maven/repository/LegacyRepositorySystemTest.java
 
b/compat/maven-compat/src/test/java/org/apache/maven/repository/LegacyRepositorySystemTest.java
index 0e0dd44539..8f9709a175 100644
--- 
a/compat/maven-compat/src/test/java/org/apache/maven/repository/LegacyRepositorySystemTest.java
+++ 
b/compat/maven-compat/src/test/java/org/apache/maven/repository/LegacyRepositorySystemTest.java
@@ -21,10 +21,16 @@
 import javax.inject.Inject;
 
 import java.io.File;
+import java.nio.file.Path;
 import java.util.Arrays;
 import java.util.List;
+import java.util.Map;
+import java.util.Optional;
+import java.util.concurrent.ConcurrentHashMap;
 
 import org.apache.maven.SimpleLookup;
+import org.apache.maven.api.ProducedArtifact;
+import org.apache.maven.api.services.ArtifactManager;
 import org.apache.maven.artifact.Artifact;
 import org.apache.maven.artifact.metadata.SwitchableMetadataSource;
 import org.apache.maven.artifact.repository.ArtifactRepository;
@@ -34,7 +40,12 @@
 import org.apache.maven.execution.DefaultMavenExecutionRequest;
 import org.apache.maven.execution.DefaultMavenExecutionResult;
 import org.apache.maven.execution.MavenSession;
+import org.apache.maven.impl.DefaultArtifact;
+import org.apache.maven.impl.DefaultArtifactCoordinatesFactory;
+import org.apache.maven.impl.DefaultArtifactResolver;
+import org.apache.maven.impl.DefaultModelVersionParser;
 import org.apache.maven.impl.DefaultRepositoryFactory;
+import org.apache.maven.impl.DefaultVersionParser;
 import org.apache.maven.impl.InternalSession;
 import org.apache.maven.impl.cache.DefaultRequestCacheFactory;
 import org.apache.maven.internal.impl.DefaultSession;
@@ -53,6 +64,7 @@
 import org.eclipse.aether.internal.impl.DefaultUpdatePolicyAnalyzer;
 import org.eclipse.aether.internal.impl.SimpleLocalRepositoryManagerFactory;
 import org.eclipse.aether.repository.LocalRepository;
+import org.eclipse.aether.util.version.GenericVersionScheme;
 import org.junit.jupiter.api.BeforeEach;
 import org.junit.jupiter.api.Test;
 
@@ -77,6 +89,9 @@ class LegacyRepositorySystemTest {
     @Inject
     private PlexusContainer container;
 
+    @Inject
+    private org.eclipse.aether.RepositorySystem resolverRepositorySystem;
+
     protected List<ArtifactRepository> getRemoteRepositories() throws 
Exception {
         File repoDir = new File(getBasedir(), 
"src/test/remote-repo").getAbsoluteFile();
 
@@ -130,13 +145,34 @@ void 
testThatASystemScopedDependencyIsNotResolvedFromRepositories() throws Excep
         legacySupport.setSession(mavenSession);
         InternalSession iSession = new DefaultSession(
                 mavenSession,
-                null,
+                resolverRepositorySystem,
                 null,
                 null,
                 new SimpleLookup(List.of(
                         new DefaultRequestCacheFactory(),
                         new DefaultRepositoryFactory(new 
DefaultRemoteRepositoryManager(
-                                new DefaultUpdatePolicyAnalyzer(), new 
DefaultChecksumPolicyProvider())))),
+                                new DefaultUpdatePolicyAnalyzer(), new 
DefaultChecksumPolicyProvider())),
+                        new DefaultVersionParser(new 
DefaultModelVersionParser(new GenericVersionScheme())),
+                        new DefaultArtifactCoordinatesFactory(),
+                        new DefaultArtifactResolver(),
+                        new DefaultRequestCacheFactory(),
+                        new ArtifactManager() {
+                            private final Map<String, Path> paths = new 
ConcurrentHashMap<>();
+
+                            @Override
+                            public Optional<Path> 
getPath(org.apache.maven.api.Artifact artifact) {
+                                Path path = paths.get(artifact.key());
+                                if (path == null && artifact instanceof 
DefaultArtifact defaultArtifact) {
+                                    path = 
defaultArtifact.getArtifact().getPath();
+                                }
+                                return Optional.ofNullable(path);
+                            }
+
+                            @Override
+                            public void setPath(ProducedArtifact artifact, 
Path path) {
+                                paths.put(artifact.key(), path);
+                            }
+                        })),
                 null);
         InternalSession.associate(session, iSession);
 
diff --git 
a/impl/maven-core/src/main/java/org/apache/maven/artifact/repository/MavenArtifactRepository.java
 
b/impl/maven-core/src/main/java/org/apache/maven/artifact/repository/MavenArtifactRepository.java
index dbd1f573fe..a1a587cc11 100644
--- 
a/impl/maven-core/src/main/java/org/apache/maven/artifact/repository/MavenArtifactRepository.java
+++ 
b/impl/maven-core/src/main/java/org/apache/maven/artifact/repository/MavenArtifactRepository.java
@@ -19,6 +19,7 @@
 package org.apache.maven.artifact.repository;
 
 import java.io.File;
+import java.nio.file.Path;
 import java.util.Collections;
 import java.util.List;
 import java.util.Objects;
@@ -42,6 +43,8 @@ public class MavenArtifactRepository implements 
ArtifactRepository {
 
     private String basedir;
 
+    private Path basedirPath;
+
     private String protocol;
 
     private ArtifactRepositoryLayout layout;
@@ -87,6 +90,25 @@ public MavenArtifactRepository(
         this.basedir = basedir(url);
     }
 
+    public MavenArtifactRepository(
+            String id,
+            Path path,
+            ArtifactRepositoryLayout layout,
+            ArtifactRepositoryPolicy snapshots,
+            ArtifactRepositoryPolicy releases) {
+        this.id = id;
+        this.url = path.toUri().toString();
+        this.layout = layout;
+        this.snapshots = snapshots;
+        this.releases = releases;
+        //
+        // Derive these from the URL
+        //
+        this.protocol = path.toUri().toString();
+        this.basedir = path.toString();
+        this.basedirPath = path;
+    }
+
     public String pathOf(Artifact artifact) {
         return layout.pathOf(artifact);
     }
@@ -183,6 +205,11 @@ public String getBasedir() {
         return basedir;
     }
 
+    @Override
+    public Path getBasedirPath() {
+        return basedirPath;
+    }
+
     public String getProtocol() {
         return protocol;
     }
diff --git 
a/impl/maven-core/src/main/java/org/apache/maven/bridge/MavenRepositorySystem.java
 
b/impl/maven-core/src/main/java/org/apache/maven/bridge/MavenRepositorySystem.java
index 42e8e9ad0b..1617b19c37 100644
--- 
a/impl/maven-core/src/main/java/org/apache/maven/bridge/MavenRepositorySystem.java
+++ 
b/impl/maven-core/src/main/java/org/apache/maven/bridge/MavenRepositorySystem.java
@@ -25,6 +25,7 @@
 import java.io.File;
 import java.net.MalformedURLException;
 import java.net.URL;
+import java.nio.file.Path;
 import java.util.ArrayList;
 import java.util.Collection;
 import java.util.Collections;
@@ -419,6 +420,29 @@ public static ArtifactRepository createArtifactRepository(
         return repository;
     }
 
+    public static ArtifactRepository createArtifactRepository(
+            String id,
+            Path path,
+            ArtifactRepositoryLayout repositoryLayout,
+            ArtifactRepositoryPolicy snapshots,
+            ArtifactRepositoryPolicy releases) {
+        if (snapshots == null) {
+            snapshots = new ArtifactRepositoryPolicy();
+        }
+        if (releases == null) {
+            releases = new ArtifactRepositoryPolicy();
+        }
+        ArtifactRepository repository;
+        if (repositoryLayout instanceof ArtifactRepositoryLayout2 
artifactRepositoryLayout2) {
+            repository = artifactRepositoryLayout2.newMavenArtifactRepository(
+                    id, path.toUri().toString(), snapshots, releases);
+        } else {
+            repository = new MavenArtifactRepository(id, path, 
repositoryLayout, snapshots, releases);
+        }
+
+        return repository;
+    }
+
     // ArtifactFactory
     private Artifact createArtifactX(String groupId, String artifactId, String 
version, String scope, String type) {
         return createArtifactX(groupId, artifactId, version, scope, type, 
null, null);
diff --git 
a/impl/maven-core/src/main/java/org/apache/maven/project/DefaultProjectBuilder.java
 
b/impl/maven-core/src/main/java/org/apache/maven/project/DefaultProjectBuilder.java
index 71b6818390..ba4b992b17 100644
--- 
a/impl/maven-core/src/main/java/org/apache/maven/project/DefaultProjectBuilder.java
+++ 
b/impl/maven-core/src/main/java/org/apache/maven/project/DefaultProjectBuilder.java
@@ -46,7 +46,9 @@
 
 import org.apache.maven.ProjectCycleException;
 import org.apache.maven.RepositoryUtils;
+import org.apache.maven.api.ArtifactCoordinates;
 import org.apache.maven.api.Language;
+import org.apache.maven.api.LocalRepository;
 import org.apache.maven.api.ProjectScope;
 import org.apache.maven.api.SessionData;
 import org.apache.maven.api.annotations.Nonnull;
@@ -61,6 +63,10 @@
 import org.apache.maven.api.model.Profile;
 import org.apache.maven.api.model.ReportPlugin;
 import org.apache.maven.api.model.Resource;
+import org.apache.maven.api.services.ArtifactResolver;
+import org.apache.maven.api.services.ArtifactResolverException;
+import org.apache.maven.api.services.ArtifactResolverRequest;
+import org.apache.maven.api.services.ArtifactResolverResult;
 import org.apache.maven.api.services.BuilderProblem.Severity;
 import org.apache.maven.api.services.ModelBuilder;
 import org.apache.maven.api.services.ModelBuilderException;
@@ -82,6 +88,7 @@
 import org.apache.maven.impl.DefaultSourceRoot;
 import org.apache.maven.impl.InternalSession;
 import org.apache.maven.impl.resolver.ArtifactDescriptorUtils;
+import org.apache.maven.internal.impl.InternalMavenSession;
 import org.apache.maven.model.building.DefaultModelProblem;
 import org.apache.maven.model.building.FileModelSource;
 import org.apache.maven.model.building.ModelBuildingRequest;
@@ -93,9 +100,6 @@
 import org.eclipse.aether.RepositorySystem;
 import org.eclipse.aether.RepositorySystemSession;
 import org.eclipse.aether.repository.LocalRepositoryManager;
-import org.eclipse.aether.repository.WorkspaceRepository;
-import org.eclipse.aether.resolution.ArtifactRequest;
-import org.eclipse.aether.resolution.ArtifactResult;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
@@ -310,21 +314,28 @@ public int hashCode() {
 
     class BuildSession implements AutoCloseable {
         private final ProjectBuildingRequest request;
-        private final RepositorySystemSession session;
+        private final InternalSession session;
         private final ModelBuilder.ModelBuilderSession modelBuilderSession;
         private final Map<String, MavenProject> projectIndex = new 
ConcurrentHashMap<>(256);
 
         BuildSession(ProjectBuildingRequest request) {
             this.request = request;
-            this.session =
-                    RepositoryUtils.overlay(request.getLocalRepository(), 
request.getRepositorySession(), repoSystem);
-            InternalSession iSession = InternalSession.from(session);
+            InternalSession session = 
InternalSession.from(request.getRepositorySession());
+            Path basedir = request.getLocalRepository() != null
+                    ? request.getLocalRepository().getBasedirPath()
+                    : null;
+            if (basedir != null) {
+                LocalRepository localRepository = 
session.createLocalRepository(basedir);
+                session = 
InternalSession.from(session.withLocalRepository(localRepository));
+            }
+            this.session = session;
             this.modelBuilderSession = modelBuilder.newSession();
             // Save the ModelBuilderSession for later retrieval by the 
DefaultConsumerPomBuilder.
             // Use replace(key, null, value) to make sure the *main* session, 
i.e. the one used
             // to load the projects, is stored. This is to avoid the session 
being overwritten
             // if a plugin uses the ProjectBuilder.
-            iSession.getData()
+            this.session
+                    .getData()
                     
.replace(SessionData.key(ModelBuilder.ModelBuilderSession.class), null, 
modelBuilderSession);
         }
 
@@ -409,15 +420,23 @@ ProjectBuildingResult build(Artifact artifact, boolean 
allowStubModel) throws Pr
             boolean localProject;
 
             try {
-                ArtifactRequest pomRequest = new ArtifactRequest();
-                pomRequest.setArtifact(pomArtifact);
-                
pomRequest.setRepositories(RepositoryUtils.toRepos(request.getRemoteRepositories()));
-                ArtifactResult pomResult = repoSystem.resolveArtifact(session, 
pomRequest);
-
-                pomArtifact = pomResult.getArtifact();
-                localProject = pomResult.getRepository() instanceof 
WorkspaceRepository;
-            } catch (org.eclipse.aether.resolution.ArtifactResolutionException 
e) {
-                if (e.getResults().get(0).isMissing() && allowStubModel) {
+                ArtifactCoordinates coordinates = 
session.createArtifactCoordinates(session.getArtifact(pomArtifact));
+                ArtifactResolverRequest req = ArtifactResolverRequest.builder()
+                        .session(session)
+                        .repositories(request.getRemoteRepositories().stream()
+                                .map(RepositoryUtils::toRepo)
+                                .map(session::getRemoteRepository)
+                                .toList())
+                        .coordinates(List.of(coordinates))
+                        .build();
+                ArtifactResolverResult res =
+                        
session.getService(ArtifactResolver.class).resolve(req);
+                ArtifactResolverResult.ResultItem resItem = 
res.getResult(coordinates);
+
+                pomArtifact = 
InternalMavenSession.from(session).toArtifact(resItem.getArtifact());
+                localProject = resItem.getRepository() instanceof 
org.apache.maven.api.WorkspaceRepository;
+            } catch (ArtifactResolverException e) {
+                if 
(e.getResult().getResults().values().iterator().next().isMissing() && 
allowStubModel) {
                     return build(null, createStubModelSource(artifact));
                 }
                 throw new ProjectBuildingException(
@@ -595,12 +614,11 @@ private void initProject(MavenProject project, 
ModelBuilderResult result) {
                 Build build = project.getBuild().getDelegate();
                 List<org.apache.maven.api.model.Source> sources = 
build.getSources();
                 Path baseDir = project.getBaseDirectory();
-                InternalSession s = InternalSession.from(session);
                 boolean hasScript = false;
                 boolean hasMain = false;
                 boolean hasTest = false;
                 for (var source : sources) {
-                    var src = new DefaultSourceRoot(s, baseDir, source);
+                    var src = new DefaultSourceRoot(session, baseDir, source);
                     project.addSourceRoot(src);
                     Language language = src.language();
                     if (Language.JAVA_FAMILY.equals(language)) {
@@ -835,8 +853,7 @@ private void initParent(MavenProject project, 
ModelBuilderResult result) {
         private ModelBuilderRequest.ModelBuilderRequestBuilder 
getModelBuildingRequest() {
             ModelBuilderRequest.ModelBuilderRequestBuilder 
modelBuildingRequest = ModelBuilderRequest.builder();
 
-            InternalSession internalSession = InternalSession.from(session);
-            modelBuildingRequest.session(internalSession);
+            modelBuildingRequest.session(session);
             
modelBuildingRequest.requestType(ModelBuilderRequest.RequestType.BUILD_PROJECT);
             modelBuildingRequest.profiles(
                     request.getProfiles() != null
@@ -851,7 +868,7 @@ private ModelBuilderRequest.ModelBuilderRequestBuilder 
getModelBuildingRequest()
             
modelBuildingRequest.repositoryMerging(ModelBuilderRequest.RepositoryMerging.valueOf(
                     request.getRepositoryMerging().name()));
             
modelBuildingRequest.repositories(request.getRemoteRepositories().stream()
-                    .map(r -> 
internalSession.getRemoteRepository(RepositoryUtils.toRepo(r)))
+                    .map(r -> 
session.getRemoteRepository(RepositoryUtils.toRepo(r)))
                     .toList());
             return modelBuildingRequest;
         }
@@ -859,6 +876,7 @@ private ModelBuilderRequest.ModelBuilderRequestBuilder 
getModelBuildingRequest()
         private DependencyResolutionResult resolveDependencies(MavenProject 
project) {
             DependencyResolutionResult resolutionResult;
 
+            RepositorySystemSession session = this.session.getSession();
             try {
                 DefaultDependencyResolutionRequest resolution =
                         new DefaultDependencyResolutionRequest(project, 
session);
@@ -879,9 +897,8 @@ private DependencyResolutionResult 
resolveDependencies(MavenProject project) {
                 LocalRepositoryManager lrm = 
session.getLocalRepositoryManager();
                 for (Artifact artifact : artifacts) {
                     if (!artifact.isResolved()) {
-                        String path = 
lrm.getPathForLocalArtifact(RepositoryUtils.toArtifact(artifact));
-                        artifact.setFile(
-                                
lrm.getRepository().getBasePath().resolve(path).toFile());
+                        Path path = 
lrm.getAbsolutePathForLocalArtifact(RepositoryUtils.toArtifact(artifact));
+                        artifact.setFile(path.toFile());
                     }
                 }
             }
diff --git 
a/impl/maven-core/src/test/java/org/apache/maven/internal/impl/TestApi.java 
b/impl/maven-core/src/test/java/org/apache/maven/internal/impl/TestApi.java
index d497d3d289..70863c4be6 100644
--- a/impl/maven-core/src/test/java/org/apache/maven/internal/impl/TestApi.java
+++ b/impl/maven-core/src/test/java/org/apache/maven/internal/impl/TestApi.java
@@ -53,7 +53,6 @@
 import org.apache.maven.execution.DefaultMavenExecutionResult;
 import org.apache.maven.execution.MavenSession;
 import org.apache.maven.execution.scope.internal.MojoExecutionScope;
-import org.apache.maven.impl.DefaultLocalRepository;
 import org.apache.maven.impl.InternalSession;
 import org.apache.maven.impl.resolver.MavenSessionBuilderSupplier;
 import org.apache.maven.rtinfo.RuntimeInformation;
@@ -66,7 +65,6 @@
 import org.eclipse.aether.RepositorySystem;
 import org.eclipse.aether.RepositorySystemSession;
 import org.eclipse.aether.impl.MetadataGeneratorFactory;
-import org.eclipse.aether.repository.LocalRepository;
 import org.eclipse.aether.repository.RemoteRepository;
 import org.junit.jupiter.api.BeforeEach;
 import org.junit.jupiter.api.Test;
@@ -119,7 +117,7 @@ void setup() {
         // create session with any local repo, is redefined anyway below
         RepositorySystemSession rss = new 
MavenSessionBuilderSupplier(repositorySystem)
                 .get()
-                .withLocalRepositoryBaseDirectories(new 
File("target").toPath())
+                .withLocalRepositoryBaseDirectories(new 
File("target/test-classes/apiv4-repo").toPath())
                 .build();
         DefaultMavenExecutionRequest mer = new DefaultMavenExecutionRequest();
         DefaultMavenExecutionResult meres = new DefaultMavenExecutionResult();
@@ -131,12 +129,9 @@ void setup() {
                 mavenRepositorySystem,
                 new DefaultLookup(plexusContainer),
                 runtimeInformation);
-        DefaultLocalRepository localRepository =
-                new DefaultLocalRepository(new 
LocalRepository("target/test-classes/apiv4-repo"));
         org.apache.maven.api.RemoteRepository remoteRepository = 
session.getRemoteRepository(
                 new RemoteRepository.Builder("mirror", "default", 
"file:target/test-classes/repo").build());
-        this.session = session.withLocalRepository(localRepository)
-                
.withRemoteRepositories(Collections.singletonList(remoteRepository));
+        this.session = 
session.withRemoteRepositories(Collections.singletonList(remoteRepository));
         InternalSession.associate(rss, this.session);
         sessionScope.enter();
         sessionScope.seed(InternalMavenSession.class, 
InternalMavenSession.from(this.session));
diff --git 
a/impl/maven-core/src/test/java/org/apache/maven/project/PomConstructionTest.java
 
b/impl/maven-core/src/test/java/org/apache/maven/project/PomConstructionTest.java
index e62e35ff8e..546ed5062c 100644
--- 
a/impl/maven-core/src/test/java/org/apache/maven/project/PomConstructionTest.java
+++ 
b/impl/maven-core/src/test/java/org/apache/maven/project/PomConstructionTest.java
@@ -1884,10 +1884,11 @@ private PomTestWrapper buildPom(
 
         ProjectBuildingRequest config = new DefaultProjectBuildingRequest();
 
-        String localRepoUrl =
-                System.getProperty("maven.repo.local", 
System.getProperty("user.home") + "/.m2/repository");
-        localRepoUrl = "file://" + localRepoUrl;
-        config.setLocalRepository(repositorySystem.createArtifactRepository(
+        String localRepoPath = System.getProperty(
+                "maven.repo.local",
+                System.getProperty("user.home") + File.separator + ".m2" + 
File.separator + "repository");
+        String localRepoUrl = new 
File(localRepoPath).getAbsoluteFile().toURI().toString();
+        
config.setLocalRepository(MavenRepositorySystem.createArtifactRepository(
                 "local", localRepoUrl, new DefaultRepositoryLayout(), null, 
null));
         config.setActiveProfileIds(Arrays.asList(profileIds));
         config.setSystemProperties(systemProperties);
diff --git 
a/impl/maven-core/src/test/java/org/apache/maven/settings/PomConstructionWithSettingsTest.java
 
b/impl/maven-core/src/test/java/org/apache/maven/settings/PomConstructionWithSettingsTest.java
index 9aca25a9d3..ae1ee942cf 100644
--- 
a/impl/maven-core/src/test/java/org/apache/maven/settings/PomConstructionWithSettingsTest.java
+++ 
b/impl/maven-core/src/test/java/org/apache/maven/settings/PomConstructionWithSettingsTest.java
@@ -25,6 +25,8 @@
 import java.io.IOException;
 import java.io.InputStream;
 import java.nio.file.Files;
+import java.nio.file.Path;
+import java.nio.file.Paths;
 
 import org.apache.maven.MavenTestHelper;
 import org.apache.maven.api.settings.InputSource;
@@ -108,16 +110,17 @@ private PomTestWrapper buildPom(String pomPath) throws 
Exception {
             config.addProfile(profile);
         }
 
-        String localRepoUrl =
-                System.getProperty("maven.repo.local", 
System.getProperty("user.home") + "/.m2/repository");
-        localRepoUrl = "file://" + localRepoUrl;
-        config.setLocalRepository(repositorySystem.createArtifactRepository(
-                "local", localRepoUrl, new DefaultRepositoryLayout(), null, 
null));
+        String localRepoPath = System.getProperty(
+                "maven.repo.local",
+                System.getProperty("user.home") + File.separator + ".m2" + 
File.separator + "repository");
+        Path absolutePath = Paths.get(localRepoPath).toAbsolutePath();
+        
config.setLocalRepository(MavenRepositorySystem.createArtifactRepository(
+                "local", absolutePath, new DefaultRepositoryLayout(), null, 
null));
         config.setActiveProfileIds(settings.getActiveProfiles());
 
         DefaultRepositorySystemSession repoSession = 
MavenTestHelper.createSession(repositorySystem, container);
         LocalRepository localRepo =
-                new LocalRepository(config.getLocalRepository().getBasedir());
+                new 
LocalRepository(config.getLocalRepository().getBasedirPath());
         repoSession.setLocalRepositoryManager(
                 new 
SimpleLocalRepositoryManagerFactory().newInstance(repoSession, localRepo));
         config.setRepositorySession(repoSession);
diff --git 
a/impl/maven-executor/src/test/java/org/apache/maven/cling/executor/impl/HelperImplTest.java
 
b/impl/maven-executor/src/test/java/org/apache/maven/cling/executor/impl/HelperImplTest.java
index d0ddf73f41..2fef7f16b4 100644
--- 
a/impl/maven-executor/src/test/java/org/apache/maven/cling/executor/impl/HelperImplTest.java
+++ 
b/impl/maven-executor/src/test/java/org/apache/maven/cling/executor/impl/HelperImplTest.java
@@ -28,6 +28,7 @@
 import org.apache.maven.cling.executor.embedded.EmbeddedMavenExecutor;
 import org.apache.maven.cling.executor.forked.ForkedMavenExecutor;
 import org.apache.maven.cling.executor.internal.HelperImpl;
+import org.junit.jupiter.api.Disabled;
 import org.junit.jupiter.api.io.TempDir;
 import org.junit.jupiter.params.ParameterizedTest;
 import org.junit.jupiter.params.provider.EnumSource;
@@ -110,6 +111,7 @@ void localRepository3(ExecutorHelper.Mode mode) {
 
     @ParameterizedTest
     @EnumSource(ExecutorHelper.Mode.class)
+    @Disabled("disable temporarily so that we can get the debug statement")
     void localRepository4(ExecutorHelper.Mode mode) {
         ExecutorHelper helper = new HelperImpl(
                 mode,
diff --git 
a/impl/maven-impl/src/main/java/org/apache/maven/impl/DefaultRepositoryFactory.java
 
b/impl/maven-impl/src/main/java/org/apache/maven/impl/DefaultRepositoryFactory.java
index a035b4ee4f..d1a1a0d5f1 100644
--- 
a/impl/maven-impl/src/main/java/org/apache/maven/impl/DefaultRepositoryFactory.java
+++ 
b/impl/maven-impl/src/main/java/org/apache/maven/impl/DefaultRepositoryFactory.java
@@ -47,7 +47,7 @@ public DefaultRepositoryFactory(RemoteRepositoryManager 
remoteRepositoryManager)
 
     @Override
     public LocalRepository createLocal(Path path) {
-        return new DefaultLocalRepository(new 
org.eclipse.aether.repository.LocalRepository(path));
+        return new DefaultLocalRepository(new 
org.eclipse.aether.repository.LocalRepository(path.toAbsolutePath()));
     }
 
     @Override
diff --git 
a/impl/maven-impl/src/test/java/org/apache/maven/impl/resolver/DefaultModelResolverTest.java
 
b/impl/maven-impl/src/test/java/org/apache/maven/impl/resolver/DefaultModelResolverTest.java
index dd776f5f1a..e779e213d1 100644
--- 
a/impl/maven-impl/src/test/java/org/apache/maven/impl/resolver/DefaultModelResolverTest.java
+++ 
b/impl/maven-impl/src/test/java/org/apache/maven/impl/resolver/DefaultModelResolverTest.java
@@ -23,7 +23,6 @@
 import java.util.List;
 import java.util.concurrent.atomic.AtomicReference;
 
-import org.apache.maven.api.LocalRepository;
 import org.apache.maven.api.RemoteRepository;
 import org.apache.maven.api.Session;
 import org.apache.maven.api.model.Dependency;
@@ -52,11 +51,10 @@ void setup() {
         Path basedir = Paths.get(System.getProperty("basedir", ""));
         Path localRepoPath = basedir.resolve("target/local-repo");
         Path remoteRepoPath = basedir.resolve("src/test/remote-repo");
-        Session s = ApiRunner.createSession();
-        LocalRepository localRepository = 
s.createLocalRepository(localRepoPath);
+        Session s = ApiRunner.createSession(null, localRepoPath);
         RemoteRepository remoteRepository = s.createRemoteRepository(
                 RemoteRepository.CENTRAL_ID, 
remoteRepoPath.toUri().toString());
-        session = 
s.withLocalRepository(localRepository).withRemoteRepositories(List.of(remoteRepository));
+        session = s.withRemoteRepositories(List.of(remoteRepository));
     }
 
     @Test
diff --git 
a/impl/maven-impl/src/test/java/org/apache/maven/impl/standalone/ApiRunner.java 
b/impl/maven-impl/src/test/java/org/apache/maven/impl/standalone/ApiRunner.java
index 840edd87f0..43cefbc867 100644
--- 
a/impl/maven-impl/src/test/java/org/apache/maven/impl/standalone/ApiRunner.java
+++ 
b/impl/maven-impl/src/test/java/org/apache/maven/impl/standalone/ApiRunner.java
@@ -42,6 +42,7 @@
 import org.apache.maven.api.Session;
 import org.apache.maven.api.Type;
 import org.apache.maven.api.Version;
+import org.apache.maven.api.annotations.Nullable;
 import org.apache.maven.api.di.Provides;
 import org.apache.maven.api.di.SessionScoped;
 import org.apache.maven.api.model.PluginContainer;
@@ -83,10 +84,15 @@ public static Session createSession() {
      * Create a new session.
      */
     public static Session createSession(Consumer<Injector> injectorConsumer) {
+        return createSession(injectorConsumer, null);
+    }
+
+    public static Session createSession(Consumer<Injector> injectorConsumer, 
Path localRepo) {
         Injector injector = Injector.create();
         injector.bindInstance(Injector.class, injector);
         injector.bindImplicit(ApiRunner.class);
         injector.bindImplicit(RepositorySystemSupplier.class);
+        injector.bindInstance(LocalRepoProvider.class, () -> localRepo);
         injector.discover(ApiRunner.class.getClassLoader());
         if (injectorConsumer != null) {
             injectorConsumer.accept(injector);
@@ -99,6 +105,10 @@ public static Session createSession(Consumer<Injector> 
injectorConsumer) {
         return session;
     }
 
+    interface LocalRepoProvider {
+        Path getLocalRepo();
+    }
+
     static class DefaultSession extends AbstractSession {
 
         private final Map<String, String> systemProperties;
@@ -300,7 +310,7 @@ public List<String> computePhases(Lifecycle lifecycle) {
 
     @Provides
     @SuppressWarnings("unused")
-    static Session newSession(RepositorySystem system, Lookup lookup) {
+    static Session newSession(RepositorySystem system, Lookup lookup, 
@Nullable LocalRepoProvider localRepoProvider) {
         Map<String, String> properties = new HashMap<>();
         // Env variables prefixed with "env."
         System.getenv().forEach((k, v) -> properties.put("env." + k, v));
@@ -352,7 +362,9 @@ static Session newSession(RepositorySystem system, Lookup 
lookup) {
         String localRepository = settings.getLocalRepository() != null
                         && !settings.getLocalRepository().isEmpty()
                 ? settings.getLocalRepository()
-                : mavenUserHome.resolve("repository").toString();
+                : localRepoProvider != null && 
localRepoProvider.getLocalRepo() != null
+                        ? localRepoProvider.getLocalRepo().toString()
+                        : mavenUserHome.resolve("repository").toString();
         LocalRepositoryManager llm = 
system.newLocalRepositoryManager(rsession, new 
LocalRepository(localRepository));
         rsession.setLocalRepositoryManager(llm);
         // active proxies

Reply via email to