You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@maven.apache.org by rf...@apache.org on 2021/05/22 11:32:29 UTC

[maven-dependency-tree] 04/04: Adjust Exception Fix @since

This is an automated email from the ASF dual-hosted git repository.

rfscholte pushed a commit to branch MSHARED-788
in repository https://gitbox.apache.org/repos/asf/maven-dependency-tree.git

commit 960831889c24110d0ab3dfcae0f1d5d43269b401
Author: rfscholte <rf...@apache.org>
AuthorDate: Sat May 22 13:32:07 2021 +0200

    Adjust Exception
    Fix @since
---
 .../graph/DependencyCollectorBuilder.java          |  4 +-
 .../graph/DependencyCollectorBuilderException.java | 54 ++++++++++++++++
 .../DefaultDependencyCollectorBuilder.java         |  8 +--
 .../graph/internal/ExceptionHandler.java           | 30 +++++++++
 .../shared/dependency/graph/internal/Invoker.java  | 74 +++++++---------------
 .../Maven31DependencyCollectorBuilder.java         | 69 ++++++++++++++------
 .../internal/Maven31DependencyGraphBuilder.java    | 20 +++++-
 .../internal/Maven3DependencyCollectorBuilder.java | 60 ++++++++++++++----
 .../internal/Maven3DependencyGraphBuilder.java     |  2 +-
 .../graph/internal/maven30/ConflictIdSorter.java   |  2 +-
 .../graph/internal/maven30/ConflictResolver.java   |  2 +-
 .../maven30/ExclusionDependencySelector.java       |  2 +-
 .../graph/internal/maven30/JavaScopeDeriver.java   |  2 +-
 .../graph/internal/maven30/JavaScopeSelector.java  |  2 +-
 .../Maven3DirectScopeDependencySelector.java       |  2 +-
 .../internal/maven30/NearestVersionSelector.java   |  2 +-
 .../maven30/SimpleOptionalitySelector.java         |  2 +-
 .../Maven31DirectScopeDependencySelector.java      |  2 +-
 18 files changed, 233 insertions(+), 106 deletions(-)

diff --git a/src/main/java/org/apache/maven/shared/dependency/graph/DependencyCollectorBuilder.java b/src/main/java/org/apache/maven/shared/dependency/graph/DependencyCollectorBuilder.java
index 8865fad..43cfb40 100644
--- a/src/main/java/org/apache/maven/shared/dependency/graph/DependencyCollectorBuilder.java
+++ b/src/main/java/org/apache/maven/shared/dependency/graph/DependencyCollectorBuilder.java
@@ -28,7 +28,7 @@ import org.apache.maven.project.ProjectBuildingRequest;
  * particular Aether implementations.
  * 
  * @author Gabriel Belingueres
- * @since 3.0.2
+ * @since 3.1.0
  */
 public interface DependencyCollectorBuilder
 {
@@ -45,6 +45,6 @@ public interface DependencyCollectorBuilder
      */
     DependencyNode collectDependencyGraph( ArtifactRepository localRepository, ProjectBuildingRequest buildingRequest,
                                          ArtifactFilter filter )
-        throws DependencyGraphBuilderException;
+        throws DependencyCollectorBuilderException;
 
 }
diff --git a/src/main/java/org/apache/maven/shared/dependency/graph/DependencyCollectorBuilderException.java b/src/main/java/org/apache/maven/shared/dependency/graph/DependencyCollectorBuilderException.java
new file mode 100644
index 0000000..866213d
--- /dev/null
+++ b/src/main/java/org/apache/maven/shared/dependency/graph/DependencyCollectorBuilderException.java
@@ -0,0 +1,54 @@
+package org.apache.maven.shared.dependency.graph;
+
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *  http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+/**
+ * Indicates an issue with the DependencyCollectorBuilder
+ * 
+ * @author Robert Scholte
+ * @since 3.1.0
+ */
+public class DependencyCollectorBuilderException
+    extends Exception
+{
+    /**
+     * 
+     */
+    private static final long serialVersionUID = 1305852327231950979L;
+
+    // constructors -----------------------------------------------------------
+
+    /**
+     * @param message   Message indicating why dependency graph could not be resolved.
+     */
+    public DependencyCollectorBuilderException( String message )
+    {
+        super( message );
+    }
+
+    /**
+     * @param message   Message indicating why dependency graph could not be resolved.
+     * @param cause     Throwable indicating at which point the graph failed to be resolved.
+     */
+    public DependencyCollectorBuilderException( String message, Throwable cause )
+    {
+        super( message, cause );
+    }
+}
diff --git a/src/main/java/org/apache/maven/shared/dependency/graph/internal/DefaultDependencyCollectorBuilder.java b/src/main/java/org/apache/maven/shared/dependency/graph/internal/DefaultDependencyCollectorBuilder.java
index ff420b9..e29cc9d 100644
--- a/src/main/java/org/apache/maven/shared/dependency/graph/internal/DefaultDependencyCollectorBuilder.java
+++ b/src/main/java/org/apache/maven/shared/dependency/graph/internal/DefaultDependencyCollectorBuilder.java
@@ -24,7 +24,7 @@ import org.apache.maven.artifact.resolver.filter.ArtifactFilter;
 import org.apache.maven.project.MavenProject;
 import org.apache.maven.project.ProjectBuildingRequest;
 import org.apache.maven.shared.dependency.graph.DependencyCollectorBuilder;
