From b7088a34edd8cd34ab3b376d9baf90bdb6f8dc00 Mon Sep 17 00:00:00 2001 From: Igor Fedorenko Date: Tue, 10 Mar 2015 09:40:36 -0400 Subject: [PATCH] MNG-5783 fixed slf4j is missing from ${plugin.artifacts} Some plugins, e.g., cobertura-maven-plugin, use ${plugin.artifacts} to setup classpath of externally launched jvms and they expect slf4j to be available among plugin dependencies. At the same time slf4j is already part of maven core runtime and it needs to be filtered out from plugin and build extension realms to avoid duplicate classes on classpath. The fix is to move core artifact filtering from plugin dependency resolver to class realm manager. This way ${plugin.artifacts} still includes all compile/runtime scoped plugin dependencies but runtime classpath only has plugin unique artifacts. Signed-off-by: Igor Fedorenko --- .../classrealm/DefaultClassRealmManager.java | 22 ++++++++++++++++--- .../DefaultPluginDependenciesResolver.java | 10 +-------- 2 files changed, 20 insertions(+), 12 deletions(-) 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 38e117ff82..69ee04a9d4 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 @@ -83,6 +83,12 @@ public class DefaultClassRealmManager private final ClassRealm mavenApiRealm; + /** + * Patterns of artifacts provided by maven core and exported via maven api realm. These artifacts are filtered from + * plugin and build extensions realms to avoid presence of duplicate and possibly conflicting classes on classpath. + */ + private final Set providedArtifacts; + @Inject public DefaultClassRealmManager( Logger logger, PlexusContainer container, List delegates, CoreExportsProvider exports ) @@ -97,6 +103,8 @@ public DefaultClassRealmManager( Logger logger, PlexusContainer container, this.mavenApiRealm = createRealm( API_REALMID, RealmType.Core, null /* parent */, null /* parentImports */, foreignImports, null /* artifacts */ ); + + this.providedArtifacts = exports.get().getExportedArtifacts(); } private ClassRealm newRealm( String id ) @@ -156,10 +164,13 @@ private ClassRealm createRealm( String baseRealmId, RealmType type, ClassLoader { for ( Artifact artifact : artifacts ) { - artifactIds.add( getId( artifact ) ); - if ( artifact.getFile() != null ) + if ( !isProvidedArtifact( artifact ) ) { - constituents.add( new ArtifactClassRealmConstituent( artifact ) ); + artifactIds.add( getId( artifact ) ); + if ( artifact.getFile() != null ) + { + constituents.add( new ArtifactClassRealmConstituent( artifact ) ); + } } } } @@ -245,6 +256,11 @@ public ClassRealm createExtensionRealm( Plugin plugin, List artifacts return createRealm( getKey( plugin, true ), RealmType.Extension, parent, null, foreignImports, artifacts ); } + private boolean isProvidedArtifact( Artifact artifact ) + { + return providedArtifacts.contains( artifact.getGroupId() + ":" + artifact.getArtifactId() ); + } + public ClassRealm createPluginRealm( Plugin plugin, ClassLoader parent, List parentImports, Map foreignImports, List artifacts ) { diff --git a/maven-core/src/main/java/org/apache/maven/plugin/internal/DefaultPluginDependenciesResolver.java b/maven-core/src/main/java/org/apache/maven/plugin/internal/DefaultPluginDependenciesResolver.java index 9a9a7b8d84..5b0c271235 100644 --- a/maven-core/src/main/java/org/apache/maven/plugin/internal/DefaultPluginDependenciesResolver.java +++ b/maven-core/src/main/java/org/apache/maven/plugin/internal/DefaultPluginDependenciesResolver.java @@ -23,7 +23,6 @@ import java.util.List; import java.util.Map; -import org.apache.maven.ArtifactFilterManager; import org.apache.maven.RepositoryUtils; import org.apache.maven.model.Dependency; import org.apache.maven.model.Plugin; @@ -54,7 +53,6 @@ import org.eclipse.aether.resolution.DependencyResolutionException; import org.eclipse.aether.util.artifact.JavaScopes; import org.eclipse.aether.util.filter.AndDependencyFilter; -import org.eclipse.aether.util.filter.ExclusionsDependencyFilter; import org.eclipse.aether.util.filter.ScopeDependencyFilter; import org.eclipse.aether.util.graph.selector.AndDependencySelector; import org.eclipse.aether.util.graph.transformer.ChainedDependencyGraphTransformer; @@ -78,9 +76,6 @@ public class DefaultPluginDependenciesResolver @Requirement private Logger logger; - @Requirement - private ArtifactFilterManager artifactFilterManager; - @Requirement private RepositorySystem repoSystem; @@ -151,10 +146,7 @@ public DependencyNode resolve( Plugin plugin, Artifact pluginArtifact, Dependenc List repositories, RepositorySystemSession session ) throws PluginResolutionException { - DependencyFilter resolutionFilter = - new ExclusionsDependencyFilter( artifactFilterManager.getCoreArtifactExcludes() ); - resolutionFilter = AndDependencyFilter.newInstance( resolutionFilter, dependencyFilter ); - return resolveInternal( plugin, pluginArtifact, resolutionFilter, new PlexusUtilsInjector(), repositories, + return resolveInternal( plugin, pluginArtifact, dependencyFilter, new PlexusUtilsInjector(), repositories, session ); }