From 42267743939cc0f605fcd83c170aa154734702f1 Mon Sep 17 00:00:00 2001 From: Tamas Cservenak Date: Thu, 28 Aug 2025 14:49:07 +0200 Subject: [PATCH 1/2] Simplify prefix resolution First proposal, that is nearly trivial, just collect plugin groupIDs to check in proper order. There may be tricks for plugins lacking G metadata... --- .../internal/DefaultPluginPrefixResolver.java | 97 ++++++------------- 1 file changed, 30 insertions(+), 67 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 dd811f2c1eb4..c52011851bd7 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 @@ -23,17 +23,16 @@ import javax.inject.Singleton; import java.io.IOException; +import java.nio.file.Files; import java.util.ArrayList; import java.util.Collections; +import java.util.LinkedHashSet; import java.util.List; import java.util.Map; 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.Plugin; -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; @@ -65,14 +64,11 @@ public class DefaultPluginPrefixResolver implements PluginPrefixResolver { private static final String REPOSITORY_CONTEXT = org.apache.maven.api.services.RequestTrace.CONTEXT_PLUGIN; private final Logger logger = LoggerFactory.getLogger(getClass()); - private final BuildPluginManager pluginManager; private final RepositorySystem repositorySystem; private final MetadataReader metadataReader; @Inject - public DefaultPluginPrefixResolver( - BuildPluginManager pluginManager, RepositorySystem repositorySystem, MetadataReader metadataReader) { - this.pluginManager = pluginManager; + public DefaultPluginPrefixResolver(RepositorySystem repositorySystem, MetadataReader metadataReader) { this.repositorySystem = repositorySystem; this.metadataReader = metadataReader; } @@ -81,80 +77,46 @@ public DefaultPluginPrefixResolver( public PluginPrefixResult resolve(PluginPrefixRequest request) throws NoPluginFoundForPrefixException { logger.debug("Resolving plugin prefix {} from {}", request.getPrefix(), request.getPluginGroups()); - PluginPrefixResult result = resolveFromProject(request); + LinkedHashSet groupIds = new LinkedHashSet<>(); + if (request.getPom() != null) { + if (request.getPom().getBuild() != null) { + groupIds.addAll(request.getPom().getBuild().getPlugins().stream() + .map(Plugin::getGroupId) + .toList()); + if (request.getPom().getBuild().getPluginManagement() != null) { + groupIds.addAll(request.getPom().getBuild().getPluginManagement().getPlugins().stream() + .map(Plugin::getGroupId) + .toList()); + } + } + } + groupIds.addAll(request.getPluginGroups()); + PluginPrefixResult result = resolveFromRepository(request, groupIds); if (result == null) { - result = resolveFromRepository(request); - - if (result == null) { - throw new NoPluginFoundForPrefixException( - request.getPrefix(), - request.getPluginGroups(), - request.getRepositorySession().getLocalRepository(), - request.getRepositories()); - } else { - logger.debug( - "Resolved plugin prefix {} to {}:{} from repository {}", - request.getPrefix(), - result.getGroupId(), - result.getArtifactId(), - (result.getRepository() != null ? result.getRepository().getId() : "null")); - } + throw new NoPluginFoundForPrefixException( + request.getPrefix(), + groupIds.stream().toList(), + request.getRepositorySession().getLocalRepository(), + request.getRepositories()); } else { logger.debug( - "Resolved plugin prefix {} to {}:{} from POM {}", + "Resolved plugin prefix {} to {}:{} from repository {}", request.getPrefix(), result.getGroupId(), result.getArtifactId(), - request.getPom()); - } - - return result; - } - - private PluginPrefixResult resolveFromProject(PluginPrefixRequest request) { - PluginPrefixResult result = null; - - if (request.getPom() != null && request.getPom().getBuild() != null) { - Build build = request.getPom().getBuild(); - - result = resolveFromProject(request, build.getPlugins()); - - if (result == null && build.getPluginManagement() != null) { - result = resolveFromProject(request, build.getPluginManagement().getPlugins()); - } + (result.getRepository() != null ? result.getRepository().getId() : "null")); } return result; } - private PluginPrefixResult resolveFromProject(PluginPrefixRequest request, List 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) { + private PluginPrefixResult resolveFromRepository(PluginPrefixRequest request, LinkedHashSet pluginGroups) { RequestTrace trace = RequestTrace.newChild(null, request); List requests = new ArrayList<>(); - for (String pluginGroup : request.getPluginGroups()) { + for (String pluginGroup : pluginGroups) { org.eclipse.aether.metadata.Metadata metadata = new DefaultMetadata(pluginGroup, "maven-metadata.xml", DefaultMetadata.Nature.RELEASE_OR_SNAPSHOT); @@ -226,11 +188,12 @@ private PluginPrefixResult resolveFromRepository( String pluginGroup, org.eclipse.aether.metadata.Metadata metadata, ArtifactRepository repository) { - if (metadata != null && metadata.getFile() != null && metadata.getFile().isFile()) { + if (metadata != null && metadata.getPath() != null && Files.isRegularFile(metadata.getPath())) { try { Map options = Collections.singletonMap(MetadataReader.IS_STRICT, Boolean.FALSE); - Metadata pluginGroupMetadata = metadataReader.read(metadata.getFile(), options); + Metadata pluginGroupMetadata = + metadataReader.read(metadata.getPath().toFile(), options); List plugins = pluginGroupMetadata.getPlugins(); From d8739b00caf71589f45e7337c8038f72b7372993 Mon Sep 17 00:00:00 2001 From: Tamas Cservenak Date: Thu, 28 Aug 2025 16:12:29 +0200 Subject: [PATCH 2/2] Fix issues; POM plugins must prevail --- .../internal/DefaultPluginPrefixResolver.java | 57 ++++++++++++------- 1 file changed, 37 insertions(+), 20 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 c52011851bd7..3c2cff77c32e 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 @@ -26,13 +26,14 @@ import java.nio.file.Files; import java.util.ArrayList; import java.util.Collections; -import java.util.LinkedHashSet; +import java.util.HashSet; +import java.util.LinkedHashMap; import java.util.List; import java.util.Map; +import java.util.Set; import org.apache.maven.artifact.repository.metadata.Metadata; import org.apache.maven.artifact.repository.metadata.io.MetadataReader; -import org.apache.maven.model.Plugin; import org.apache.maven.plugin.prefix.NoPluginFoundForPrefixException; import org.apache.maven.plugin.prefix.PluginPrefixRequest; import org.apache.maven.plugin.prefix.PluginPrefixResolver; @@ -77,26 +78,37 @@ public DefaultPluginPrefixResolver(RepositorySystem repositorySystem, MetadataRe public PluginPrefixResult resolve(PluginPrefixRequest request) throws NoPluginFoundForPrefixException { logger.debug("Resolving plugin prefix {} from {}", request.getPrefix(), request.getPluginGroups()); - LinkedHashSet groupIds = new LinkedHashSet<>(); + // 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 + // --- + // 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> candidates = new LinkedHashMap<>(); if (request.getPom() != null) { if (request.getPom().getBuild() != null) { - groupIds.addAll(request.getPom().getBuild().getPlugins().stream() - .map(Plugin::getGroupId) - .toList()); + 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) { - groupIds.addAll(request.getPom().getBuild().getPluginManagement().getPlugins().stream() - .map(Plugin::getGroupId) - .toList()); + 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())); } } } - groupIds.addAll(request.getPluginGroups()); - PluginPrefixResult result = resolveFromRepository(request, groupIds); + request.getPluginGroups().forEach(g -> candidates.put(g, null)); + PluginPrefixResult result = resolveFromRepository(request, candidates); if (result == null) { throw new NoPluginFoundForPrefixException( request.getPrefix(), - groupIds.stream().toList(), + new ArrayList<>(candidates.keySet()), request.getRepositorySession().getLocalRepository(), request.getRepositories()); } else { @@ -111,12 +123,13 @@ public PluginPrefixResult resolve(PluginPrefixRequest request) throws NoPluginFo return result; } - private PluginPrefixResult resolveFromRepository(PluginPrefixRequest request, LinkedHashSet pluginGroups) { + private PluginPrefixResult resolveFromRepository( + PluginPrefixRequest request, LinkedHashMap> candidates) { RequestTrace trace = RequestTrace.newChild(null, request); List requests = new ArrayList<>(); - for (String pluginGroup : pluginGroups) { + for (String pluginGroup : candidates.keySet()) { org.eclipse.aether.metadata.Metadata metadata = new DefaultMetadata(pluginGroup, "maven-metadata.xml", DefaultMetadata.Nature.RELEASE_OR_SNAPSHOT); @@ -132,7 +145,7 @@ private PluginPrefixResult resolveFromRepository(PluginPrefixRequest request, Li List results = repositorySystem.resolveMetadata(request.getRepositorySession(), requests); requests.clear(); - PluginPrefixResult result = processResults(request, trace, results, requests); + PluginPrefixResult result = processResults(request, trace, results, requests, candidates); if (result != null) { return result; @@ -146,7 +159,7 @@ private PluginPrefixResult resolveFromRepository(PluginPrefixRequest request, Li results = repositorySystem.resolveMetadata(session, requests); - return processResults(request, trace, results, null); + return processResults(request, trace, results, null, candidates); } return null; @@ -156,7 +169,8 @@ private PluginPrefixResult processResults( PluginPrefixRequest request, RequestTrace trace, List results, - List requests) { + List requests, + LinkedHashMap> candidates) { for (MetadataResult res : results) { org.eclipse.aether.metadata.Metadata metadata = res.getMetadata(); @@ -167,7 +181,7 @@ private PluginPrefixResult processResults( } PluginPrefixResult result = - resolveFromRepository(request, trace, metadata.getGroupId(), metadata, repository); + resolveFromRepository(request, trace, metadata.getGroupId(), metadata, repository, candidates); if (result != null) { return result; @@ -187,7 +201,8 @@ private PluginPrefixResult resolveFromRepository( RequestTrace trace, String pluginGroup, org.eclipse.aether.metadata.Metadata metadata, - ArtifactRepository repository) { + ArtifactRepository repository, + LinkedHashMap> candidates) { if (metadata != null && metadata.getPath() != null && Files.isRegularFile(metadata.getPath())) { try { Map options = Collections.singletonMap(MetadataReader.IS_STRICT, Boolean.FALSE); @@ -199,7 +214,9 @@ private PluginPrefixResult resolveFromRepository( if (plugins != null) { for (org.apache.maven.artifact.repository.metadata.Plugin plugin : plugins) { - if (request.getPrefix().equals(plugin.getPrefix())) { + if (request.getPrefix().equals(plugin.getPrefix()) + && (candidates.get(pluginGroup) == null + || candidates.get(pluginGroup).contains(plugin.getArtifactId()))) { return new DefaultPluginPrefixResult(pluginGroup, plugin.getArtifactId(), repository); } }