-import org.apache.maven.shared.dependency.graph.DependencyGraphBuilderException;
+import org.apache.maven.shared.dependency.graph.DependencyCollectorBuilderException;
 import org.apache.maven.shared.dependency.graph.DependencyNode;
 import org.codehaus.plexus.PlexusConstants;
 import org.codehaus.plexus.PlexusContainer;
@@ -40,7 +40,7 @@ import org.codehaus.plexus.personality.plexus.lifecycle.phase.Contextualizable;
  * 3.1+ particular Aether implementations.
  * 
  * @author Gabriel Belingueres
- * @since 3.0.2
+ * @since 3.1.0
  */
 @Component( role = DependencyCollectorBuilder.class )
 public class DefaultDependencyCollectorBuilder
@@ -52,7 +52,7 @@ public class DefaultDependencyCollectorBuilder
     @Override
     public DependencyNode collectDependencyGraph( ArtifactRepository localRepository,
                                                 ProjectBuildingRequest buildingRequest, ArtifactFilter filter )
-        throws DependencyGraphBuilderException
+        throws DependencyCollectorBuilderException
     {
         try
         {
@@ -74,7 +74,7 @@ public class DefaultDependencyCollectorBuilder
         }
         catch ( ComponentLookupException e )
         {
-            throw new DependencyGraphBuilderException( e.getMessage(), e );
+            throw new DependencyCollectorBuilderException( e.getMessage(), e );
         }
     }
 
diff --git a/src/main/java/org/apache/maven/shared/dependency/graph/internal/ExceptionHandler.java b/src/main/java/org/apache/maven/shared/dependency/graph/internal/ExceptionHandler.java
new file mode 100644
index 0000000..2dd86cc
--- /dev/null
+++ b/src/main/java/org/apache/maven/shared/dependency/graph/internal/ExceptionHandler.java
@@ -0,0 +1,30 @@
+package org.apache.maven.shared.dependency.graph.internal;
+
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *  http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+/**
+ * 
+ * 
+ * @param <T>
+ */
+interface ExceptionHandler<T extends Exception>
+{
+    T create( String message, Exception exception );
+}
diff --git a/src/main/java/org/apache/maven/shared/dependency/graph/internal/Invoker.java b/src/main/java/org/apache/maven/shared/dependency/graph/internal/Invoker.java
index cabfe37..8cc8851 100644
--- a/src/main/java/org/apache/maven/shared/dependency/graph/internal/Invoker.java
+++ b/src/main/java/org/apache/maven/shared/dependency/graph/internal/Invoker.java
@@ -19,8 +19,6 @@ package org.apache.maven.shared.dependency.graph.internal;
  * under the License.
  */
 
