You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@maven.apache.org by el...@apache.org on 2026/07/30 13:38:54 UTC
(maven) 01/01: Fix #12604: DefaultSettingsBuilder dead Windows drive-relative path handling
This is an automated email from the ASF dual-hosted git repository.
elharo pushed a commit to branch fix-12604-settings-path
in repository https://gitbox.apache.org/repos/asf/maven.git
commit 03f982598db6871ebc6858b75796bec3827b4765
Author: elharo <el...@users.noreply.github.com>
AuthorDate: Thu Jul 30 13:38:47 2026 +0000
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.
---
.../java/org/apache/maven/impl/DefaultSettingsBuilder.java | 7 ++++---
.../apache/maven/impl/DefaultSettingsBuilderFactoryTest.java | 12 ++++++++++++
.../test/resources/settings/settings-relative-local-repo.xml | 5 +++++
3 files changed, 21 insertions(+), 3 deletions(-)
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 b5014498bf..498e739db1 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 f76b9067be..f4a9fef365 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 0000000000..cf888feccf
--- /dev/null
+++ b/impl/maven-impl/src/test/resources/settings/settings-relative-local-repo.xml
@@ -0,0 +1,5 @@
+<?xml version="1.0" encoding="UTF-8"?>
+
+<settings xmlns='http://maven.apache.org/SETTINGS/1.0.0'>
+ <localRepository>relative/repo</localRepository>
+</settings>