From 5b9f8707dccba6528209fceb7ede9ae70c74e0da Mon Sep 17 00:00:00 2001 From: Tamas Cservenak Date: Thu, 26 Mar 2026 13:16:36 +0100 Subject: [PATCH] EXPERIMENT: Core Override Types and support This is a hack, that allows a plugins to _override_ Maven Core exported artifact and replace it with "own", for example to use Slf4j 2.x instead of core exported 1.x one. --- .../classrealm/DefaultClassRealmManager.java | 30 ++++++++++++++++++- .../META-INF/plexus/artifact-handlers.xml | 15 ++++++++++ 2 files changed, 44 insertions(+), 1 deletion(-) diff --git a/maven-core/src/main/java/org/apache/maven/classrealm/DefaultClassRealmManager.java b/maven-core/src/main/java/org/apache/maven/classrealm/DefaultClassRealmManager.java index 2bc1652af3a4..3621215440fe 100644 --- a/maven-core/src/main/java/org/apache/maven/classrealm/DefaultClassRealmManager.java +++ b/maven-core/src/main/java/org/apache/maven/classrealm/DefaultClassRealmManager.java @@ -33,6 +33,7 @@ import java.util.Random; import java.util.Set; import java.util.TreeMap; +import java.util.stream.Collectors; import org.apache.maven.artifact.ArtifactUtils; import org.apache.maven.classrealm.ClassRealmRequest.RealmType; @@ -156,10 +157,14 @@ private ClassRealm createRealm( Set artifactIds = new LinkedHashSet<>(); List constituents = new ArrayList<>(); + List coreOverrides = new ArrayList<>(); if (artifacts != null) { for (Artifact artifact : artifacts) { if (!isProvidedArtifact(artifact)) { + if (isCoreOverrideArtifact(artifact)) { + coreOverrides.add(artifact); + } artifactIds.add(getId(artifact)); if (artifact.getFile() != null) { constituents.add(new ArtifactClassRealmConstituent(artifact)); @@ -190,6 +195,24 @@ private ClassRealm createRealm( wireRealm(classRealm, parentImports, foreignImports); + if (!coreOverrides.isEmpty()) { + ClassRealm overrideClassRealm = newRealm(baseRealmId + "-core-override"); + for (Artifact coreOverride : coreOverrides) { + try { + overrideClassRealm.addURL(coreOverride.getFile().toURI().toURL()); + } catch (MalformedURLException e) { + // Not going to happen + logger.error(e.getMessage(), e); + } + } + // collect Gs (and assume packages == G for the experiment sake) + Set packages = + coreOverrides.stream().map(Artifact::getGroupId).collect(Collectors.toSet()); + for (String pkg : packages) { + classRealm.importFrom(overrideClassRealm, pkg); + } + } + Set includedIds = populateRealm(classRealm, constituents); if (logger.isDebugEnabled()) { @@ -229,8 +252,13 @@ public ClassRealm createExtensionRealm(Plugin plugin, List artifacts) return createRealm(getKey(plugin, true), RealmType.Extension, parent, null, foreignImports, artifacts); } + private boolean isCoreOverrideArtifact(Artifact artifact) { + return "core-override-jar".equals(artifact.getProperties().get("type")); + } + private boolean isProvidedArtifact(Artifact artifact) { - return providedArtifacts.contains(artifact.getGroupId() + ":" + artifact.getArtifactId()); + return !isCoreOverrideArtifact(artifact) + && providedArtifacts.contains(artifact.getGroupId() + ":" + artifact.getArtifactId()); } public ClassRealm createPluginRealm( diff --git a/maven-core/src/main/resources/META-INF/plexus/artifact-handlers.xml b/maven-core/src/main/resources/META-INF/plexus/artifact-handlers.xml index 2f26ce2e29ee..a172fb3b96e8 100644 --- a/maven-core/src/main/resources/META-INF/plexus/artifact-handlers.xml +++ b/maven-core/src/main/resources/META-INF/plexus/artifact-handlers.xml @@ -53,6 +53,21 @@ Artifact handlers are required by the dependency resolution mechanism. + + + org.apache.maven.artifact.handler.ArtifactHandler + core-override-jar + org.apache.maven.artifact.handler.DefaultArtifactHandler + + core-override-jar + jar + java + true + + +