-import java.lang.reflect.InvocationTargetException;
-
 import org.apache.maven.shared.dependency.graph.DependencyGraphBuilderException;
 
 /**
@@ -33,34 +31,27 @@ final class Invoker
         // do not instantiate
     }
 
-    public static Object invoke( Object object, String method )
-        throws DependencyGraphBuilderException
+    static <T extends Exception> Object invoke( Object object, String method, ExceptionHandler<T> exceptionHandler )
+        throws T
     {
-        return invoke( object.getClass(), object, method );
+        return invoke( object.getClass(), object, method, exceptionHandler );
     }
 
-    public static Object invoke( Class<?> objectClazz, Object object, String method )
-        throws DependencyGraphBuilderException
+    static <T extends Exception> Object invoke( Class<?> objectClazz, Object object, String method,
+                                                ExceptionHandler<T> exceptionHandler )
+        throws T
     {
         try
         {
             return objectClazz.getMethod( method ).invoke( object );
         }
-        catch ( IllegalAccessException e )
-        {
-            throw new DependencyGraphBuilderException( e.getMessage(), e );
-        }
-        catch ( InvocationTargetException e )
-        {
-            throw new DependencyGraphBuilderException( e.getMessage(), e );
-        }
-        catch ( NoSuchMethodException e )
+        catch ( ReflectiveOperationException e )
         {
-            throw new DependencyGraphBuilderException( e.getMessage(), e );
+            throw exceptionHandler.create( e.getMessage(), e );
         }
     }
 
-    public static Object invoke( Object object, String method, Class<?> clazz, Object arg )
+    static Object invoke( Object object, String method, Class<?> clazz, Object arg )
         throws DependencyGraphBuilderException
     {
         try
@@ -68,60 +59,39 @@ final class Invoker
             final Class<?> objectClazz = object.getClass();
             return objectClazz.getMethod( method, clazz ).invoke( object, arg );
         }
-        catch ( IllegalAccessException e )
-        {
-            throw new DependencyGraphBuilderException( e.getMessage(), e );
-        }
-        catch ( InvocationTargetException e )
-        {
-            throw new DependencyGraphBuilderException( e.getMessage(), e );
-        }
-        catch ( NoSuchMethodException e )
+        catch ( ReflectiveOperationException e )
         {
             throw new DependencyGraphBuilderException( e.getMessage(), e );
         }
     }
     
-    public static Object invoke( Class<?> objectClazz, String staticMethod, Class<?> argClazz, Object arg )
-                    throws DependencyGraphBuilderException
+    static <T extends Exception> Object invoke( Class<?> objectClazz, String staticMethod,
+                                                               Class<?> argClazz, Object arg,
+                                                               ExceptionHandler<T> exceptionHandler )
+        throws T
     {
         try
         {
             return objectClazz.getMethod( staticMethod, argClazz ).invoke( null, arg );
         }
-        catch ( IllegalAccessException e )
+        catch ( ReflectiveOperationException e )
         {
-            throw new DependencyGraphBuilderException( e.getMessage(), e );
-        }
-        catch ( InvocationTargetException e )
-        {
-            throw new DependencyGraphBuilderException( e.getMessage(), e );
-        }
-        catch ( NoSuchMethodException e )
-        {
-            throw new DependencyGraphBuilderException( e.getMessage(), e );
+            throw exceptionHandler.create( e.getMessage(), e );
         }
     }
 
-    public static Object invoke( Class<?> objectClazz, String staticMethod, Class<?> argClazz1, Class<?> argClazz2,
-                                 Object arg1, Object arg2 )
-        throws DependencyGraphBuilderException
+    static <T extends Exception> Object invoke( Class<?> objectClazz, String staticMethod, Class<?> argClazz1,
+                                                Class<?> argClazz2, Object arg1, Object arg2,
+                                                ExceptionHandler<T> exceptionHandler )
+        throws T
     {
         try
         {
             return objectClazz.getMethod( staticMethod, argClazz1, argClazz2 ).invoke( null, arg1, arg2 );
         }
-        catch ( IllegalAccessException e )
+        catch ( ReflectiveOperationException e )
         {
-            throw new DependencyGraphBuilderException( e.getMessage(), e );
-        }
-        catch ( InvocationTargetException e )
-        {
-            throw new DependencyGraphBuilderException( e.getMessage(), e );
-        }
-        catch ( NoSuchMethodException e )
-        {
-            throw new DependencyGraphBuilderException( e.getMessage(), e );
+            throw exceptionHandler.create( e.getMessage(), e );
         }
     }
 }
diff --git a/src/main/java/org/apache/maven/shared/dependency/graph/internal/Maven31DependencyCollectorBuilder.java b/src/main/java/org/apache/maven/shared/dependency/graph/internal/Maven31DependencyCollectorBuilder.java
index 62e659c..15c173d 100644
--- a/src/main/java/org/apache/maven/shared/dependency/graph/internal/Maven31DependencyCollectorBuilder.java
+++ b/src/main/java/org/apache/maven/shared/dependency/graph/internal/Maven31DependencyCollectorBuilder.java
@@ -31,7 +31,7 @@ import org.apache.maven.model.Dependency;
 import org.apache.maven.project.MavenProject;
 import org.apache.maven.project.ProjectBuildingRequest;
 import org.apache.maven.shared.dependency.graph.DependencyCollectorBuilder;
-import org.apache.maven.shared.dependency.graph.DependencyGraphBuilderException;
+import org.apache.maven.shared.dependency.graph.DependencyCollectorBuilderException;
 import org.apache.maven.shared.dependency.graph.DependencyNode;
 import org.apache.maven.shared.dependency.graph.internal.maven31.Maven31DirectScopeDependencySelector;
 import org.codehaus.plexus.component.annotations.Component;
@@ -46,6 +46,7 @@ import org.eclipse.aether.collection.DependencyCollectionException;
 import org.eclipse.aether.collection.DependencyGraphTransformer;
 import org.eclipse.aether.collection.DependencySelector;
 import org.eclipse.aether.graph.DependencyVisitor;
+import org.eclipse.aether.graph.Exclusion;
 import org.eclipse.aether.util.artifact.JavaScopes;
 import org.eclipse.aether.util.graph.manager.DependencyManagerUtils;
 import org.eclipse.aether.util.graph.selector.AndDependencySelector;
@@ -63,7 +64,7 @@ import org.eclipse.aether.version.VersionConstraint;
  * Project dependency raw dependency collector API, abstracting Maven 3.1+'s Aether implementation.
  * 
  * @author Gabriel Belingueres
- * @since 3.0.2
+ * @since 3.1.0
  */
 @Component( role = DependencyCollectorBuilder.class, hint = "maven31" )
 public class Maven31DependencyCollectorBuilder
