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..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 @@ -23,17 +23,17 @@ import javax.inject.Singleton; import java.io.IOException; +import java.nio.file.Files; 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 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 +65,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 +78,58 @@ public DefaultPluginPrefixResolver( public PluginPrefixResult resolve(PluginPrefixRequest request) throws NoPluginFoundForPrefixException { logger.debug("Resolving plugin prefix {} from {}", request.getPrefix(), request.getPluginGroups()); - PluginPrefixResult result = resolveFromProject(request); + // 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) { + 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())); + } + } + } + request.getPluginGroups().forEach(g -> candidates.put(g, null)); + PluginPrefixResult result = resolveFromRepository(request, candidates); 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(), + new ArrayList<>(candidates.keySet()), + 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, LinkedHashMap> candidates) { RequestTrace trace = RequestTrace.newChild(null, request); List requests = new ArrayList<>(); - for (String pluginGroup : request.getPluginGroups()) { + for (String pluginGroup : candidates.keySet()) { org.eclipse.aether.metadata.Metadata metadata = new DefaultMetadata(pluginGroup, "maven-metadata.xml", DefaultMetadata.Nature.RELEASE_OR_SNAPSHOT); @@ -170,7 +145,7 @@ private PluginPrefixResult resolveFromRepository(PluginPrefixRequest request) { 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; @@ -184,7 +159,7 @@ private PluginPrefixResult resolveFromRepository(PluginPrefixRequest request) { results = repositorySystem.resolveMetadata(session, requests); - return processResults(request, trace, results, null); + return processResults(request, trace, results, null, candidates); } return null; @@ -194,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(); @@ -205,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; @@ -225,18 +201,22 @@ private PluginPrefixResult resolveFromRepository( RequestTrace trace, String pluginGroup, org.eclipse.aether.metadata.Metadata metadata, - ArtifactRepository repository) { - if (metadata != null && metadata.getFile() != null && metadata.getFile().isFile()) { + ArtifactRepository repository, + LinkedHashMap> candidates) { + 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(); 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); } }