This is an automated email from the ASF dual-hosted git repository.

sjaranowski pushed a commit to branch maven-3.9.x
in repository https://gitbox.apache.org/repos/asf/maven.git


The following commit(s) were added to refs/heads/maven-3.9.x by this push:
     new 8413c92ba5 Fix plugin prefix resolution when metadata is not available 
from repository
8413c92ba5 is described below

commit 8413c92ba59fb8f1ffacd89884a76a315798cdf4
Author: Guillaume Nodet <[email protected]>
AuthorDate: Fri Oct 17 15:14:10 2025 +0200

    Fix plugin prefix resolution when metadata is not available from repository
    
    Restore the mechanism to load prefixes from configured plugins
    and use it when the prefix cannot be found from the repository.
    
    Fixes #11252
    
    (cherry picked from commit 0621de2493003526e88c7fa5f21e8655109d3f13)
---
 .../internal/DefaultPluginPrefixResolver.java      | 72 ++++++++++++++++------
 1 file changed, 54 insertions(+), 18 deletions(-)

diff --git 
a/maven-core/src/main/java/org/apache/maven/plugin/prefix/internal/DefaultPluginPrefixResolver.java
 
b/maven-core/src/main/java/org/apache/maven/plugin/prefix/internal/DefaultPluginPrefixResolver.java
index 2fb24de171..d2566b6ffb 100644
--- 
a/maven-core/src/main/java/org/apache/maven/plugin/prefix/internal/DefaultPluginPrefixResolver.java
+++ 
b/maven-core/src/main/java/org/apache/maven/plugin/prefix/internal/DefaultPluginPrefixResolver.java
@@ -21,14 +21,21 @@
 import java.io.IOException;
 import java.util.ArrayList;
 import java.util.Collections;
-import java.util.HashSet;
 import java.util.LinkedHashMap;
 import java.util.List;
 import java.util.Map;
 import java.util.Set;
+import java.util.stream.Collectors;
+import java.util.stream.Stream;
 
 import org.apache.maven.artifact.repository.metadata.Metadata;
 import org.apache.maven.artifact.repository.metadata.io.MetadataReader;
+import org.apache.maven.model.Build;
+import org.apache.maven.model.Model;
+import org.apache.maven.model.Plugin;
+import org.apache.maven.model.PluginManagement;
+import org.apache.maven.plugin.BuildPluginManager;
+import org.apache.maven.plugin.descriptor.PluginDescriptor;
 import org.apache.maven.plugin.prefix.NoPluginFoundForPrefixException;
 import org.apache.maven.plugin.prefix.PluginPrefixRequest;
 import org.apache.maven.plugin.prefix.PluginPrefixResolver;
@@ -64,6 +71,9 @@ public class DefaultPluginPrefixResolver implements 
PluginPrefixResolver {
     @Requirement
     private Logger logger;
 
+    @Requirement
+    private BuildPluginManager pluginManager;
+
     @Requirement
     private RepositorySystem repositorySystem;
 
@@ -73,6 +83,10 @@ public class DefaultPluginPrefixResolver implements 
PluginPrefixResolver {
     public PluginPrefixResult resolve(PluginPrefixRequest request) throws 
NoPluginFoundForPrefixException {
         logger.debug("Resolving plugin prefix " + request.getPrefix() + " from 
" + request.getPluginGroups());
 
+        Model pom = request.getPom();
+        Build build = pom != null ? pom.getBuild() : null;
+        PluginManagement management = build != null ? 
build.getPluginManagement() : null;
+
         // map of groupId -> Set(artifactId) plugin candidates:
         // if value is null, keys are coming from settings, and no artifactId 
filtering is applied
         // if value is non-null: we allow only plugins that have enlisted 
artifactId only
@@ -80,26 +94,26 @@ public PluginPrefixResult resolve(PluginPrefixRequest 
request) throws NoPluginFo
         // end game is: settings enlisted groupIds are obeying order and are 
"free for all" (artifactId)
         // while POM enlisted plugins coming from non-enlisted settings 
groupIds (ie conflict of prefixes)
         // will prevail/win.
-        LinkedHashMap<String, Set<String>> candidates = new LinkedHashMap<>();
-        if (request.getPom() != null) {
-            if (request.getPom().getBuild() != null) {
-                request.getPom().getBuild().getPlugins().stream()
-                        .filter(p -> 
!request.getPluginGroups().contains(p.getGroupId()))
-                        .forEach(p -> candidates
-                                .computeIfAbsent(p.getGroupId(), g -> new 
HashSet<>())
-                                .add(p.getArtifactId()));
-                if (request.getPom().getBuild().getPluginManagement() != null) 
{
-                    
request.getPom().getBuild().getPluginManagement().getPlugins().stream()
-                            .filter(p -> 
!request.getPluginGroups().contains(p.getGroupId()))
-                            .forEach(p -> candidates
-                                    .computeIfAbsent(p.getGroupId(), g -> new 
HashSet<>())
-                                    .add(p.getArtifactId()));
-                }
-            }
-        }
+        LinkedHashMap<String, Set<String>> candidates = Stream.of(build, 
management)
+                .flatMap(container -> container != null ? 
container.getPlugins().stream() : Stream.empty())
+                .filter(p -> 
!request.getPluginGroups().contains(p.getGroupId()))
+                .collect(Collectors.groupingBy(
+                        Plugin::getGroupId,
+                        LinkedHashMap::new,
+                        Collectors.mapping(Plugin::getArtifactId, 
Collectors.toSet())));
         request.getPluginGroups().forEach(g -> candidates.put(g, null));
         PluginPrefixResult result = resolveFromRepository(request, candidates);
 
+        // If we haven't been able to resolve the plugin from the repository,
+        // as a last resort, we go through all declared plugins, load them
+        // one by one, and try to find a matching prefix.
+        if (result == null && build != null) {
+            result = resolveFromProject(request, build.getPlugins());
+            if (result == null && management != null) {
+                result = resolveFromProject(request, management.getPlugins());
+            }
+        }
+
         if (result == null) {
             throw new NoPluginFoundForPrefixException(
                     request.getPrefix(),
@@ -115,6 +129,28 @@ public PluginPrefixResult resolve(PluginPrefixRequest 
request) throws NoPluginFo
         return result;
     }
 
+    private PluginPrefixResult resolveFromProject(PluginPrefixRequest request, 
List<Plugin> plugins) {
+        for (Plugin plugin : plugins) {
+            try {
+                PluginDescriptor pluginDescriptor =
+                        pluginManager.loadPlugin(plugin, 
request.getRepositories(), request.getRepositorySession());
+
+                if 
(request.getPrefix().equals(pluginDescriptor.getGoalPrefix())) {
+                    return new DefaultPluginPrefixResult(plugin);
+                }
+            } catch (Exception e) {
+                if (logger.isDebugEnabled()) {
+                    logger.warn(
+                            "Failed to retrieve plugin descriptor for " + 
plugin.getId() + ": " + e.getMessage(), e);
+                } else {
+                    logger.warn("Failed to retrieve plugin descriptor for " + 
plugin.getId() + ": " + e.getMessage());
+                }
+            }
+        }
+
+        return null;
+    }
+
     private PluginPrefixResult resolveFromRepository(
             PluginPrefixRequest request, LinkedHashMap<String, Set<String>> 
candidates) {
         RequestTrace trace = RequestTrace.newChild(null, request);

Reply via email to