You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@maven.apache.org by gn...@apache.org on 2026/06/23 06:27:29 UTC

(maven) branch port-11908-to-4.0.x created (now c10265ef96)

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

gnodet pushed a change to branch port-11908-to-4.0.x
in repository https://gitbox.apache.org/repos/asf/maven.git


      at c10265ef96 Port #11908: Do not force metadata download for plugin prefix resolution (#11905)

This branch includes the following new commits:

     new c10265ef96 Port #11908: Do not force metadata download for plugin prefix resolution (#11905)

The 1 revisions listed above as "new" are entirely new to this
repository and will be described in separate emails.  The revisions
listed as "add" were already present in the repository and have only
been added to this reference.



(maven) 01/01: Port #11908: Do not force metadata download for plugin prefix resolution (#11905)

Posted by gn...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

gnodet pushed a commit to branch port-11908-to-4.0.x
in repository https://gitbox.apache.org/repos/asf/maven.git

commit c10265ef967e69181a5bd626f9a9c23e224bc180
Author: Guillaume Nodet <gn...@gmail.com>
AuthorDate: Tue Jun 23 06:27:17 2026 +0000

    Port #11908: Do not force metadata download for plugin prefix resolution (#11905)
    
    Co-Authored-By: Claude Opus 4.6 <no...@anthropic.com>
---
 .../internal/DefaultPluginPrefixResolver.java      | 47 +++++++++++++++++-----
 1 file changed, 37 insertions(+), 10 deletions(-)

diff --git a/impl/maven-core/src/main/java/org/apache/maven/plugin/prefix/internal/DefaultPluginPrefixResolver.java b/impl/maven-core/src/main/java/org/apache/maven/plugin/prefix/internal/DefaultPluginPrefixResolver.java
index 9e469f5f9b..4bd4f51379 100644
--- a/impl/maven-core/src/main/java/org/apache/maven/plugin/prefix/internal/DefaultPluginPrefixResolver.java
+++ b/impl/maven-core/src/main/java/org/apache/maven/plugin/prefix/internal/DefaultPluginPrefixResolver.java
@@ -25,8 +25,10 @@
 import java.io.IOException;
 import java.nio.file.Files;
 import java.util.ArrayList;
+import java.util.Collection;
 import java.util.Collections;
 import java.util.LinkedHashMap;
+import java.util.LinkedHashSet;
 import java.util.List;
 import java.util.Map;
 import java.util.Set;
@@ -107,16 +109,20 @@ public PluginPrefixResult resolve(PluginPrefixRequest request) throws NoPluginFo
                         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
+        PluginPrefixResult result = null;
+        // First, 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 (build != null) {
+            result = resolveFromProject(
+                    request,
+                    build.getPlugins(),
+                    management != null ? management.getPlugins() : Collections.emptyList());
+        }
+
+        // Second, we use G level metadata to discover prefix
+        // This order allows user managed clashing prefixes (they can declare them in POM)
+        if (result == null) {
+            result = resolveFromRepository(request, candidates);
         }
 
         if (result == null) {
@@ -137,7 +143,28 @@ public PluginPrefixResult resolve(PluginPrefixRequest request) throws NoPluginFo
         return result;
     }
 
-    private PluginPrefixResult resolveFromProject(PluginPrefixRequest request, List<Plugin> plugins) {
+    private PluginPrefixResult resolveFromProject(
+            PluginPrefixRequest request, List<Plugin> plugins, List<Plugin> pluginMgmt) {
+        if (plugins.isEmpty() && pluginMgmt.isEmpty()) {
+            return null;
+        }
+        PluginPrefixResult result = null;
+        Set<Plugin> candidates = new LinkedHashSet<>();
+        Stream.concat(plugins.stream(), pluginMgmt.stream())
+                .filter(p -> p.getArtifactId().contains(request.getPrefix()))
+                .forEach(candidates::add);
+        if (!candidates.isEmpty()) {
+            result = doResolveFromProject(request, candidates);
+        }
+        if (result == null) {
+            Set<Plugin> remainder = new LinkedHashSet<>(plugins);
+            remainder.removeAll(candidates);
+            result = doResolveFromProject(request, remainder);
+        }
+        return result;
+    }
+
+    private PluginPrefixResult doResolveFromProject(PluginPrefixRequest request, Collection<Plugin> plugins) {
         for (Plugin plugin : plugins) {
             try {
                 PluginDescriptor pluginDescriptor =