diff --git a/maven-resolver-impl/src/main/java/org/eclipse/aether/internal/impl/EnhancedLocalRepositoryManager.java b/maven-resolver-impl/src/main/java/org/eclipse/aether/internal/impl/EnhancedLocalRepositoryManager.java index e98294b74..1550c875c 100644 --- a/maven-resolver-impl/src/main/java/org/eclipse/aether/internal/impl/EnhancedLocalRepositoryManager.java +++ b/maven-resolver-impl/src/main/java/org/eclipse/aether/internal/impl/EnhancedLocalRepositoryManager.java @@ -149,6 +149,8 @@ public synchronized void clear() { this.trackingFilename = requireNonNull(trackingFilename); this.trackingFileManager = requireNonNull(trackingFileManager); this.localPathPrefixComposer = requireNonNull(localPathPrefixComposer); + // a fresh local repository does not exist yet; toRealPath() requires it to + Files.createDirectories(getRepository().getBasePath()); this.realBasePath = getRepository().getBasePath().toRealPath(); } diff --git a/maven-resolver-impl/src/test/java/org/eclipse/aether/internal/impl/EnhancedLocalRepositoryManagerFactoryTest.java b/maven-resolver-impl/src/test/java/org/eclipse/aether/internal/impl/EnhancedLocalRepositoryManagerFactoryTest.java index ed57b223d..a188f8612 100644 --- a/maven-resolver-impl/src/test/java/org/eclipse/aether/internal/impl/EnhancedLocalRepositoryManagerFactoryTest.java +++ b/maven-resolver-impl/src/test/java/org/eclipse/aether/internal/impl/EnhancedLocalRepositoryManagerFactoryTest.java @@ -18,8 +18,11 @@ */ package org.eclipse.aether.internal.impl; +import java.nio.file.Files; import java.nio.file.Path; import java.util.Collections; +import java.util.HashMap; +import java.util.Map; import org.eclipse.aether.ConfigurationProperties; import org.eclipse.aether.DefaultRepositorySystemSession; @@ -34,6 +37,7 @@ import org.eclipse.aether.repository.LocalRepository; import org.eclipse.aether.repository.LocalRepositoryManager; import org.eclipse.aether.repository.RemoteRepository; +import org.eclipse.aether.spi.localrepo.LocalRepositoryManagerFactory; import org.eclipse.aether.util.StringDigestUtil; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; @@ -145,4 +149,30 @@ void trackingSpecificConfigurationOverridesSystemWideFunction() throws Exception new LocalArtifactRequest(artifact, Collections.singletonList(impostor), context); assertFalse(manager.find(session, fromImpostor).isAvailable()); } + + @Test + void newInstanceForNotYetExistingBasedir() throws Exception { + // a fresh local repository (first build on a machine, or a new -Dmaven.repo.local) does not exist yet + Path missing = basedir.resolve("not-yet-created"); + assertFalse(Files.exists(missing)); + + LocalRepositoryManager manager = factory.newInstance(session, new LocalRepository(missing)); + + assertInstanceOf(EnhancedLocalRepositoryManager.class, manager); + } + + @Test + void providerSelectsEnhancedManagerForNotYetExistingBasedir() throws Exception { + // the provider treats NoLocalRepositoryManagerException as "try the next factory", so a failing + // enhanced factory would silently degrade the whole session to the untracked simple manager + Path missing = basedir.resolve("not-yet-created"); + Map factories = new HashMap<>(); + factories.put(EnhancedLocalRepositoryManagerFactory.NAME, factory); + factories.put(SimpleLocalRepositoryManagerFactory.NAME, new SimpleLocalRepositoryManagerFactory()); + DefaultLocalRepositoryProvider provider = new DefaultLocalRepositoryProvider(factories); + + LocalRepositoryManager manager = provider.newLocalRepositoryManager(session, new LocalRepository(missing)); + + assertInstanceOf(EnhancedLocalRepositoryManager.class, manager); + } }