From bebc3d4a2e987e59aa0666f71cf3b8688dde6f7a Mon Sep 17 00:00:00 2001 From: Tamas Cservenak Date: Sun, 22 Dec 2024 14:43:47 +0100 Subject: [PATCH] [MNG-8461] Initial settings method must restore context state (#2004) Effective settings are (should be) created twice, once for "early boot" of Plexus when extensions are loaded up, and then again when Maven "boots". Bug was that early call "corrupted" (inited settings) in context causing that 2nd required call (due spy) was omitted. This resulted in lack of settings related spy events firing (as we do have IT for spy but it does not test settings events). --- https://issues.apache.org/jira/browse/MNG-8461 Related: https://github.com/alextu/maven4-reproducer/issues/1 --- .../apache/maven/cling/invoker/LookupInvoker.java | 14 +++++++++++++- .../invoker/PlexusContainerCapsuleFactory.java | 6 +++++- 2 files changed, 18 insertions(+), 2 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 00bd9c658e..971e0cedbd 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 @@ -501,8 +501,12 @@ public abstract class LookupInvoker implements Invoker * If there are Maven3 passwords presents in settings, this results in doubled warnings emitted. So Plexus DI * creation call keeps "emitSettingsWarnings" false. If there are fatal issues, it will anyway "die" at that * spot before warnings would be emitted. + *

+ * The method returns a "cleaner" runnable, as during extension loading the context needs to be "cleaned", restored + * to previous state (as it was before extension loading). */ - protected void settings(C context, boolean emitSettingsWarnings, SettingsBuilder settingsBuilder) throws Exception { + protected Runnable settings(C context, boolean emitSettingsWarnings, SettingsBuilder settingsBuilder) + throws Exception { Options mavenOptions = context.invokerRequest.options(); Path userSettingsFile = null; @@ -612,6 +616,14 @@ public abstract class LookupInvoker implements Invoker } context.logger.info(""); } + return () -> { + context.installationSettingsPath = null; + context.projectSettingsPath = null; + context.userSettingsPath = null; + context.effectiveSettings = null; + context.interactive = true; + context.localRepositoryPath = null; + }; } protected void customizeSettingsRequest(C context, SettingsBuilderRequest settingsBuilderRequest) diff --git a/impl/maven-cli/src/main/java/org/apache/maven/cling/invoker/PlexusContainerCapsuleFactory.java b/impl/maven-cli/src/main/java/org/apache/maven/cling/invoker/PlexusContainerCapsuleFactory.java index 2f38469843..56d6cc099f 100644 --- a/impl/maven-cli/src/main/java/org/apache/maven/cling/invoker/PlexusContainerCapsuleFactory.java +++ b/impl/maven-cli/src/main/java/org/apache/maven/cling/invoker/PlexusContainerCapsuleFactory.java @@ -273,13 +273,14 @@ public class PlexusContainerCapsuleFactory implements C }); ClassLoader oldCL = Thread.currentThread().getContextClassLoader(); + Runnable settingsCleaner = null; try { container.setLookupRealm(null); container.setLoggerManager(createLoggerManager()); container.getLoggerManager().setThresholds(toPlexusLoggingLevel(context.loggerLevel)); Thread.currentThread().setContextClassLoader(container.getContainerRealm()); - invoker.settings(context, false, container.lookup(SettingsBuilder.class)); + settingsCleaner = invoker.settings(context, false, container.lookup(SettingsBuilder.class)); MavenExecutionRequest mer = new DefaultMavenExecutionRequest(); invoker.populateRequest(context, new DefaultLookup(container), mer); @@ -288,6 +289,9 @@ public class PlexusContainerCapsuleFactory implements C .lookup(BootstrapCoreExtensionManager.class) .loadCoreExtensions(mer, providedArtifacts, extensions)); } finally { + if (settingsCleaner != null) { + settingsCleaner.run(); + } try { container.dispose(); } finally {