From 2535ee59047cdfe97615ba1bf2accf675f192262 Mon Sep 17 00:00:00 2001 From: AdemZarrouki Date: Fri, 19 Jun 2026 09:48:59 +0200 Subject: [PATCH 01/17] #1909: add documentation for mvnd to Help.properties --- cli/src/main/resources/nls/Help.properties | 2 ++ 1 file changed, 2 insertions(+) diff --git a/cli/src/main/resources/nls/Help.properties b/cli/src/main/resources/nls/Help.properties index c197f8cb0b..a362bbf35d 100644 --- a/cli/src/main/resources/nls/Help.properties +++ b/cli/src/main/resources/nls/Help.properties @@ -91,6 +91,8 @@ cmd.msvc=Tool commandlet for MSVC (Microsoft Visual C++ Build Tools). cmd.msvc.detail=MSVC provides the C++ compiler and build tools required by Rust on Windows. Detailed documentation can be found at https://visualstudio.microsoft.com/visual-cpp-build-tools/ cmd.mvn=Tool commandlet for Maven (Build-Tool). cmd.mvn.detail=Apache Maven is a build automation and dependency management tool for Java projects. Detailed documentation can be found at https://maven.apache.org/guides/index.html +cmd.mvnd=Tool commandlet for Maven Daemon (Performance Wrapper for Maven). +cmd.mvnd.detail=The Maven Daemon (mvnd) is a daemon infrastructure for Maven that helps to reduce the build time. Detailed documentation can be found at https://maven.apache.org/tools/mvnd.html cmd.nest=Tool commandlet for Nest CLI. cmd.nest.detail=The Nest CLI is a command-line interface tool that helps you to initialize, develop, and maintain your Nest applications. Detailed documentation can be found at https://docs.nestjs.com/cli/overview cmd.ng=Tool commandlet for Angular CLI. From 8cf61804694b0832ea93a31752a90049f63152df Mon Sep 17 00:00:00 2001 From: AdemZarrouki Date: Fri, 19 Jun 2026 09:51:48 +0200 Subject: [PATCH 02/17] #1909: add documentation for mvnd to Help_de.properties.properties --- cli/src/main/resources/nls/Help_de.properties | 2 ++ 1 file changed, 2 insertions(+) diff --git a/cli/src/main/resources/nls/Help_de.properties b/cli/src/main/resources/nls/Help_de.properties index ffe1bd8459..e6d6cf6b3e 100644 --- a/cli/src/main/resources/nls/Help_de.properties +++ b/cli/src/main/resources/nls/Help_de.properties @@ -91,6 +91,8 @@ cmd.msvc=Werkzeug Kommando für MSVC (Microsoft Visual C++ Build-Werkzeuge). cmd.msvc.detail=MSVC stellt den C++ Compiler und Build-Werkzeuge bereit, die von Rust unter Windows benötigt werden. Detaillierte Dokumentation ist zu finden unter https://visualstudio.microsoft.com/visual-cpp-build-tools/ cmd.mvn=Werkzeug Kommando für Maven (Build-Werkzeug). cmd.mvn.detail=Apache Maven ist ein Build-Automatisierungs- und Abhängigkeitsverwaltungstool für Java-Projekte. Detaillierte Dokumentation ist zu finden unter https://maven.apache.org/guides/index.html +cmd.mvnd=Werkzeug Kommando für Maven Daemon (Performance-Wrapper für Maven). +cmd.mvnd.detail=Maven Daemon (mvnd) ist ein Performance-Wrapper für Apache Maven, der die Build-Zeit durch die Verwendung eines Daemon-Prozesses erheblich reduziert. Detaillierte Dokumentation ist zu finden unter https://maven.apache.org/tools/mvnd.html cmd.nest=Werkzeug Kommando für Nest CLI. cmd.nest.detail=Die Nest CLI ist ein Command‑Line‑Interface‑Tool zur Initialisierung, Entwicklung und Wartung von Nest‑Anwendungen. Detaillierte Dokumentation ist zu finden unter https://docs.nestjs.com/cli/overview cmd.ng=Werkzeug Kommando für Angular CLI. From e6e5d1742edc2fc868805709c318ae57273cfcca Mon Sep 17 00:00:00 2001 From: AdemZarrouki Date: Fri, 19 Jun 2026 12:06:07 +0200 Subject: [PATCH 03/17] #1909: add Mvnd commandlet --- .../com/devonfw/tools/ide/tool/mvnd/Mvnd.java | 86 +++++++++++++++++++ 1 file changed, 86 insertions(+) create mode 100644 cli/src/main/java/com/devonfw/tools/ide/tool/mvnd/Mvnd.java diff --git a/cli/src/main/java/com/devonfw/tools/ide/tool/mvnd/Mvnd.java b/cli/src/main/java/com/devonfw/tools/ide/tool/mvnd/Mvnd.java new file mode 100644 index 0000000000..7d4cddd1ca --- /dev/null +++ b/cli/src/main/java/com/devonfw/tools/ide/tool/mvnd/Mvnd.java @@ -0,0 +1,86 @@ +package com.devonfw.tools.ide.tool.mvnd; + +import java.util.Set; + +import com.devonfw.tools.ide.common.Tag; +import com.devonfw.tools.ide.completion.AutoCompletionRegistry; +import com.devonfw.tools.ide.context.IdeContext; +import com.devonfw.tools.ide.tool.LocalToolCommandlet; +import com.devonfw.tools.ide.tool.ToolCommandlet; + +/** + * {@link ToolCommandlet} for maven daemon. + */ +public class Mvnd extends LocalToolCommandlet { + + /** + * The constructor. + * + * @param context the {@link IdeContext}. + */ + public Mvnd(IdeContext context) { + super(context, "mvnd", Set.of(Tag.JAVA, Tag.BUILD)); + } + + /** + * Initializes Maven Deamon-specific auto-completion candidates. + * + * @param registry the {@link AutoCompletionRegistry} to initialize. + */ + @Override + protected void initAutoCompletionRegistry(AutoCompletionRegistry registry) { + + // lifecycle phases + registry.add("clean"); + registry.add("validate"); + registry.add("compile"); + registry.add("test"); + registry.add("package"); + registry.add("verify"); + registry.add("install"); + registry.add("deploy"); + +// plugin goals + registry.add("dependency:tree"); + registry.add("dependency:list"); + registry.add("help:effective-settings"); + registry.add("exec:java"); + +// common maven options + registry.add("-DskipTests"); + registry.add("-Dmaven.test.skip=true"); + registry.add("-P"); + registry.add("-pl"); + registry.add("-am"); + registry.add("-amd"); + registry.add("--also-make"); + registry.add("--also-make-dependents"); + registry.add("--fail-at-end"); + registry.add("--fail-fast"); + registry.add("-T1C"); + registry.add("-q"); + registry.add("-X"); + registry.add("-e"); + registry.add("-U"); + registry.add("-o"); + registry.add("-f"); + registry.add("-s"); + registry.add("-rf"); + +// exec plugin properties + registry.add("-Dexec.mainClass="); + registry.add("-Dexec.args="); + registry.add("-DdeployAtEnd=true"); + +// mvnd-specific commands + registry.add("--status"); + registry.add("--stop"); + registry.add("--stop-all"); + registry.add("--reset"); + } + + @Override + public String getToolHelpArguments() { + return "--help"; + } +} From 2a9dda32fee8f5eae3324e336972263de697d04c Mon Sep 17 00:00:00 2001 From: AdemZarrouki Date: Fri, 19 Jun 2026 12:52:51 +0200 Subject: [PATCH 04/17] #1909: correct a typo --- cli/src/main/java/com/devonfw/tools/ide/tool/mvnd/Mvnd.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cli/src/main/java/com/devonfw/tools/ide/tool/mvnd/Mvnd.java b/cli/src/main/java/com/devonfw/tools/ide/tool/mvnd/Mvnd.java index 7d4cddd1ca..2d2edae6db 100644 --- a/cli/src/main/java/com/devonfw/tools/ide/tool/mvnd/Mvnd.java +++ b/cli/src/main/java/com/devonfw/tools/ide/tool/mvnd/Mvnd.java @@ -23,7 +23,7 @@ public Mvnd(IdeContext context) { } /** - * Initializes Maven Deamon-specific auto-completion candidates. + * Initializes Maven Daemon-specific auto-completion candidates. * * @param registry the {@link AutoCompletionRegistry} to initialize. */ From dcafb905daf1ac218e01f05ce9d5db6994507d11 Mon Sep 17 00:00:00 2001 From: AdemZarrouki Date: Fri, 19 Jun 2026 12:53:46 +0200 Subject: [PATCH 05/17] #1909: add Mvnd commandlet to CommandletManagerImpl --- .../tools/ide/commandlet/CommandletManagerImpl.java | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/cli/src/main/java/com/devonfw/tools/ide/commandlet/CommandletManagerImpl.java b/cli/src/main/java/com/devonfw/tools/ide/commandlet/CommandletManagerImpl.java index 19c53c7975..7648df2e88 100644 --- a/cli/src/main/java/com/devonfw/tools/ide/commandlet/CommandletManagerImpl.java +++ b/cli/src/main/java/com/devonfw/tools/ide/commandlet/CommandletManagerImpl.java @@ -8,8 +8,6 @@ import java.util.Map; import java.util.NoSuchElementException; -import com.devonfw.tools.ide.tool.inso.Inso; - import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -37,6 +35,7 @@ import com.devonfw.tools.ide.tool.gradle.Gradle; import com.devonfw.tools.ide.tool.gui.Gui; import com.devonfw.tools.ide.tool.helm.Helm; +import com.devonfw.tools.ide.tool.inso.Inso; import com.devonfw.tools.ide.tool.intellij.Intellij; import com.devonfw.tools.ide.tool.jasypt.Jasypt; import com.devonfw.tools.ide.tool.java.Java; @@ -45,8 +44,9 @@ import com.devonfw.tools.ide.tool.kotlinc.KotlincNative; import com.devonfw.tools.ide.tool.kubectl.KubeCtl; import com.devonfw.tools.ide.tool.lazydocker.LazyDocker; -import com.devonfw.tools.ide.tool.mvn.Mvn; import com.devonfw.tools.ide.tool.msvc.Msvc; +import com.devonfw.tools.ide.tool.mvn.Mvn; +import com.devonfw.tools.ide.tool.mvnd.Mvnd; import com.devonfw.tools.ide.tool.nest.Nest; import com.devonfw.tools.ide.tool.ng.Ng; import com.devonfw.tools.ide.tool.node.Node; @@ -172,6 +172,7 @@ public CommandletManagerImpl(IdeContext context) { add(new Nest(context)); add(new Cdk(context)); add(new Claude(context)); + add(new Mvnd(context)); } /** From 6e6e178f5d9e8dec77fc7c56a6e184e90bed27e8 Mon Sep 17 00:00:00 2001 From: AdemZarrouki Date: Fri, 19 Jun 2026 12:57:36 +0200 Subject: [PATCH 06/17] #1909: remove invalid mvnd command options from Mvnd.java --- cli/src/main/java/com/devonfw/tools/ide/tool/mvnd/Mvnd.java | 2 -- 1 file changed, 2 deletions(-) diff --git a/cli/src/main/java/com/devonfw/tools/ide/tool/mvnd/Mvnd.java b/cli/src/main/java/com/devonfw/tools/ide/tool/mvnd/Mvnd.java index 2d2edae6db..73356da34e 100644 --- a/cli/src/main/java/com/devonfw/tools/ide/tool/mvnd/Mvnd.java +++ b/cli/src/main/java/com/devonfw/tools/ide/tool/mvnd/Mvnd.java @@ -75,8 +75,6 @@ protected void initAutoCompletionRegistry(AutoCompletionRegistry registry) { // mvnd-specific commands registry.add("--status"); registry.add("--stop"); - registry.add("--stop-all"); - registry.add("--reset"); } @Override From 5326702fb74d3df8fdbcb60ae02a6c00d1f234e7 Mon Sep 17 00:00:00 2001 From: AdemZarrouki Date: Fri, 19 Jun 2026 13:01:16 +0200 Subject: [PATCH 07/17] #1909: add purge commands --- .../main/java/com/devonfw/tools/ide/tool/mvnd/Mvnd.java | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/cli/src/main/java/com/devonfw/tools/ide/tool/mvnd/Mvnd.java b/cli/src/main/java/com/devonfw/tools/ide/tool/mvnd/Mvnd.java index 73356da34e..a37a51da3d 100644 --- a/cli/src/main/java/com/devonfw/tools/ide/tool/mvnd/Mvnd.java +++ b/cli/src/main/java/com/devonfw/tools/ide/tool/mvnd/Mvnd.java @@ -40,13 +40,13 @@ protected void initAutoCompletionRegistry(AutoCompletionRegistry registry) { registry.add("install"); registry.add("deploy"); -// plugin goals + // plugin goals registry.add("dependency:tree"); registry.add("dependency:list"); registry.add("help:effective-settings"); registry.add("exec:java"); -// common maven options + // common maven options registry.add("-DskipTests"); registry.add("-Dmaven.test.skip=true"); registry.add("-P"); @@ -67,14 +67,15 @@ protected void initAutoCompletionRegistry(AutoCompletionRegistry registry) { registry.add("-s"); registry.add("-rf"); -// exec plugin properties + // exec plugin properties registry.add("-Dexec.mainClass="); registry.add("-Dexec.args="); registry.add("-DdeployAtEnd=true"); -// mvnd-specific commands + // mvnd-specific commands registry.add("--status"); registry.add("--stop"); + registry.add("--purge"); } @Override From 43db76caf772c3485e0fe53485d695ea74fbc994 Mon Sep 17 00:00:00 2001 From: AdemZarrouki Date: Mon, 22 Jun 2026 09:59:04 +0200 Subject: [PATCH 08/17] #1909: add a MavenCommandlet parent class --- .../tools/ide/tool/mvn/MavenCommandlet.java | 75 +++++++++++++++++++ 1 file changed, 75 insertions(+) create mode 100644 cli/src/main/java/com/devonfw/tools/ide/tool/mvn/MavenCommandlet.java diff --git a/cli/src/main/java/com/devonfw/tools/ide/tool/mvn/MavenCommandlet.java b/cli/src/main/java/com/devonfw/tools/ide/tool/mvn/MavenCommandlet.java new file mode 100644 index 0000000000..b11da4369f --- /dev/null +++ b/cli/src/main/java/com/devonfw/tools/ide/tool/mvn/MavenCommandlet.java @@ -0,0 +1,75 @@ +package com.devonfw.tools.ide.tool.mvn; + + +import java.util.Set; + + +import com.devonfw.tools.ide.common.Tag; +import com.devonfw.tools.ide.completion.AutoCompletionRegistry; +import com.devonfw.tools.ide.context.IdeContext; +import com.devonfw.tools.ide.tool.LocalToolCommandlet; + + +/** + * Abstract base class for Maven-compatible tool commandlets. + */ +public abstract class MavenCommandlet extends LocalToolCommandlet { + + + /** + * The constructor. + * + * @param context the {@link IdeContext}. + * @param tool the name of the tool. + */ + protected MavenCommandlet(IdeContext context, String tool) { + + super(context, tool, Set.of(Tag.JAVA, Tag.BUILD)); + } + + /** + * Initializes common Maven auto-completion candidates. + * + * @param registry the {@link AutoCompletionRegistry} to initialize. + */ + @Override + protected void initAutoCompletionRegistry(AutoCompletionRegistry registry) { + + registry.add("clean"); + registry.add("package"); + registry.add("install"); + registry.add("deploy"); + registry.add("test"); + registry.add("verify"); + registry.add("validate"); + registry.add("compile"); + registry.add("dependency:tree"); + registry.add("dependency:list"); + registry.add("help:effective-settings"); + registry.add("-DskipTests"); + registry.add("-Dmaven.test.skip=true"); + registry.add("exec:java"); + registry.add("-Dexec.mainClass="); + registry.add("-Dexec.args="); + registry.add("-P"); + registry.add("-pl"); + registry.add("-am"); + registry.add("-amd"); + registry.add("--also-make"); + registry.add("--also-make-dependents"); + registry.add("--fail-at-end"); + registry.add("--fail-fast"); + registry.add("-T1C"); + registry.add("-q"); + registry.add("-X"); + registry.add("-e"); + registry.add("-U"); + registry.add("-o"); + registry.add("-f"); + registry.add("-s"); + registry.add("-rf"); + registry.add("-DdeployAtEnd=true"); + } +} + + From e014a8651bbb9351eaebbc1f950d2ff9d501fe20 Mon Sep 17 00:00:00 2001 From: AdemZarrouki Date: Mon, 22 Jun 2026 10:00:08 +0200 Subject: [PATCH 09/17] #1909: refactor mvn and mvnd to extend MavenCommandlet --- .../com/devonfw/tools/ide/tool/mvn/Mvn.java | 38 ++----------- .../com/devonfw/tools/ide/tool/mvnd/Mvnd.java | 53 ++----------------- 2 files changed, 8 insertions(+), 83 deletions(-) diff --git a/cli/src/main/java/com/devonfw/tools/ide/tool/mvn/Mvn.java b/cli/src/main/java/com/devonfw/tools/ide/tool/mvn/Mvn.java index d91b8ccd99..d3675707a8 100644 --- a/cli/src/main/java/com/devonfw/tools/ide/tool/mvn/Mvn.java +++ b/cli/src/main/java/com/devonfw/tools/ide/tool/mvn/Mvn.java @@ -13,8 +13,6 @@ import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import com.devonfw.tools.ide.common.Tag; -import com.devonfw.tools.ide.completion.AutoCompletionRegistry; import com.devonfw.tools.ide.context.IdeContext; import com.devonfw.tools.ide.git.GitContext; import com.devonfw.tools.ide.io.FileAccess; @@ -22,16 +20,16 @@ import com.devonfw.tools.ide.process.ProcessMode; import com.devonfw.tools.ide.process.ProcessResult; import com.devonfw.tools.ide.step.Step; -import com.devonfw.tools.ide.tool.LocalToolCommandlet; import com.devonfw.tools.ide.tool.ToolCommandlet; import com.devonfw.tools.ide.tool.ToolInstallRequest; import com.devonfw.tools.ide.variable.IdeVariables; import com.devonfw.tools.ide.variable.VariableSyntax; + /** * {@link ToolCommandlet} for maven. */ -public class Mvn extends LocalToolCommandlet { +public class Mvn extends MavenCommandlet { private static final Logger LOG = LoggerFactory.getLogger(Mvn.class); @@ -70,39 +68,9 @@ public class Mvn extends LocalToolCommandlet { */ public Mvn(IdeContext context) { - super(context, "mvn", Set.of(Tag.JAVA, Tag.BUILD)); + super(context, "mvn"); } - /** - * Initializes Maven-specific auto-completion candidates. - * - * @param registry the {@link AutoCompletionRegistry} to initialize. - */ - @Override - protected void initAutoCompletionRegistry(AutoCompletionRegistry registry) { - - registry.add("clean"); - registry.add("package"); - registry.add("install"); - registry.add("deploy"); - registry.add("test"); - registry.add("verify"); - registry.add("validate"); - registry.add("compile"); - registry.add("dependency:tree"); - registry.add("dependency:list"); - registry.add("help:effective-settings"); - registry.add("-DskipTests"); - registry.add("exec:java"); - registry.add("-Dexec.mainClass="); - registry.add("-Dexec.args="); - registry.add("--also-make"); - registry.add("--also-make-dependents"); - registry.add("--fail-at-end"); - registry.add("--fail-fast"); - registry.add("-T1C"); - registry.add("-DdeployAtEnd=true"); - } @Override protected void configureToolBinary(ProcessContext pc, ProcessMode processMode) { diff --git a/cli/src/main/java/com/devonfw/tools/ide/tool/mvnd/Mvnd.java b/cli/src/main/java/com/devonfw/tools/ide/tool/mvnd/Mvnd.java index a37a51da3d..4d720fd2a8 100644 --- a/cli/src/main/java/com/devonfw/tools/ide/tool/mvnd/Mvnd.java +++ b/cli/src/main/java/com/devonfw/tools/ide/tool/mvnd/Mvnd.java @@ -1,17 +1,15 @@ package com.devonfw.tools.ide.tool.mvnd; -import java.util.Set; -import com.devonfw.tools.ide.common.Tag; import com.devonfw.tools.ide.completion.AutoCompletionRegistry; import com.devonfw.tools.ide.context.IdeContext; -import com.devonfw.tools.ide.tool.LocalToolCommandlet; import com.devonfw.tools.ide.tool.ToolCommandlet; +import com.devonfw.tools.ide.tool.mvn.MavenCommandlet; /** * {@link ToolCommandlet} for maven daemon. */ -public class Mvnd extends LocalToolCommandlet { +public class Mvnd extends MavenCommandlet { /** * The constructor. @@ -19,7 +17,8 @@ public class Mvnd extends LocalToolCommandlet { * @param context the {@link IdeContext}. */ public Mvnd(IdeContext context) { - super(context, "mvnd", Set.of(Tag.JAVA, Tag.BUILD)); + + super(context, "mvnd"); } /** @@ -30,49 +29,7 @@ public Mvnd(IdeContext context) { @Override protected void initAutoCompletionRegistry(AutoCompletionRegistry registry) { - // lifecycle phases - registry.add("clean"); - registry.add("validate"); - registry.add("compile"); - registry.add("test"); - registry.add("package"); - registry.add("verify"); - registry.add("install"); - registry.add("deploy"); - - // plugin goals - registry.add("dependency:tree"); - registry.add("dependency:list"); - registry.add("help:effective-settings"); - registry.add("exec:java"); - - // common maven options - registry.add("-DskipTests"); - registry.add("-Dmaven.test.skip=true"); - registry.add("-P"); - registry.add("-pl"); - registry.add("-am"); - registry.add("-amd"); - registry.add("--also-make"); - registry.add("--also-make-dependents"); - registry.add("--fail-at-end"); - registry.add("--fail-fast"); - registry.add("-T1C"); - registry.add("-q"); - registry.add("-X"); - registry.add("-e"); - registry.add("-U"); - registry.add("-o"); - registry.add("-f"); - registry.add("-s"); - registry.add("-rf"); - - // exec plugin properties - registry.add("-Dexec.mainClass="); - registry.add("-Dexec.args="); - registry.add("-DdeployAtEnd=true"); - - // mvnd-specific commands + super.initAutoCompletionRegistry(registry); registry.add("--status"); registry.add("--stop"); registry.add("--purge"); From 5f7caf2a7132ea27a2da6d997c177a2cb703ba98 Mon Sep 17 00:00:00 2001 From: AdemZarrouki Date: Mon, 22 Jun 2026 10:26:09 +0200 Subject: [PATCH 10/17] #1909: add tests to mvnd commandlet --- .../devonfw/tools/ide/tool/mvnd/MvndTest.java | 76 +++++++++++++++++++ 1 file changed, 76 insertions(+) create mode 100644 cli/src/test/java/com/devonfw/tools/ide/tool/mvnd/MvndTest.java diff --git a/cli/src/test/java/com/devonfw/tools/ide/tool/mvnd/MvndTest.java b/cli/src/test/java/com/devonfw/tools/ide/tool/mvnd/MvndTest.java new file mode 100644 index 0000000000..cfb2f62c42 --- /dev/null +++ b/cli/src/test/java/com/devonfw/tools/ide/tool/mvnd/MvndTest.java @@ -0,0 +1,76 @@ +package com.devonfw.tools.ide.tool.mvnd; + +import java.util.stream.Collectors; + +import org.junit.jupiter.api.Test; + +import com.devonfw.tools.ide.common.Tag; +import com.devonfw.tools.ide.completion.CompletionCandidateCollectorDefault; +import com.devonfw.tools.ide.context.AbstractIdeContextTest; +import com.devonfw.tools.ide.context.IdeTestContext; +import com.devonfw.tools.ide.property.Property; +import com.github.tomakehurst.wiremock.junit5.WireMockRuntimeInfo; +import com.github.tomakehurst.wiremock.junit5.WireMockTest; + +/** + * Test of {@link Mvnd}. + */ +@WireMockTest +class MvndTest extends AbstractIdeContextTest { + + private static final String MVND_PROJECT = "mvnd"; + + @Test + void testMvndBasicProperties(WireMockRuntimeInfo wireMockRuntimeInfo) { + + // arrange + IdeTestContext context = newContext(MVND_PROJECT, wireMockRuntimeInfo); + Mvnd mvnd = new Mvnd(context); + + // assert + assertThat(mvnd.getName()).isEqualTo("mvnd"); + assertThat(mvnd.getTags()).contains(Tag.JAVA, Tag.BUILD); + assertThat(mvnd.getToolHelpArguments()).isEqualTo("--help"); + } + + @Test + void testMvndAutoCompletion(WireMockRuntimeInfo wireMockRuntimeInfo) { + + // arrange + IdeTestContext context = newContext(MVND_PROJECT, wireMockRuntimeInfo); + Mvnd mvnd = new Mvnd(context); + CompletionCandidateCollectorDefault collector = new CompletionCandidateCollectorDefault(context); + Property property = mvnd.arguments; + + // act + mvnd.completeToolArguments("", collector, property); + + // assert + java.util.List candidates = collector.getCandidates().stream().map(c -> c.text()).collect(Collectors.toList()); + assertThat(candidates).contains("clean", "compile", "dependency:tree", "-DskipTests", "--status", "--stop"); + } + + @Test + void testMvndInstallAndRun(WireMockRuntimeInfo wireMockRuntimeInfo) { + + // arrange + IdeTestContext context = newContext(MVND_PROJECT, wireMockRuntimeInfo); + Mvnd mvnd = new Mvnd(context); + + // act + mvnd.install(); + + // assert + assertThat(context.getSoftwarePath().resolve("mvnd/bin/mvnd")).exists(); + assertThat(context).logAtSuccess().hasMessageContaining("Successfully installed mvnd"); + + // act + mvnd.arguments.addValue("foo"); + mvnd.arguments.addValue("bar"); + mvnd.run(); + + // assert + assertThat(context).logAtInfo().hasMessageContaining("mvnd foo bar"); + } + +} From 20ed35ceaf30ce6a8ac3fef0951988d37545e120 Mon Sep 17 00:00:00 2001 From: AdemZarrouki Date: Mon, 22 Jun 2026 10:35:31 +0200 Subject: [PATCH 11/17] #1909: add resources for test --- .../mvnd/_ide/urls/java/java/17.0.10_7/urls | 1 + .../mvnd/_ide/urls/mvnd/mvnd/1.0.6/urls | 1 + .../mvnd/_ide/urls/mvnd/mvnd/dependencies.json | 14 ++++++++++++++ .../mvnd/project/home/.ide/ide.properties | 0 .../mvnd/project/settings/ide.properties | 2 ++ .../mvnd/project/workspaces/main/.gitkeep | 0 .../mvnd/repository/java/java/default/bin/java | 2 ++ .../mvnd/repository/mvnd/mvnd/default/bin/mvnd | 8 ++++++++ 8 files changed, 28 insertions(+) create mode 100755 cli/src/test/resources/ide-projects/mvnd/_ide/urls/java/java/17.0.10_7/urls create mode 100755 cli/src/test/resources/ide-projects/mvnd/_ide/urls/mvnd/mvnd/1.0.6/urls create mode 100644 cli/src/test/resources/ide-projects/mvnd/_ide/urls/mvnd/mvnd/dependencies.json create mode 100755 cli/src/test/resources/ide-projects/mvnd/project/home/.ide/ide.properties create mode 100755 cli/src/test/resources/ide-projects/mvnd/project/settings/ide.properties create mode 100755 cli/src/test/resources/ide-projects/mvnd/project/workspaces/main/.gitkeep create mode 100755 cli/src/test/resources/ide-projects/mvnd/repository/java/java/default/bin/java create mode 100755 cli/src/test/resources/ide-projects/mvnd/repository/mvnd/mvnd/default/bin/mvnd diff --git a/cli/src/test/resources/ide-projects/mvnd/_ide/urls/java/java/17.0.10_7/urls b/cli/src/test/resources/ide-projects/mvnd/_ide/urls/java/java/17.0.10_7/urls new file mode 100755 index 0000000000..62e6853f29 --- /dev/null +++ b/cli/src/test/resources/ide-projects/mvnd/_ide/urls/java/java/17.0.10_7/urls @@ -0,0 +1 @@ +${testbaseurl}/download/java/java/17.0.10_7/java-17.0.10_7.tgz diff --git a/cli/src/test/resources/ide-projects/mvnd/_ide/urls/mvnd/mvnd/1.0.6/urls b/cli/src/test/resources/ide-projects/mvnd/_ide/urls/mvnd/mvnd/1.0.6/urls new file mode 100755 index 0000000000..e7b5d974f0 --- /dev/null +++ b/cli/src/test/resources/ide-projects/mvnd/_ide/urls/mvnd/mvnd/1.0.6/urls @@ -0,0 +1 @@ +${testbaseurl}/download/mvnd/mvnd/1.0.6/mvnd-1.0.6.tgz diff --git a/cli/src/test/resources/ide-projects/mvnd/_ide/urls/mvnd/mvnd/dependencies.json b/cli/src/test/resources/ide-projects/mvnd/_ide/urls/mvnd/mvnd/dependencies.json new file mode 100644 index 0000000000..cc895cfb18 --- /dev/null +++ b/cli/src/test/resources/ide-projects/mvnd/_ide/urls/mvnd/mvnd/dependencies.json @@ -0,0 +1,14 @@ +{ + "[4.0,)": [ + { + "tool": "java", + "versionRange": "[17,)" + } + ], + "[3.0,4.0)": [ + { + "tool": "java", + "versionRange": "[8,)" + } + ] +} \ No newline at end of file diff --git a/cli/src/test/resources/ide-projects/mvnd/project/home/.ide/ide.properties b/cli/src/test/resources/ide-projects/mvnd/project/home/.ide/ide.properties new file mode 100755 index 0000000000..e69de29bb2 diff --git a/cli/src/test/resources/ide-projects/mvnd/project/settings/ide.properties b/cli/src/test/resources/ide-projects/mvnd/project/settings/ide.properties new file mode 100755 index 0000000000..9558356597 --- /dev/null +++ b/cli/src/test/resources/ide-projects/mvnd/project/settings/ide.properties @@ -0,0 +1,2 @@ +JAVA_VERSION=17.0.10_7 +MVN_VERSION=1.0.6 diff --git a/cli/src/test/resources/ide-projects/mvnd/project/workspaces/main/.gitkeep b/cli/src/test/resources/ide-projects/mvnd/project/workspaces/main/.gitkeep new file mode 100755 index 0000000000..e69de29bb2 diff --git a/cli/src/test/resources/ide-projects/mvnd/repository/java/java/default/bin/java b/cli/src/test/resources/ide-projects/mvnd/repository/java/java/default/bin/java new file mode 100755 index 0000000000..bb96ab46f2 --- /dev/null +++ b/cli/src/test/resources/ide-projects/mvnd/repository/java/java/default/bin/java @@ -0,0 +1,2 @@ +#!/bin/bash +echo java $* diff --git a/cli/src/test/resources/ide-projects/mvnd/repository/mvnd/mvnd/default/bin/mvnd b/cli/src/test/resources/ide-projects/mvnd/repository/mvnd/mvnd/default/bin/mvnd new file mode 100755 index 0000000000..365d501406 --- /dev/null +++ b/cli/src/test/resources/ide-projects/mvnd/repository/mvnd/mvnd/default/bin/mvnd @@ -0,0 +1,8 @@ +#!/usr/bin/env bash + +if [ "$1" == "--version" ]; then + echo "1.0.0" +else + echo "mvnd $*" +fi + From 4ccb833174c918f77329164acd413b59a38cd7a6 Mon Sep 17 00:00:00 2001 From: AdemZarrouki Date: Mon, 22 Jun 2026 11:13:53 +0200 Subject: [PATCH 12/17] #1909: remove trailing spaces in IdeCompleterTest assertions after introducing mvnd --- .../com/devonfw/tools/ide/completion/IdeCompleterTest.java | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/cli/src/test/java/com/devonfw/tools/ide/completion/IdeCompleterTest.java b/cli/src/test/java/com/devonfw/tools/ide/completion/IdeCompleterTest.java index efe209d0aa..edf4b201b4 100644 --- a/cli/src/test/java/com/devonfw/tools/ide/completion/IdeCompleterTest.java +++ b/cli/src/test/java/com/devonfw/tools/ide/completion/IdeCompleterTest.java @@ -49,7 +49,7 @@ void testIdeCompleterBatch() { void testIdeCompleterInstall() { this.reader.setCompleter(newCompleter()); - assertBuffer("install mvn ", new TestBuffer("install mv").tab()); + assertBuffer("install mvn", new TestBuffer("install mv").tab()); } /** @@ -59,7 +59,7 @@ void testIdeCompleterInstall() { void testIdeCompleterHelpWithToolCompletion() { this.reader.setCompleter(newCompleter()); - assertBuffer("help mvn ", new TestBuffer("help mv").tab().tab()); + assertBuffer("help mvn", new TestBuffer("help mv").tab().tab()); } /** @@ -126,7 +126,7 @@ void testIdeCompleterWithInvalidInputDoesNothing() { void testIdeCompleterHandlesOptionsBeforeCommand() { this.reader.setCompleter(newCompleter()); - assertBuffer("get-version mvn ", new TestBuffer("get-version mv").tab().tab()); + assertBuffer("get-version mvn", new TestBuffer("get-version mv").tab().tab()); } /** From 4a545f69eb02b5059c5e0bfda9892d4fd25d8c3b Mon Sep 17 00:00:00 2001 From: AdemZarrouki Date: Mon, 22 Jun 2026 11:43:18 +0200 Subject: [PATCH 13/17] #1909: add license of Maven Daemon --- documentation/LICENSE.adoc | 1 + 1 file changed, 1 insertion(+) diff --git a/documentation/LICENSE.adoc b/documentation/LICENSE.adoc index a517f68f7f..bc2dd4ece3 100644 --- a/documentation/LICENSE.adoc +++ b/documentation/LICENSE.adoc @@ -51,6 +51,7 @@ The column `inclusion` indicates the way the component is included: |https://github.com/github/copilot-cli[GitHub Copilot CLI]|Optional|https://github.com/github/copilot-cli/blob/main/LICENSE.md[Proprietary] |https://github.com/anthropics/claude-code/tree/main[Claude Code CLI]|Optional|https://github.com/anthropics/claude-code/blob/main/LICENSE.md[Proprietary] |https://maven.apache.org/[Maven]|Default Setup|https://www.apache.org/licenses/LICENSE-2.0[Apache 2.0] +|https://maven.apache.org/[Maven Daemon]|Default Setup|https://www.apache.org/licenses/LICENSE-2.0[Apache 2.0] |https://code.visualstudio.com/[VS Code]|Optional|https://github.com/Microsoft/vscode/blob/master/LICENSE.txt[MIT] (https://code.visualstudio.com/License/[Terms]) |https://vscodium.com/[VSCodium]|Optional|https://github.com/VSCodium/vscodium/blob/master/LICENSE[MIT] |https://github.com/devonfw/extension-pack-vscode[extension-pack-vscode] |Optional|https://github.com/devonfw/extension-pack-vscode/blob/master/LICENSE[Apache 2.0] From ad8e158f943407c5b900f67b5dad53f4524a59ee Mon Sep 17 00:00:00 2001 From: AdemZarrouki Date: Mon, 22 Jun 2026 12:11:53 +0200 Subject: [PATCH 14/17] #1909: extend initAutoCompletionRegistry for mvnd specific options --- .../com/devonfw/tools/ide/tool/mvnd/Mvnd.java | 44 +++++++++++++++++++ 1 file changed, 44 insertions(+) diff --git a/cli/src/main/java/com/devonfw/tools/ide/tool/mvnd/Mvnd.java b/cli/src/main/java/com/devonfw/tools/ide/tool/mvnd/Mvnd.java index 4d720fd2a8..4e0f197f5d 100644 --- a/cli/src/main/java/com/devonfw/tools/ide/tool/mvnd/Mvnd.java +++ b/cli/src/main/java/com/devonfw/tools/ide/tool/mvnd/Mvnd.java @@ -33,6 +33,50 @@ protected void initAutoCompletionRegistry(AutoCompletionRegistry registry) { registry.add("--status"); registry.add("--stop"); registry.add("--purge"); + registry.add("--completion"); + registry.add("--diag"); + registry.add("--file"); + registry.add("-Djava.home="); + registry.add("-Djdk.java.options="); + registry.add("-Dmaven.multiModuleProjectDirectory="); + registry.add("-Dmaven.repo.local="); + registry.add("--settings"); + registry.add("-Dmvnd.buildTime="); + registry.add("--builder"); + registry.add("-Dmvnd.cancelConnectTimeout"); + registry.add("-Dmvnd.connectTimeout="); + registry.add("-Dmvnd.coreExtensionsExclude="); + registry.add("-Dmvnd.daemonStorage="); + registry.add("-Dmvnd.debug="); + registry.add("-Dmvnd.debug.address="); + registry.add("-Dmvnd.duplicateDaemonGracePeriod="); + registry.add("-Dmvnd.enableAssertions="); + registry.add("-Dmvnd.expirationCheckDelay="); + registry.add("-Dmvnd.home="); + registry.add("-Dmvnd.idleTimeout="); + registry.add("-Dmvnd.jvmArgs="); + registry.add("-Dmvnd.keepAlive="); + registry.add("-Dmvnd.logPurgePeriod="); + registry.add("-Dmvnd.maxHeapSize="); + registry.add("-Dmvnd.maxLostKeepAlive="); + registry.add("-Dmvnd.minHeapSize="); + registry.add("-Dmvnd.minThreads="); + registry.add("-Dmvnd.noBuffering="); + registry.add("-Dmvnd.noDaemon="); + registry.add("-Dmvnd.noModelCache="); + registry.add("-Dmvnd.pluginRealmEvictPattern="); + registry.add("-Dmvnd.propertiesPath="); + registry.add("--raw-streams"); + registry.add("-Dmvnd.registry="); + registry.add("-Dmvnd.rollingWindowSize="); + registry.add("--serial"); + registry.add("-Dmvnd.socketConnectTimeout="); + registry.add("-Dmvnd.socketFamily="); + registry.add("-Dmvnd.threadStackSize="); + registry.add("--threads"); + registry.add("-Dstyle.color="); + registry.add("-Duser.dir="); + registry.add("-Duser.home="); } @Override From 2a887be7a1a15e0923f38df8c17561d5499aca1b Mon Sep 17 00:00:00 2001 From: AdemZarrouki Date: Mon, 22 Jun 2026 12:27:29 +0200 Subject: [PATCH 15/17] #1909: add tests for mvnd in CompleteTest --- .../com/devonfw/tools/ide/tool/mvnd/Mvnd.java | 2 +- .../tools/ide/completion/CompleteTest.java | 36 +++++++++++++++++++ .../devonfw/tools/ide/tool/mvnd/MvndTest.java | 21 ----------- 3 files changed, 37 insertions(+), 22 deletions(-) diff --git a/cli/src/main/java/com/devonfw/tools/ide/tool/mvnd/Mvnd.java b/cli/src/main/java/com/devonfw/tools/ide/tool/mvnd/Mvnd.java index 4e0f197f5d..9031b45b55 100644 --- a/cli/src/main/java/com/devonfw/tools/ide/tool/mvnd/Mvnd.java +++ b/cli/src/main/java/com/devonfw/tools/ide/tool/mvnd/Mvnd.java @@ -43,7 +43,7 @@ protected void initAutoCompletionRegistry(AutoCompletionRegistry registry) { registry.add("--settings"); registry.add("-Dmvnd.buildTime="); registry.add("--builder"); - registry.add("-Dmvnd.cancelConnectTimeout"); + registry.add("-Dmvnd.cancelConnectTimeout="); registry.add("-Dmvnd.connectTimeout="); registry.add("-Dmvnd.coreExtensionsExclude="); registry.add("-Dmvnd.daemonStorage="); diff --git a/cli/src/test/java/com/devonfw/tools/ide/completion/CompleteTest.java b/cli/src/test/java/com/devonfw/tools/ide/completion/CompleteTest.java index a4db4f7a21..2830abe197 100644 --- a/cli/src/test/java/com/devonfw/tools/ide/completion/CompleteTest.java +++ b/cli/src/test/java/com/devonfw/tools/ide/completion/CompleteTest.java @@ -302,4 +302,40 @@ void testCompleteMavenToolArgumentsForEmptyInput() { assertThat(candidates.stream().map(CompletionCandidate::text)) .contains("clean", "package", "install", "dependency:list", "dependency:tree", "-DskipTests"); } + + /** + * Test of tool argument auto-completion for Maven Daemon. + */ + @Test + void testCompleteMavenDaemonToolArguments() { + + // arrange + AbstractIdeContext context = newContext(PROJECT_BASIC, null, false); + CliArguments args = CliArguments.ofCompletion("mvnd", "-Dmvnd.c"); + + // act + List candidates = context.complete(args, true); + + // assert + assertThat(candidates.stream().map(CompletionCandidate::text)) + .contains("-Dmvnd.cancelConnectTimeout=", "-Dmvnd.connectTimeout=", "-Dmvnd.coreExtensionsExclude="); + } + + /** + * Test of Maven Daemon tool argument auto-completion for empty input. + */ + @Test + void testCompleteMavenDaemonToolArgumentsForEmptyInput() { + + // arrange + AbstractIdeContext context = newContext(PROJECT_BASIC, null, false); + CliArguments args = CliArguments.ofCompletion("mvnd", ""); + + // act + List candidates = context.complete(args, true); + + // assert + assertThat(candidates.stream().map(CompletionCandidate::text)) + .contains("--purge", "--settings", "--completion", "dependency:list", "dependency:tree", "-DskipTests"); + } } diff --git a/cli/src/test/java/com/devonfw/tools/ide/tool/mvnd/MvndTest.java b/cli/src/test/java/com/devonfw/tools/ide/tool/mvnd/MvndTest.java index cfb2f62c42..3811c3bbf5 100644 --- a/cli/src/test/java/com/devonfw/tools/ide/tool/mvnd/MvndTest.java +++ b/cli/src/test/java/com/devonfw/tools/ide/tool/mvnd/MvndTest.java @@ -1,14 +1,10 @@ package com.devonfw.tools.ide.tool.mvnd; -import java.util.stream.Collectors; - import org.junit.jupiter.api.Test; import com.devonfw.tools.ide.common.Tag; -import com.devonfw.tools.ide.completion.CompletionCandidateCollectorDefault; import com.devonfw.tools.ide.context.AbstractIdeContextTest; import com.devonfw.tools.ide.context.IdeTestContext; -import com.devonfw.tools.ide.property.Property; import com.github.tomakehurst.wiremock.junit5.WireMockRuntimeInfo; import com.github.tomakehurst.wiremock.junit5.WireMockTest; @@ -33,23 +29,6 @@ void testMvndBasicProperties(WireMockRuntimeInfo wireMockRuntimeInfo) { assertThat(mvnd.getToolHelpArguments()).isEqualTo("--help"); } - @Test - void testMvndAutoCompletion(WireMockRuntimeInfo wireMockRuntimeInfo) { - - // arrange - IdeTestContext context = newContext(MVND_PROJECT, wireMockRuntimeInfo); - Mvnd mvnd = new Mvnd(context); - CompletionCandidateCollectorDefault collector = new CompletionCandidateCollectorDefault(context); - Property property = mvnd.arguments; - - // act - mvnd.completeToolArguments("", collector, property); - - // assert - java.util.List candidates = collector.getCandidates().stream().map(c -> c.text()).collect(Collectors.toList()); - assertThat(candidates).contains("clean", "compile", "dependency:tree", "-DskipTests", "--status", "--stop"); - } - @Test void testMvndInstallAndRun(WireMockRuntimeInfo wireMockRuntimeInfo) { From 533b6ffb3655a01dff2dca91e30c69482e37b437 Mon Sep 17 00:00:00 2001 From: AdemZarrouki Date: Thu, 25 Jun 2026 12:07:03 +0200 Subject: [PATCH 16/17] #1909: update dependencies and remove obsolete version from properties --- .../java/com/devonfw/tools/ide/tool/mvnd/MvndTest.java | 1 + .../mvnd/_ide/urls/mvnd/mvnd/dependencies.json | 10 ++-------- .../ide-projects/mvnd/project/settings/ide.properties | 2 -- 3 files changed, 3 insertions(+), 10 deletions(-) diff --git a/cli/src/test/java/com/devonfw/tools/ide/tool/mvnd/MvndTest.java b/cli/src/test/java/com/devonfw/tools/ide/tool/mvnd/MvndTest.java index 3811c3bbf5..18f45b6eee 100644 --- a/cli/src/test/java/com/devonfw/tools/ide/tool/mvnd/MvndTest.java +++ b/cli/src/test/java/com/devonfw/tools/ide/tool/mvnd/MvndTest.java @@ -40,6 +40,7 @@ void testMvndInstallAndRun(WireMockRuntimeInfo wireMockRuntimeInfo) { mvnd.install(); // assert + assertThat(context.getSoftwarePath().resolve("java/bin/java")).exists(); assertThat(context.getSoftwarePath().resolve("mvnd/bin/mvnd")).exists(); assertThat(context).logAtSuccess().hasMessageContaining("Successfully installed mvnd"); diff --git a/cli/src/test/resources/ide-projects/mvnd/_ide/urls/mvnd/mvnd/dependencies.json b/cli/src/test/resources/ide-projects/mvnd/_ide/urls/mvnd/mvnd/dependencies.json index cc895cfb18..f90d36a2c5 100644 --- a/cli/src/test/resources/ide-projects/mvnd/_ide/urls/mvnd/mvnd/dependencies.json +++ b/cli/src/test/resources/ide-projects/mvnd/_ide/urls/mvnd/mvnd/dependencies.json @@ -1,14 +1,8 @@ { - "[4.0,)": [ - { - "tool": "java", - "versionRange": "[17,)" - } - ], - "[3.0,4.0)": [ + "[1.0,)": [ { "tool": "java", "versionRange": "[8,)" } ] -} \ No newline at end of file +} diff --git a/cli/src/test/resources/ide-projects/mvnd/project/settings/ide.properties b/cli/src/test/resources/ide-projects/mvnd/project/settings/ide.properties index 9558356597..e69de29bb2 100755 --- a/cli/src/test/resources/ide-projects/mvnd/project/settings/ide.properties +++ b/cli/src/test/resources/ide-projects/mvnd/project/settings/ide.properties @@ -1,2 +0,0 @@ -JAVA_VERSION=17.0.10_7 -MVN_VERSION=1.0.6 From 835cd526399176a5ade7c8cbf499c5f3090a48b6 Mon Sep 17 00:00:00 2001 From: AdemZarrouki Date: Fri, 26 Jun 2026 11:44:10 +0200 Subject: [PATCH 17/17] #1909: update changelog --- CHANGELOG.adoc | 1 + 1 file changed, 1 insertion(+) diff --git a/CHANGELOG.adoc b/CHANGELOG.adoc index b95c6b8a9f..ce433d61a2 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/1909[#1909]: add commandlet for Maven Daemon The full list of changes for this release can be found in https://github.com/devonfw/IDEasy/milestone/46?closed=1[milestone 2026.07.001].