Index: maven-core/src/main/java/org/apache/maven/DefaultProjectDependenciesResolver.java =================================================================== --- maven-core/src/main/java/org/apache/maven/DefaultProjectDependenciesResolver.java (revision 1213039) +++ maven-core/src/main/java/org/apache/maven/DefaultProjectDependenciesResolver.java (working copy) @@ -103,37 +103,6 @@ return resolved; } - /* - - Logic for transitive global exclusions - - List exclusions = new ArrayList(); - - for ( Dependency d : project.getDependencies() ) - { - if ( d.getExclusions() != null ) - { - for ( Exclusion e : d.getExclusions() ) - { - exclusions.add( e.getGroupId() + ":" + e.getArtifactId() ); - } - } - } - - ArtifactFilter scopeFilter = new ScopeArtifactFilter( scope ); - - ArtifactFilter filter; - - if ( ! exclusions.isEmpty() ) - { - filter = new AndArtifactFilter( Arrays.asList( new ArtifactFilter[]{ new ExcludesArtifactFilter( exclusions ), scopeFilter } ) ); - } - else - { - filter = scopeFilter; - } - */ - CumulativeScopeArtifactFilter resolutionScopeFilter = new CumulativeScopeArtifactFilter( scopesToResolve ); CumulativeScopeArtifactFilter collectionScopeFilter = new CumulativeScopeArtifactFilter( scopesToCollect ); Index: maven-core/src/main/java/org/apache/maven/lifecycle/internal/LifecycleDependencyResolver.java =================================================================== --- maven-core/src/main/java/org/apache/maven/lifecycle/internal/LifecycleDependencyResolver.java (revision 1213039) +++ maven-core/src/main/java/org/apache/maven/lifecycle/internal/LifecycleDependencyResolver.java (working copy) @@ -31,11 +31,17 @@ import org.codehaus.plexus.component.annotations.Component; import org.codehaus.plexus.component.annotations.Requirement; import org.codehaus.plexus.logging.Logger; +import org.sonatype.aether.RepositorySystemSession; +import org.sonatype.aether.collection.DependencySelector; import org.sonatype.aether.graph.Dependency; import org.sonatype.aether.graph.DependencyFilter; import org.sonatype.aether.graph.DependencyNode; +import org.sonatype.aether.util.DefaultRepositorySystemSession; import org.sonatype.aether.util.filter.AndDependencyFilter; import org.sonatype.aether.util.filter.ScopeDependencyFilter; +import org.sonatype.aether.util.graph.selector.AndDependencySelector; +import org.sonatype.aether.util.graph.selector.ExclusionDependencySelector; +import com.sun.corba.se.spi.legacy.connection.GetEndPointInfoAgainException; import java.util.*; @@ -114,6 +120,8 @@ } } + setExclusionsDependencySelector(session, project.getExclusions()); + Set artifacts = getDependencies( project, scopesToCollect, scopesToResolve, session, aggregating, projectArtifacts ); @@ -145,6 +153,27 @@ } } + private void setExclusionsDependencySelector( MavenSession session, List exclusions ) + { + final Set globalExclusions = new HashSet(); + for ( org.apache.maven.model.Exclusion e : exclusions ) + { + globalExclusions.add(new org.sonatype.aether.graph.Exclusion(e.getGroupId(), e.getArtifactId(), "*", "*")); + } + final DefaultRepositorySystemSession repositorySession = (DefaultRepositorySystemSession) session + .getRepositorySession(); + final DependencySelector selector = session.getRepositorySession().getDependencySelector(); + if ( selector != null ) + { + repositorySession.setDependencySelector(AndDependencySelector.newInstance(selector, + new ExclusionDependencySelector(globalExclusions))); + } + else + { + repositorySession.setDependencySelector(new ExclusionDependencySelector(globalExclusions)); + } + } + private Set getDependencies( MavenProject project, Collection scopesToCollect, Collection scopesToResolve, MavenSession session, boolean aggregating, Set projectArtifacts ) Index: maven-core/src/main/java/org/apache/maven/project/MavenProject.java =================================================================== --- maven-core/src/main/java/org/apache/maven/project/MavenProject.java (revision 1213039) +++ maven-core/src/main/java/org/apache/maven/project/MavenProject.java (working copy) @@ -46,6 +46,7 @@ import org.apache.maven.model.DependencyManagement; import org.apache.maven.model.Developer; import org.apache.maven.model.DistributionManagement; +import org.apache.maven.model.Exclusion; import org.apache.maven.model.Extension; import org.apache.maven.model.IssueManagement; import org.apache.maven.model.License; @@ -425,6 +426,16 @@ return getModel().getDependencies(); } + public void setExclusions( List exclusions ) + { + getModel().setExclusions(exclusions); + } + + public List getExclusions() + { + return getModel().getExclusions(); + } + public DependencyManagement getDependencyManagement() { return getModel().getDependencyManagement(); Index: maven-model-builder/src/main/java/org/apache/maven/model/validation/DefaultModelValidator.java =================================================================== --- maven-model-builder/src/main/java/org/apache/maven/model/validation/DefaultModelValidator.java (revision 1213039) +++ maven-model-builder/src/main/java/org/apache/maven/model/validation/DefaultModelValidator.java (working copy) @@ -244,6 +244,7 @@ } validateStringNotEmpty( "version", problems, Severity.ERROR, model.getVersion(), model ); + validateEffectiveExclusions(problems, model.getExclusions(), false, request); Severity errOn30 = getSeverity( request, ModelBuildingRequest.VALIDATION_LEVEL_MAVEN_3_0 ); @@ -446,6 +447,36 @@ } } + private void validateEffectiveExclusions( ModelProblemCollector problems, List exclusions, + boolean management, ModelBuildingRequest request ) + { + String prefix = "exclusions.exclusion."; + + for ( Exclusion e : exclusions ) + { + validateEffectiveExclusion(problems, e, prefix, getManagementKey(e)); + } + } + + private void validateEffectiveExclusion( ModelProblemCollector problems, Exclusion exclusion, String prefix, + String managementKey ) + { + validateId(prefix + "groupId", problems, Severity.WARNING, exclusion.getGroupId(), managementKey, exclusion); + + validateId(prefix + "artifactId", problems, Severity.WARNING, exclusion.getArtifactId(), managementKey, exclusion); + } + + /** + * @param e + * the Exclusion object + * @return the management key as groupId:artifactId + * @see Dependency#getManagementKey() + */ + private String getManagementKey( Exclusion e ) + { + return e.getGroupId() + ":" + e.getArtifactId(); + } + private void validateEffectivePluginDependencies( ModelProblemCollector problems, Plugin plugin, ModelBuildingRequest request ) { @@ -525,11 +556,7 @@ { for ( Exclusion exclusion : d.getExclusions() ) { - validateId( prefix + "exclusions.exclusion.groupId", problems, Severity.WARNING, - exclusion.getGroupId(), d.getManagementKey(), exclusion ); - - validateId( prefix + "exclusions.exclusion.artifactId", problems, Severity.WARNING, - exclusion.getArtifactId(), d.getManagementKey(), exclusion ); + validateEffectiveExclusion(problems, exclusion, prefix + "exclusions.exclusion.", d.getManagementKey()); } } } Index: maven-model/src/main/mdo/maven.mdo =================================================================== --- maven-model/src/main/mdo/maven.mdo (revision 1213039) +++ maven-model/src/main/mdo/maven.mdo (working copy) @@ -707,6 +707,16 @@ * + + exclusions + 4.0.0 + Lists a set of artifacts that should be excluded from this project's + artifact list when it comes to calculating transitive dependencies. + + Exclusion + * + + repositories 4.0.0