@@ -72,11 +73,25 @@ public class Maven31DependencyCollectorBuilder
 {
     @Requirement
     private RepositorySystem repositorySystem;
+    
+    private final ExceptionHandler<DependencyCollectorBuilderException> exceptionHandler;
+    
+    public Maven31DependencyCollectorBuilder()
+    {
+        this.exceptionHandler = new ExceptionHandler<DependencyCollectorBuilderException>()
+        {
+            @Override
+            public DependencyCollectorBuilderException create( String message, Exception exception )
+            {
+                return new DependencyCollectorBuilderException( message, exception );
+            }
+        };
+    }
 
     @Override
     public DependencyNode collectDependencyGraph( ArtifactRepository localRepository,
                                                   ProjectBuildingRequest buildingRequest, ArtifactFilter filter )
-        throws DependencyGraphBuilderException
+        throws DependencyCollectorBuilderException
     {
         DefaultRepositorySystemSession session = null;
         try
@@ -87,7 +102,8 @@ public class Maven31DependencyCollectorBuilder
             List<ArtifactRepository> remoteArtifactRepositories = project.getRemoteArtifactRepositories();
 
             DefaultRepositorySystemSession repositorySession =
-                (DefaultRepositorySystemSession) Invoker.invoke( buildingRequest, "getRepositorySession" );
+                (DefaultRepositorySystemSession) Invoker.invoke( buildingRequest, "getRepositorySession",
+                                                                 exceptionHandler );
 
             session = new DefaultRepositorySystemSession( repositorySession );
 
@@ -107,13 +123,15 @@ public class Maven31DependencyCollectorBuilder
 
             org.eclipse.aether.artifact.Artifact aetherArtifact =
                 (org.eclipse.aether.artifact.Artifact) Invoker.invoke( RepositoryUtils.class, "toArtifact",
-                                                                       Artifact.class, projectArtifact );
+                                                                       Artifact.class, projectArtifact,
+                                                                       exceptionHandler );
 
             @SuppressWarnings( "unchecked" )
             List<org.eclipse.aether.repository.RemoteRepository> aetherRepos =
                 (List<org.eclipse.aether.repository.RemoteRepository>) Invoker.invoke( RepositoryUtils.class, "toRepos",
                                                                                        List.class,
-                                                                                       remoteArtifactRepositories );
+                                                                                       remoteArtifactRepositories,
+                                                                                       exceptionHandler );
 
             CollectRequest collectRequest = new CollectRequest();
             collectRequest.setRoot( new org.eclipse.aether.graph.Dependency( aetherArtifact, "" ) );
@@ -127,12 +145,6 @@ public class Maven31DependencyCollectorBuilder
 
             org.eclipse.aether.graph.DependencyNode rootNode = collectResult.getRoot();
 
