Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down Expand Up @@ -156,10 +157,14 @@ private ClassRealm createRealm(
Set<String> artifactIds = new LinkedHashSet<>();

List<ClassRealmConstituent> constituents = new ArrayList<>();
List<Artifact> 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));
Expand Down Expand Up @@ -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<String> packages =
coreOverrides.stream().map(Artifact::getGroupId).collect(Collectors.toSet());
for (String pkg : packages) {
classRealm.importFrom(overrideClassRealm, pkg);
}
}

Set<String> includedIds = populateRealm(classRealm, constituents);

if (logger.isDebugEnabled()) {
Expand Down Expand Up @@ -229,8 +252,13 @@ public ClassRealm createExtensionRealm(Plugin plugin, List<Artifact> 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(
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -53,6 +53,21 @@ Artifact handlers are required by the dependency resolution mechanism.
</configuration>
</component>

<!--
| core override JAR
|-->
<component>
<role>org.apache.maven.artifact.handler.ArtifactHandler</role>
<role-hint>core-override-jar</role-hint>
<implementation>org.apache.maven.artifact.handler.DefaultArtifactHandler</implementation>
<configuration>
<type>core-override-jar</type>
<extension>jar</extension>
<language>java</language>
<addedToClasspath>true</addedToClasspath>
</configuration>
</component>

<!--
| EJB
|-->
Expand Down