From c9a8cfcd2087c4c27b3b6bf4afd6a21881c83985 Mon Sep 17 00:00:00 2001 From: Tamas Cservenak Date: Thu, 19 Dec 2024 13:01:54 +0100 Subject: [PATCH 1/2] [MNG-8451] Core inject depMgt for plugin resolution --- https://issues.apache.org/jira/browse/MNG-8451 --- compat/maven-settings-builder/pom.xml | 1 + .../internal/CoreExportsProvider.java | 1 + .../DefaultPluginDependenciesResolver.java | 83 ++++++++++++++++++- 3 files changed, 84 insertions(+), 1 deletion(-) diff --git a/compat/maven-settings-builder/pom.xml b/compat/maven-settings-builder/pom.xml index 4d510935e30c..24386150903e 100644 --- a/compat/maven-settings-builder/pom.xml +++ b/compat/maven-settings-builder/pom.xml @@ -93,6 +93,7 @@ under the License. japicmp-maven-plugin + true diff --git a/impl/maven-core/src/main/java/org/apache/maven/extension/internal/CoreExportsProvider.java b/impl/maven-core/src/main/java/org/apache/maven/extension/internal/CoreExportsProvider.java index 0f0b510482db..10e57672f542 100644 --- a/impl/maven-core/src/main/java/org/apache/maven/extension/internal/CoreExportsProvider.java +++ b/impl/maven-core/src/main/java/org/apache/maven/extension/internal/CoreExportsProvider.java @@ -45,6 +45,7 @@ public CoreExportsProvider(CoreExports exports) { this.exports = Objects.requireNonNull(exports); } + @Override public CoreExports get() { return exports; } diff --git a/impl/maven-core/src/main/java/org/apache/maven/plugin/internal/DefaultPluginDependenciesResolver.java b/impl/maven-core/src/main/java/org/apache/maven/plugin/internal/DefaultPluginDependenciesResolver.java index 16aee3db3130..138e8b28a7cb 100644 --- a/impl/maven-core/src/main/java/org/apache/maven/plugin/internal/DefaultPluginDependenciesResolver.java +++ b/impl/maven-core/src/main/java/org/apache/maven/plugin/internal/DefaultPluginDependenciesResolver.java @@ -22,9 +22,15 @@ import javax.inject.Named; import javax.inject.Singleton; +import java.io.IOException; +import java.io.InputStream; +import java.util.Collections; +import java.util.HashMap; import java.util.LinkedHashMap; import java.util.List; import java.util.Map; +import java.util.Objects; +import java.util.Properties; import java.util.stream.Collectors; import java.util.stream.Stream; @@ -33,6 +39,8 @@ import org.apache.maven.impl.InternalSession; import org.apache.maven.impl.RequestTraceHelper; import org.apache.maven.impl.resolver.RelocatedArtifact; +import org.apache.maven.api.annotations.Nullable; +import org.apache.maven.extension.internal.CoreExports; import org.apache.maven.model.Dependency; import org.apache.maven.model.Plugin; import org.apache.maven.plugin.PluginResolutionException; @@ -80,11 +88,16 @@ public class DefaultPluginDependenciesResolver implements PluginDependenciesReso private final List dependenciesValidators; + private final CoreExports coreExports; + @Inject public DefaultPluginDependenciesResolver( - RepositorySystem repoSystem, List dependenciesValidators) { + RepositorySystem repoSystem, + List dependenciesValidators, + CoreExports coreExports) { this.repoSystem = repoSystem; this.dependenciesValidators = dependenciesValidators; + this.coreExports = coreExports; } private Artifact toArtifact(Plugin plugin, RepositorySystemSession session) { @@ -210,12 +223,29 @@ private DependencyResult resolveInternal( request.setRequestContext(REPOSITORY_CONTEXT); request.setRepositories(repositories); request.setRoot(new org.eclipse.aether.graph.Dependency(pluginArtifact, null)); + Map core = getCoreExportsAsDependencies(session); + request.setManagedDependencies(core.values().stream().toList()); for (Dependency dependency : plugin.getDependencies()) { org.eclipse.aether.graph.Dependency pluginDep = RepositoryUtils.toDependency(dependency, session.getArtifactTypeRegistry()); if (!DependencyScope.SYSTEM.is(pluginDep.getScope())) { pluginDep = pluginDep.setScope(DependencyScope.RUNTIME.id()); } + org.eclipse.aether.graph.Dependency managedDep = + core.get(pluginDep.getArtifact().getGroupId() + ":" + + pluginDep.getArtifact().getArtifactId()); + if (managedDep != null) { + // align version if needed + if (!Objects.equals( + pluginDep.getArtifact().getVersion(), + managedDep.getArtifact().getVersion())) { + pluginDep = pluginDep.setArtifact(pluginDep + .getArtifact() + .setVersion(managedDep.getArtifact().getVersion())); + } + // align scope + pluginDep = pluginDep.setScope(managedDep.getScope()); + } request.addDependency(pluginDep); } @@ -246,4 +276,55 @@ private DependencyResult resolveInternal( RequestTraceHelper.exit(trace); } } + + private static final String CACHE_KEY = + DefaultPluginDependenciesResolver.class.getName() + "#getCoreExportsAsDependencies"; + + @SuppressWarnings("unchecked") + private Map getCoreExportsAsDependencies( + RepositorySystemSession session) { + return (Map) + session.getData().computeIfAbsent(CACHE_KEY, () -> { + HashMap core = new HashMap<>(); + ClassLoader classLoader = coreExports.getExportedPackages().get("org.apache.maven.*"); + for (String coreArtifact : coreExports.getExportedArtifacts()) { + String[] split = coreArtifact.split(":"); + if (split.length == 2) { + String groupId = split[0]; + String artifactId = split[1]; + String version = discoverArtifactVersion(classLoader, groupId, artifactId, null); + if (version != null) { + core.put( + groupId + ":" + artifactId, + new org.eclipse.aether.graph.Dependency( + new DefaultArtifact(groupId + ":" + artifactId + ":" + version), + DependencyScope.PROVIDED.id())); + } + } + } + return Collections.unmodifiableMap(core); + }); + } + + private static String discoverArtifactVersion( + ClassLoader classLoader, String groupId, String artifactId, @Nullable String defVal) { + String version = defVal; + String resource = "META-INF/maven/" + groupId + "/" + artifactId + "/pom.properties"; + final Properties props = new Properties(); + try (InputStream is = classLoader.getResourceAsStream(resource)) { + if (is != null) { + props.load(is); + } + version = props.getProperty("version"); + } catch (IOException e) { + // fall through + } + if (version != null) { + version = version.trim(); + if (version.startsWith("${")) { + version = defVal; + } + } + return version; + } } From f4d2c9d870c234cca78b3ec40b36003af32ef286 Mon Sep 17 00:00:00 2001 From: Tamas Cservenak Date: Sat, 8 Feb 2025 17:48:58 +0100 Subject: [PATCH 2/2] Reformat --- .../plugin/internal/DefaultPluginDependenciesResolver.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/impl/maven-core/src/main/java/org/apache/maven/plugin/internal/DefaultPluginDependenciesResolver.java b/impl/maven-core/src/main/java/org/apache/maven/plugin/internal/DefaultPluginDependenciesResolver.java index 138e8b28a7cb..6656c7b8b5c7 100644 --- a/impl/maven-core/src/main/java/org/apache/maven/plugin/internal/DefaultPluginDependenciesResolver.java +++ b/impl/maven-core/src/main/java/org/apache/maven/plugin/internal/DefaultPluginDependenciesResolver.java @@ -36,11 +36,11 @@ import org.apache.maven.RepositoryUtils; import org.apache.maven.api.DependencyScope; +import org.apache.maven.api.annotations.Nullable; +import org.apache.maven.extension.internal.CoreExports; import org.apache.maven.impl.InternalSession; import org.apache.maven.impl.RequestTraceHelper; import org.apache.maven.impl.resolver.RelocatedArtifact; -import org.apache.maven.api.annotations.Nullable; -import org.apache.maven.extension.internal.CoreExports; import org.apache.maven.model.Dependency; import org.apache.maven.model.Plugin; import org.apache.maven.plugin.PluginResolutionException;