-//            CloningDependencyVisitor cloner = new CloningDependencyVisitor();
-//            TreeDependencyVisitor treeVisitor = new TreeDependencyVisitor( cloner );
-//            rootNode.accept( treeVisitor );
-//
-//            rootNode = cloner.getRootNode();
-
             if ( getLogger().isDebugEnabled() )
             {
                 logTree( rootNode );
@@ -142,7 +154,7 @@ public class Maven31DependencyCollectorBuilder
         }
         catch ( DependencyCollectionException e )
         {
-            throw new DependencyGraphBuilderException( "Could not collect dependencies: " + e.getResult(), e );
+            throw new DependencyCollectorBuilderException( "Could not collect dependencies: " + e.getResult(), e );
         }
         finally
         {
@@ -180,7 +192,7 @@ public class Maven31DependencyCollectorBuilder
 
     private void collectManagedDependencyList( CollectRequest collectRequest, MavenProject project,
                                                ArtifactTypeRegistry stereotypes )
-        throws DependencyGraphBuilderException
+        throws DependencyCollectorBuilderException
     {
         if ( project.getDependencyManagement() != null )
         {
@@ -194,7 +206,7 @@ public class Maven31DependencyCollectorBuilder
 
     private void collectDependencyList( CollectRequest collectRequest, MavenProject project,
                                         org.eclipse.aether.artifact.ArtifactTypeRegistry stereotypes )
-        throws DependencyGraphBuilderException
+        throws DependencyCollectorBuilderException
     {
         for ( Dependency dependency : project.getDependencies() )
         {
@@ -206,13 +218,13 @@ public class Maven31DependencyCollectorBuilder
     // CHECKSTYLE_OFF: LineLength
     private org.eclipse.aether.graph.Dependency toAetherDependency( org.eclipse.aether.artifact.ArtifactTypeRegistry stereotypes,
                                                                     Dependency dependency )
-        throws DependencyGraphBuilderException
+        throws DependencyCollectorBuilderException
     {
         org.eclipse.aether.graph.Dependency aetherDep =
             (org.eclipse.aether.graph.Dependency) Invoker.invoke( RepositoryUtils.class, "toDependency",
                                                                   Dependency.class,
                                                                   org.eclipse.aether.artifact.ArtifactTypeRegistry.class,
-                                                                  dependency, stereotypes );
+                                                                  dependency, stereotypes, exceptionHandler );
         return aetherDep;
     }
     // CHECKSTYLE_ON: LineLength
@@ -223,15 +235,16 @@ public class Maven31DependencyCollectorBuilder
 
         try
         {
-            Artifact mavenArtifact = (Artifact) Invoker.invoke( RepositoryUtils.class, "toArtifact",
-                                                                org.eclipse.aether.artifact.Artifact.class, artifact );
+            Artifact mavenArtifact =
+                (Artifact) Invoker.invoke( RepositoryUtils.class, "toArtifact",
+                                           org.eclipse.aether.artifact.Artifact.class, artifact, exceptionHandler );
 
             mavenArtifact.setScope( dep.getScope() );
             mavenArtifact.setOptional( dep.isOptional() );
 
             return mavenArtifact;
         }
-        catch ( DependencyGraphBuilderException e )
+        catch ( DependencyCollectorBuilderException e )
         {
             // ReflectionException should not happen
             throw new RuntimeException( e.getMessage(), e );
@@ -249,10 +262,24 @@ public class Maven31DependencyCollectorBuilder
         {
             optional = node.getDependency().isOptional();
         }
+        
+        List<org.apache.maven.model.Exclusion> exclusions = null;
+        if ( node.getDependency() != null )
+        {
+            exclusions = new ArrayList<>( node.getDependency().getExclusions().size() );
+            for ( Exclusion exclusion : node.getDependency().getExclusions() )
+            {
+                org.apache.maven.model.Exclusion modelExclusion = new org.apache.maven.model.Exclusion();
+                modelExclusion.setGroupId( exclusion.getGroupId() );
+                modelExclusion.setArtifactId( exclusion.getArtifactId() );
+                exclusions.add( modelExclusion );
+            }
+        }
 
         DefaultDependencyNode current =
             new DefaultDependencyNode( parent, artifact, premanagedVersion, premanagedScope,
-                                       getVersionSelectedFromRange( node.getVersionConstraint() ), optional );
+                                       getVersionSelectedFromRange( node.getVersionConstraint() ), optional,
+                                       exclusions );
 
         List<DependencyNode> nodes = new ArrayList<DependencyNode>( node.getChildren().size() );
         for ( org.eclipse.aether.graph.DependencyNode child : node.getChildren() )
diff --git a/src/main/java/org/apache/maven/shared/dependency/graph/internal/Maven31DependencyGraphBuilder.java b/src/main/java/org/apache/maven/shared/dependency/graph/internal/Maven31DependencyGraphBuilder.java
index 5a53dcb..c1f9ab4 100644
--- a/src/main/java/org/apache/maven/shared/dependency/graph/internal/Maven31DependencyGraphBuilder.java
+++ b/src/main/java/org/apache/maven/shared/dependency/graph/internal/Maven31DependencyGraphBuilder.java
@@ -62,6 +62,20 @@ public class Maven31DependencyGraphBuilder
     @Requirement
     private ProjectDependenciesResolver resolver;
 
+    private final ExceptionHandler<DependencyGraphBuilderException> exceptionHandler;
+    
+    public Maven31DependencyGraphBuilder()
+    {
+        this.exceptionHandler = new ExceptionHandler<DependencyGraphBuilderException>()
+        {
+            @Override
+            public DependencyGraphBuilderException create( String message, Exception exception )
+            {
+                return new DependencyGraphBuilderException( message, exception );
+            }
+        };
+    }
+
     /**
      * Builds the dependency graph for Maven 3.1+.
      *
@@ -95,7 +109,7 @@ public class Maven31DependencyGraphBuilder
         MavenProject project = buildingRequest.getProject();
 
         RepositorySystemSession session =
-            (RepositorySystemSession) Invoker.invoke( buildingRequest, "getRepositorySession" );
+            (RepositorySystemSession) Invoker.invoke( buildingRequest, "getRepositorySession", exceptionHandler );
 
         /*
          * if ( Boolean.TRUE != ( (Boolean) session.getConfigProperties().get(
@@ -111,7 +125,7 @@ public class Maven31DependencyGraphBuilder
         final DependencyResolutionResult result = resolveDependencies( request, reactorProjects );
         org.eclipse.aether.graph.DependencyNode graph =
             (org.eclipse.aether.graph.DependencyNode) Invoker.invoke( DependencyResolutionResult.class, result,
-                                                                      "getDependencyGraph" );
+                                                                      "getDependencyGraph", exceptionHandler );
 
         return buildDependencyNode( null, graph, project.getArtifact(), filter );
     }
@@ -189,7 +203,7 @@ public class Maven31DependencyGraphBuilder
         try
         {
             Artifact mavenArtifact = (Artifact) Invoker.invoke( RepositoryUtils.class, "toArtifact",
-                                              org.eclipse.aether.artifact.Artifact.class, artifact );
+                                              org.eclipse.aether.artifact.Artifact.class, artifact, exceptionHandler );
 
             mavenArtifact.setScope( dep.getScope() );
             mavenArtifact.setOptional( dep.isOptional() );
diff --git a/src/main/java/org/apache/maven/shared/dependency/graph/internal/Maven3DependencyCollectorBuilder.java b/src/main/java/org/apache/maven/shared/dependency/graph/internal/Maven3DependencyCollectorBuilder.java
index e27f944..24c0d65 100644
--- a/src/main/java/org/apache/maven/shared/dependency/graph/internal/Maven3DependencyCollectorBuilder.java
+++ b/src/main/java/org/apache/maven/shared/dependency/graph/internal/Maven3DependencyCollectorBuilder.java
@@ -31,7 +31,7 @@ import org.apache.maven.model.Dependency;
 import org.apache.maven.project.MavenProject;
 import org.apache.maven.project.ProjectBuildingRequest;
 import org.apache.maven.shared.dependency.graph.DependencyCollectorBuilder;
-import org.apache.maven.shared.dependency.graph.DependencyGraphBuilderException;
+import org.apache.maven.shared.dependency.graph.DependencyCollectorBuilderException;
 import org.apache.maven.shared.dependency.graph.DependencyNode;
 import org.apache.maven.shared.dependency.graph.internal.maven30.ConflictResolver;
 import org.apache.maven.shared.dependency.graph.internal.maven30.JavaScopeDeriver;
@@ -51,6 +51,7 @@ import org.sonatype.aether.collection.DependencyCollectionException;
 import org.sonatype.aether.collection.DependencyGraphTransformer;
 import org.sonatype.aether.collection.DependencySelector;
 import org.sonatype.aether.graph.DependencyVisitor;
+import org.sonatype.aether.graph.Exclusion;
 import org.sonatype.aether.util.DefaultRepositorySystemSession;
 import org.sonatype.aether.util.artifact.JavaScopes;
 import org.sonatype.aether.util.graph.TreeDependencyVisitor;
@@ -63,7 +64,7 @@ import org.sonatype.aether.version.VersionConstraint;
  * Project dependency raw dependency collector API, abstracting Maven 3's Aether implementation.
  * 
  * @author Gabriel Belingueres
- * @since 3.0.2
+ * @since 3.1.0
  */
 @Component( role = DependencyCollectorBuilder.class, hint = "maven3" )
 public class Maven3DependencyCollectorBuilder
@@ -72,11 +73,25 @@ public class Maven3DependencyCollectorBuilder
 {
     @Requirement
     private RepositorySystem repositorySystem;
+    
+    private final ExceptionHandler<DependencyCollectorBuilderException> exceptionHandler;
+    
+    public Maven3DependencyCollectorBuilder()
+    {
+        this.exceptionHandler = new ExceptionHandler<DependencyCollectorBuilderException>()
+        {
+            @Override
+            public DependencyCollectorBuilderException create( String message, Exception exception )
+            {
+                return new DependencyCollectorBuilderException( message, exception );
+            }
+        };
+    }
 
     @Override
     public DependencyNode collectDependencyGraph( ArtifactRepository localRepository,
                                                 ProjectBuildingRequest buildingRequest, ArtifactFilter filter )
-        throws DependencyGraphBuilderException
+        throws DependencyCollectorBuilderException
     {
         try
         {
@@ -108,13 +123,15 @@ public class Maven3DependencyCollectorBuilder
 
             org.sonatype.aether.artifact.Artifact aetherArtifact =
                 (org.sonatype.aether.artifact.Artifact) Invoker.invoke( RepositoryUtils.class, "toArtifact",
-                                                                       Artifact.class, projectArtifact );
+                                                                        Artifact.class, projectArtifact,
+                                                                        exceptionHandler );
 
             @SuppressWarnings( "unchecked" )
             List<org.sonatype.aether.repository.RemoteRepository> aetherRepos =
                 (List<org.sonatype.aether.repository.RemoteRepository>) Invoker.invoke( RepositoryUtils.class,
                                                                                         "toRepos", List.class,
-                                                                                        remoteArtifactRepositories );
+                                                                                        remoteArtifactRepositories,
+                                                                                        exceptionHandler );
 
             CollectRequest collectRequest = new CollectRequest();
             collectRequest.setRoot( new org.sonatype.aether.graph.Dependency( aetherArtifact, "" ) );
@@ -137,7 +154,7 @@ public class Maven3DependencyCollectorBuilder
         }
         catch ( DependencyCollectionException e )
         {
-            throw new DependencyGraphBuilderException( "Could not collect dependencies: " + e.getResult(), e );
+            throw new DependencyCollectorBuilderException( "Could not collect dependencies: " + e.getResult(), e );
         }
     }
 
@@ -181,7 +198,7 @@ public class Maven3DependencyCollectorBuilder
 
     private void collectManagedDependencyList( CollectRequest collectRequest, MavenProject project,
                                                ArtifactTypeRegistry stereotypes )
-        throws DependencyGraphBuilderException
+        throws DependencyCollectorBuilderException
     {
         if ( project.getDependencyManagement() != null )
         {
@@ -195,7 +212,7 @@ public class Maven3DependencyCollectorBuilder
 
     private void collectDependencyList( CollectRequest collectRequest, MavenProject project,
                                         org.sonatype.aether.artifact.ArtifactTypeRegistry stereotypes )
-        throws DependencyGraphBuilderException
+        throws DependencyCollectorBuilderException
     {
         for ( Dependency dependency : project.getDependencies() )
         {
@@ -207,13 +224,13 @@ public class Maven3DependencyCollectorBuilder
     // CHECKSTYLE_OFF: LineLength
     private org.sonatype.aether.graph.Dependency toAetherDependency( org.sonatype.aether.artifact.ArtifactTypeRegistry stereotypes,
                                                                     Dependency dependency )
-        throws DependencyGraphBuilderException
+        throws DependencyCollectorBuilderException
     {
         org.sonatype.aether.graph.Dependency aetherDep =
             (org.sonatype.aether.graph.Dependency) Invoker.invoke( RepositoryUtils.class, "toDependency",
                                                                   Dependency.class,
                                                                    org.sonatype.aether.artifact.ArtifactTypeRegistry.class,
-                                                                  dependency, stereotypes );
+                                                                  dependency, stereotypes, exceptionHandler );
         return aetherDep;
     }
     // CHECKSTYLE_ON: LineLength
@@ -224,15 +241,16 @@ public class Maven3DependencyCollectorBuilder
 
         try
         {
-            Artifact mavenArtifact = (Artifact) Invoker.invoke( RepositoryUtils.class, "toArtifact",
-                                                                org.sonatype.aether.artifact.Artifact.class, artifact );
+            Artifact mavenArtifact =
+                (Artifact) Invoker.invoke( RepositoryUtils.class, "toArtifact",
+                                           org.sonatype.aether.artifact.Artifact.class, artifact, exceptionHandler );
 
             mavenArtifact.setScope( dep.getScope() );
             mavenArtifact.setOptional( dep.isOptional() );
 
             return mavenArtifact;
         }
-        catch ( DependencyGraphBuilderException e )
+        catch ( DependencyCollectorBuilderException e )
         {
             // ReflectionException should not happen
             throw new RuntimeException( e.getMessage(), e );
@@ -251,9 +269,23 @@ public class Maven3DependencyCollectorBuilder
             optional = node.getDependency().isOptional();
         }
 
+        List<org.apache.maven.model.Exclusion> exclusions = null;
+        if ( node.getDependency() != null )
+        {
+            exclusions = new ArrayList<>( node.getDependency().getExclusions().size() );
+            for ( Exclusion exclusion : node.getDependency().getExclusions() )
+            {
+                org.apache.maven.model.Exclusion modelExclusion = new org.apache.maven.model.Exclusion();
+                modelExclusion.setGroupId( exclusion.getGroupId() );
+                modelExclusion.setArtifactId( exclusion.getArtifactId() );
+                exclusions.add( modelExclusion );
+            }
+        }
+
         DefaultDependencyNode current =
             new DefaultDependencyNode( parent, artifact, premanagedVersion, premanagedScope,
-                                       getVersionSelectedFromRange( node.getVersionConstraint() ), optional );
+                                       getVersionSelectedFromRange( node.getVersionConstraint() ), optional,
+                                       exclusions );
 
         List<DependencyNode> nodes = new ArrayList<DependencyNode>( node.getChildren().size() );
         for ( org.sonatype.aether.graph.DependencyNode child : node.getChildren() )
diff --git a/src/main/java/org/apache/maven/shared/dependency/graph/internal/Maven3DependencyGraphBuilder.java b/src/main/java/org/apache/maven/shared/dependency/graph/internal/Maven3DependencyGraphBuilder.java
index 2a2e58b..39e2a35 100644
--- a/src/main/java/org/apache/maven/shared/dependency/graph/internal/Maven3DependencyGraphBuilder.java
+++ b/src/main/java/org/apache/maven/shared/dependency/graph/internal/Maven3DependencyGraphBuilder.java
@@ -130,7 +130,7 @@ public class Maven3DependencyGraphBuilder
         List<Dependency> reactorDeps = getReactorDependencies( reactorProjects, result.getUnresolvedDependencies() );
 
         result.getUnresolvedDependencies().removeAll( reactorDeps );
-        Invoker.invoke( result.getResolvedDependencies(), "addAll", Collection.class, reactorDeps );
+        result.getResolvedDependencies().addAll( reactorDeps );
 
         if ( !result.getUnresolvedDependencies().isEmpty() )
         {
diff --git a/src/main/java/org/apache/maven/shared/dependency/graph/internal/maven30/ConflictIdSorter.java b/src/main/java/org/apache/maven/shared/dependency/graph/internal/maven30/ConflictIdSorter.java
index 44cbbe7..d686842 100644
--- a/src/main/java/org/apache/maven/shared/dependency/graph/internal/maven30/ConflictIdSorter.java
+++ b/src/main/java/org/apache/maven/shared/dependency/graph/internal/maven30/ConflictIdSorter.java
@@ -40,7 +40,7 @@ import org.sonatype.aether.util.graph.transformer.TransformationContextKeys;
  * This class is a copy of their homonymous in the Eclipse Aether library, adapted to work with Sonatype Aether.
  * 
  * @author Gabriel Belingueres
- * @since 3.0.2
+ * @since 3.1.0
  */
 public final class ConflictIdSorter
     implements DependencyGraphTransformer
diff --git a/src/main/java/org/apache/maven/shared/dependency/graph/internal/maven30/ConflictResolver.java b/src/main/java/org/apache/maven/shared/dependency/graph/internal/maven30/ConflictResolver.java
index 1e60a32..abbb36e 100644
--- a/src/main/java/org/apache/maven/shared/dependency/graph/internal/maven30/ConflictResolver.java
+++ b/src/main/java/org/apache/maven/shared/dependency/graph/internal/maven30/ConflictResolver.java
@@ -45,7 +45,7 @@ import org.sonatype.aether.util.graph.transformer.TransformationContextKeys;
  * This class is a copy of their homonymous in the Eclipse Aether library, adapted to work with Sonatype Aether.
  * 
  * @author Gabriel Belingueres
- * @since 3.0.2
+ * @since 3.1.0
  */
 public final class ConflictResolver
     implements DependencyGraphTransformer
diff --git a/src/main/java/org/apache/maven/shared/dependency/graph/internal/maven30/ExclusionDependencySelector.java b/src/main/java/org/apache/maven/shared/dependency/graph/internal/maven30/ExclusionDependencySelector.java
index 36f2bd7..e9555f9 100644
--- a/src/main/java/org/apache/maven/shared/dependency/graph/internal/maven30/ExclusionDependencySelector.java
+++ b/src/main/java/org/apache/maven/shared/dependency/graph/internal/maven30/ExclusionDependencySelector.java
@@ -34,7 +34,7 @@ import org.sonatype.aether.graph.Exclusion;
  * This class is a copy of their homonymous in the Eclipse Aether library, adapted to work with Sonatype Aether.
  * 
  * @author Gabriel Belingueres
- * @since 3.0.2
+ * @since 3.1.0
  */
 public class ExclusionDependencySelector
     implements DependencySelector
diff --git a/src/main/java/org/apache/maven/shared/dependency/graph/internal/maven30/JavaScopeDeriver.java b/src/main/java/org/apache/maven/shared/dependency/graph/internal/maven30/JavaScopeDeriver.java
index 73367bf..d35abf0 100644
--- a/src/main/java/org/apache/maven/shared/dependency/graph/internal/maven30/JavaScopeDeriver.java
+++ b/src/main/java/org/apache/maven/shared/dependency/graph/internal/maven30/JavaScopeDeriver.java
@@ -28,7 +28,7 @@ import org.sonatype.aether.util.artifact.JavaScopes;
  * This class is a copy of their homonymous in the Eclipse Aether library, adapted to work with Sonatype Aether.
  * 
  * @author Gabriel Belingueres
- * @since 3.0.2
+ * @since 3.1.0
  */
 public class JavaScopeDeriver
     extends ScopeDeriver
diff --git a/src/main/java/org/apache/maven/shared/dependency/graph/internal/maven30/JavaScopeSelector.java b/src/main/java/org/apache/maven/shared/dependency/graph/internal/maven30/JavaScopeSelector.java
index 6eeea83..9a810e7 100644
--- a/src/main/java/org/apache/maven/shared/dependency/graph/internal/maven30/JavaScopeSelector.java
+++ b/src/main/java/org/apache/maven/shared/dependency/graph/internal/maven30/JavaScopeSelector.java
@@ -33,7 +33,7 @@ import org.sonatype.aether.util.artifact.JavaScopes;
  * This class is a copy of their homonymous in the Eclipse Aether library, adapted to work with Sonatype Aether.
  * 
  * @author Gabriel Belingueres
- * @since 3.0.2
+ * @since 3.1.0
  */
 public final class JavaScopeSelector
     extends ScopeSelector
diff --git a/src/main/java/org/apache/maven/shared/dependency/graph/internal/maven30/Maven3DirectScopeDependencySelector.java b/src/main/java/org/apache/maven/shared/dependency/graph/internal/maven30/Maven3DirectScopeDependencySelector.java
index e66b80b..4776e6d 100644
--- a/src/main/java/org/apache/maven/shared/dependency/graph/internal/maven30/Maven3DirectScopeDependencySelector.java
+++ b/src/main/java/org/apache/maven/shared/dependency/graph/internal/maven30/Maven3DirectScopeDependencySelector.java
@@ -29,7 +29,7 @@ import org.sonatype.aether.graph.Dependency;
  * 
  * @see {@link Dependency#getScope()}
  * @author Gabriel Belingueres
- * @since 3.0.2
+ * @since 3.1.0
  */
 public class Maven3DirectScopeDependencySelector
     implements DependencySelector
diff --git a/src/main/java/org/apache/maven/shared/dependency/graph/internal/maven30/NearestVersionSelector.java b/src/main/java/org/apache/maven/shared/dependency/graph/internal/maven30/NearestVersionSelector.java
index 8d2bc93..c793b96 100644
--- a/src/main/java/org/apache/maven/shared/dependency/graph/internal/maven30/NearestVersionSelector.java
+++ b/src/main/java/org/apache/maven/shared/dependency/graph/internal/maven30/NearestVersionSelector.java
@@ -40,7 +40,7 @@ import org.sonatype.aether.version.VersionConstraint;
  * This class is a copy of their homonymous in the Eclipse Aether library, adapted to work with Sonatype Aether.
  * 
  * @author Gabriel Belingueres
- * @since 3.0.2
+ * @since 3.1.0
  */
 public final class NearestVersionSelector
     extends VersionSelector
diff --git a/src/main/java/org/apache/maven/shared/dependency/graph/internal/maven30/SimpleOptionalitySelector.java b/src/main/java/org/apache/maven/shared/dependency/graph/internal/maven30/SimpleOptionalitySelector.java
index ffd6a63..d63df0b 100644
--- a/src/main/java/org/apache/maven/shared/dependency/graph/internal/maven30/SimpleOptionalitySelector.java
+++ b/src/main/java/org/apache/maven/shared/dependency/graph/internal/maven30/SimpleOptionalitySelector.java
@@ -30,7 +30,7 @@ import org.sonatype.aether.RepositoryException;
  * This class is a copy of their homonymous in the Eclipse Aether library, adapted to work with Sonatype Aether.
  * 
  * @author Gabriel Belingueres
- * @since 3.0.2
+ * @since 3.1.0
  */
 public class SimpleOptionalitySelector
     extends OptionalitySelector
diff --git a/src/main/java/org/apache/maven/shared/dependency/graph/internal/maven31/Maven31DirectScopeDependencySelector.java b/src/main/java/org/apache/maven/shared/dependency/graph/internal/maven31/Maven31DirectScopeDependencySelector.java
index dbc71c5..95ee25c 100644
--- a/src/main/java/org/apache/maven/shared/dependency/graph/internal/maven31/Maven31DirectScopeDependencySelector.java
+++ b/src/main/java/org/apache/maven/shared/dependency/graph/internal/maven31/Maven31DirectScopeDependencySelector.java
@@ -29,7 +29,7 @@ import org.eclipse.aether.graph.Dependency;
  * 
  * @see {@link Dependency#getScope()}
  * @author Gabriel Belingueres
- * @since 3.0.2
+ * @since 3.1.0
  */
 public class Maven31DirectScopeDependencySelector
     implements DependencySelector