From d9bc7f81da6de2efd1667fb9724d4d2726f466d4 Mon Sep 17 00:00:00 2001 From: Stefan Oehme Date: Sun, 5 Apr 2026 22:21:16 +0200 Subject: [PATCH] Fix logging setup/teardown order I occasionally saw stackoverflow exceptions which pointed at the logging and terminal setup being in an inconsistent state. I suspect that this was due to the shutdown being in the wrong order. The build log appender should be deregistered before the terminal is shut down. To do this, the closeables need to be registered in the opposite order than they were previously. --- .../org/apache/maven/cling/invoker/LookupInvoker.java | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/impl/maven-cli/src/main/java/org/apache/maven/cling/invoker/LookupInvoker.java b/impl/maven-cli/src/main/java/org/apache/maven/cling/invoker/LookupInvoker.java index 963d8b1706b7..4f695cfa1a5c 100644 --- a/impl/maven-cli/src/main/java/org/apache/maven/cling/invoker/LookupInvoker.java +++ b/impl/maven-cli/src/main/java/org/apache/maven/cling/invoker/LookupInvoker.java @@ -311,11 +311,6 @@ protected BuildEventListener doDetermineBuildEventListener(C context) { protected final void createTerminal(C context) { if (context.terminal == null) { - // Create the build log appender; also sets MavenSimpleLogger sink - ProjectBuildLogAppender projectBuildLogAppender = - new ProjectBuildLogAppender(determineBuildEventListener(context)); - context.closeables.add(projectBuildLogAppender); - MessageUtils.systemInstall( builder -> doCreateTerminal(context, builder), terminal -> doConfigureWithTerminal(context, terminal)); @@ -323,6 +318,11 @@ protected final void createTerminal(C context) { context.terminal = MessageUtils.getTerminal(); context.closeables.add(MessageUtils::systemUninstall); MessageUtils.registerShutdownHook(); // safety belt + + // Create the build log appender; also sets MavenSimpleLogger sink + ProjectBuildLogAppender projectBuildLogAppender = + new ProjectBuildLogAppender(determineBuildEventListener(context)); + context.closeables.add(projectBuildLogAppender); } else { doConfigureWithTerminal(context, context.terminal); }