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