diff --git a/compat/maven-settings-builder/pom.xml b/compat/maven-settings-builder/pom.xml
index dac986044776..64f1e0e90b00 100644
--- a/compat/maven-settings-builder/pom.xml
+++ b/compat/maven-settings-builder/pom.xml
@@ -91,6 +91,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..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
@@ -22,14 +22,22 @@
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;
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;
@@ -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;
+ }
}