From a9f6f3b71d21542869f635c197dc8076583937f1 Mon Sep 17 00:00:00 2001 From: Tamas Cservenak Date: Fri, 20 Dec 2024 14:57:16 +0100 Subject: [PATCH] [MNG-8461] Initial settings method must restore context state 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. --- https://issues.apache.org/jira/browse/MNG-8461 --- .../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 00bd9c658eec..971e0cedbdde 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 2f3846984329..56d6cc099f3f 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 {