From 03f982598db6871ebc6858b75796bec3827b4765 Mon Sep 17 00:00:00 2001 From: elharo Date: Thu, 30 Jul 2026 13:38:47 +0000 Subject: [PATCH] Fix #12604: DefaultSettingsBuilder dead Windows drive-relative path handling Remove the always-false condition !file.isAbsolute() && file.toString().startsWith(File.separator) which is dead code on all platforms - paths starting with the file separator are already absolute. Replace with !file.isAbsolute() (skipping paths containing ${} placeholders that need later interpolation). This correctly resolves all relative local repository paths to absolute, not just the never-reached Windows-specific case. --- .../apache/maven/impl/DefaultSettingsBuilder.java | 7 ++++--- .../impl/DefaultSettingsBuilderFactoryTest.java | 12 ++++++++++++ .../settings/settings-relative-local-repo.xml | 5 +++++ 3 files changed, 21 insertions(+), 3 deletions(-) create mode 100644 impl/maven-impl/src/test/resources/settings/settings-relative-local-repo.xml diff --git a/impl/maven-impl/src/main/java/org/apache/maven/impl/DefaultSettingsBuilder.java b/impl/maven-impl/src/main/java/org/apache/maven/impl/DefaultSettingsBuilder.java index b5014498bf24..498e739db1b6 100644 --- a/impl/maven-impl/src/main/java/org/apache/maven/impl/DefaultSettingsBuilder.java +++ b/impl/maven-impl/src/main/java/org/apache/maven/impl/DefaultSettingsBuilder.java @@ -21,7 +21,6 @@ import javax.xml.stream.Location; import javax.xml.stream.XMLStreamException; -import java.io.File; import java.io.IOException; import java.io.InputStream; import java.nio.file.Path; @@ -128,11 +127,13 @@ public SettingsBuilderResult build(SettingsBuilderRequest request) throws Settin .build(); } - // for the special case of a drive-relative Windows path, make sure it's absolute to save plugins from trouble + // resolve relative local repository paths to absolute to save plugins from trouble. + // paths containing property placeholders like ${user.home} must be left as-is + // so that later interpolation can resolve them. String localRepository = effective.getLocalRepository(); if (localRepository != null && !localRepository.isEmpty()) { Path file = Paths.get(localRepository); - if (!file.isAbsolute() && file.toString().startsWith(File.separator)) { + if (!file.isAbsolute() && !localRepository.contains("${")) { effective = effective.withLocalRepository(file.toAbsolutePath().toString()); } } diff --git a/impl/maven-impl/src/test/java/org/apache/maven/impl/DefaultSettingsBuilderFactoryTest.java b/impl/maven-impl/src/test/java/org/apache/maven/impl/DefaultSettingsBuilderFactoryTest.java index f76b9067be6c..f4a9fef36553 100644 --- a/impl/maven-impl/src/test/java/org/apache/maven/impl/DefaultSettingsBuilderFactoryTest.java +++ b/impl/maven-impl/src/test/java/org/apache/maven/impl/DefaultSettingsBuilderFactoryTest.java @@ -42,6 +42,7 @@ import org.mockito.junit.jupiter.MockitoExtension; import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertFalse; import static org.junit.jupiter.api.Assertions.assertNotNull; import static org.junit.jupiter.api.Assertions.assertTrue; @@ -160,6 +161,17 @@ void testSettingsWithDuplicateServersIds() throws Exception { problems.problems().findFirst().orElseThrow().getMessage()); } + @Test + void testRelativeLocalRepositoryIsResolvedToAbsolute() { + Settings settings = execute("settings-relative-local-repo").getEffectiveSettings(); + + String localRepository = settings.getLocalRepository(); + assertNotNull(localRepository); + assertFalse(localRepository.isEmpty()); + Path repoPath = Paths.get(localRepository); + assertTrue(repoPath.isAbsolute(), "Relative local repository should be resolved to absolute"); + } + private Path getSettings(String name) { return Paths.get("src/test/resources/settings/" + name + ".xml").toAbsolutePath(); } diff --git a/impl/maven-impl/src/test/resources/settings/settings-relative-local-repo.xml b/impl/maven-impl/src/test/resources/settings/settings-relative-local-repo.xml new file mode 100644 index 000000000000..cf888feccf12 --- /dev/null +++ b/impl/maven-impl/src/test/resources/settings/settings-relative-local-repo.xml @@ -0,0 +1,5 @@ + + + + relative/repo +