From b2726cab6ff48aacf1ce2d323e1ae972b73b22f9 Mon Sep 17 00:00:00 2001 From: Laert Llaveshi Date: Mon, 8 Jun 2026 10:10:28 +0200 Subject: [PATCH] #1956: Fix MAVEN_ARGS bug --- CHANGELOG.adoc | 1 + .../AbstractEnvironmentVariables.java | 28 ++++++++++++++----- .../environment/EnvironmentVariablesTest.java | 20 +++++++++++++ 3 files changed, 42 insertions(+), 7 deletions(-) diff --git a/CHANGELOG.adoc b/CHANGELOG.adoc index 53a168492d..ad82d0be25 100644 --- a/CHANGELOG.adoc +++ b/CHANGELOG.adoc @@ -6,6 +6,7 @@ This file documents all notable changes to https://github.com/devonfw/IDEasy[IDE Release with new features and bugfixes: +* https://github.com/devonfw/IDEasy/issues/1956[#1956]: Merging MAVEN_ARGS buggy * https://github.com/devonfw/IDEasy/issues/1846[#1846]: Fixed macOS Gatekeeper workaround * https://github.com/devonfw/IDEasy/issues/1906[#1906]: Fixed `ide uninstall` failing on macOS * https://github.com/devonfw/IDEasy/issues/1985[#1985]: Fix path traversal errors when extracting ZIPs on Windows diff --git a/cli/src/main/java/com/devonfw/tools/ide/environment/AbstractEnvironmentVariables.java b/cli/src/main/java/com/devonfw/tools/ide/environment/AbstractEnvironmentVariables.java index 1becb97202..452cadf83e 100644 --- a/cli/src/main/java/com/devonfw/tools/ide/environment/AbstractEnvironmentVariables.java +++ b/cli/src/main/java/com/devonfw/tools/ide/environment/AbstractEnvironmentVariables.java @@ -370,20 +370,34 @@ private static record ResolveContext(Object rootSrc, String rootValue, boolean l } /** - * Merges user value with default, avoiding duplication if default already contains the user value. + * Appends IDEasy's default to the user value, stripping conflicting user {@code -s } and {@code -Dsettings.security=} arguments so the default wins + * without duplicates. An empty default leaves the user value untouched. * - * @param value the user-defined value - * @param defaultValue IDEasy's default value - * @return the merged value, or the user value if defaultValue is null or empty + * @param value the user-defined value. + * @param defaultValue IDEasy's default value. + * @return the merged value. */ static String mergeWithDefault(String value, String defaultValue) { if (defaultValue == null || defaultValue.isEmpty()) { return value; } - if (defaultValue.contains(value)) { - return defaultValue; + StringBuilder sb = new StringBuilder(); + String[] tokens = value.trim().split("\\s+"); + for (int i = 0; i < tokens.length; i++) { + String token = tokens[i]; + if (token.equals("-s")) { + i++; + } else if (!token.startsWith("-Dsettings.security=")) { + if (!sb.isEmpty()) { + sb.append(' '); + } + sb.append(token); + } + } + if (!sb.isEmpty()) { + sb.append(' '); } - return value + " " + defaultValue; + return sb.append(defaultValue).toString(); } } diff --git a/cli/src/test/java/com/devonfw/tools/ide/environment/EnvironmentVariablesTest.java b/cli/src/test/java/com/devonfw/tools/ide/environment/EnvironmentVariablesTest.java index f0e7d4cc9c..b44c1f64ad 100644 --- a/cli/src/test/java/com/devonfw/tools/ide/environment/EnvironmentVariablesTest.java +++ b/cli/src/test/java/com/devonfw/tools/ide/environment/EnvironmentVariablesTest.java @@ -140,4 +140,24 @@ void testUserDefinedMavenArgsAlreadyInIdeasyDefaultsIsNotDuplicated() { assertThat(AbstractEnvironmentVariables.mergeWithDefault("-s /path/to/settings.xml", defaultValue)).isEqualTo(defaultValue); assertThat(AbstractEnvironmentVariables.mergeWithDefault("-s", defaultValue)).isEqualTo(defaultValue); } + + /** + * Test that conflicting user-defined {@code -s} and {@code -Dsettings.security=} arguments are stripped and overridden by IDEasy's computed values (without + * duplication), while unrelated user arguments are preserved. See https://github.com/devonfw/IDEasy/issues/1956[#1956]. + */ + @Test + void testUserDefinedMavenArgsConflictingWithIdeasyDefaultsAreOverridden() { + + String defaultValue = "-s /ide/settings.xml -Dsettings.security=/ide/settings-security.xml"; + // user overrides both -s and -Dsettings.security= and keeps an unrelated argument + assertThat(AbstractEnvironmentVariables.mergeWithDefault("-Xmx8000m -s invalid/settings.xml -Dsettings.security=wrong", defaultValue)) + .isEqualTo("-Xmx8000m " + defaultValue); + // user overrides only -Dsettings.security= + assertThat(AbstractEnvironmentVariables.mergeWithDefault("-Xmx8000m -Dsettings.security=wrong", defaultValue)) + .isEqualTo("-Xmx8000m " + defaultValue); + // user has no conflicting argument, so all user arguments are kept + assertThat(AbstractEnvironmentVariables.mergeWithDefault("-T 4", defaultValue)).isEqualTo("-T 4 " + defaultValue); + // empty default leaves the user value untouched + assertThat(AbstractEnvironmentVariables.mergeWithDefault("-s invalid/settings.xml", "")).isEqualTo("-s invalid/settings.xml"); + } }