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 00bd9c658ee..971e0cedbdd 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 @@ protected void settings(C context) throws Exception { * 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 @@ protected void settings(C context, boolean emitSettingsWarnings, SettingsBuilder } 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 2f384698432..56d6cc099f3 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 @@ protected void configure() { }); 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 @@ protected void configure() { .lookup(BootstrapCoreExtensionManager.class) .loadCoreExtensions(mer, providedArtifacts, extensions)); } finally { + if (settingsCleaner != null) { + settingsCleaner.run(); + } try { container.dispose(); } finally {