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

sjaranowski pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/maven-dependency-plugin.git


The following commit(s) were added to refs/heads/master by this push:
     new 61d1162a [MDEP-922] dependency:analyze-exclusions - should report 
issue only in current project
61d1162a is described below

commit 61d1162a64577549a8af5e43591fe5782c8fbd31
Author: Slawomir Jaranowski <s.jaranow...@gmail.com>
AuthorDate: Thu Apr 18 23:32:33 2024 +0200

    [MDEP-922] dependency:analyze-exclusions - should report issue only in 
current project
    
    - filter exclusion by dependency location
---
 .../pom.xml => mrm/repository/a-with-dep.pom}      | 17 +++---
 .../pom.xml => mrm/repository/b-with-dep.pom}      | 18 +++---
 .../pom.xml => mrm/repository/c-without-dep.pom}   | 18 ++----
 .../module1/pom.xml                                | 19 +++++-
 .../module2/pom.xml                                |  4 +-
 .../pom.xml                                        | 10 ++--
 .../verify.groovy                                  | 36 ++++++++---
 src/it/projects/analyze-invalid-exclude/pom.xml    | 70 ++++++++++++----------
 .../projects/analyze-invalid-exclude/verify.groovy | 26 +++++---
 .../exclusion/AnalyzeExclusionsMojo.java           | 61 +++++++++++++++----
 .../plugins/dependency/exclusion/Coordinates.java  | 56 +++++++++++++++--
 .../dependency/exclusion/ExclusionChecker.java     |  5 +-
 .../exclusion/AnalyzeExclusionsMojoTest.java       | 11 ++++
 .../dependency/exclusion/ExclusionCheckerTest.java |  2 +-
 14 files changed, 242 insertions(+), 111 deletions(-)

diff --git 
a/src/it/projects/analyze-invalid-exclude-multumodule-project/module1/pom.xml 
b/src/it/mrm/repository/a-with-dep.pom
similarity index 78%
copy from 
src/it/projects/analyze-invalid-exclude-multumodule-project/module1/pom.xml
copy to src/it/mrm/repository/a-with-dep.pom
index 2b329db3..d3d163a8 100644
--- 
a/src/it/projects/analyze-invalid-exclude-multumodule-project/module1/pom.xml
+++ b/src/it/mrm/repository/a-with-dep.pom
@@ -20,21 +20,18 @@
 
 <project xmlns="http://maven.apache.org/POM/4.0.0";
          xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance";
-         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 
http://maven.apache.org/xsd/maven-4.0.0.xsd";>
+         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 
https://maven.apache.org/xsd/maven-4.0.0.xsd";>
   <modelVersion>4.0.0</modelVersion>
 
-  <parent>
-    <groupId>org.apache.maven.its.dependency</groupId>
-    <artifactId>test-parent</artifactId>
-    <version>1.0-SNAPSHOT</version>
-  </parent>
-
-  <artifactId>test-module1</artifactId>
+  <groupId>org.apache.maven.its.dependency</groupId>
+  <artifactId>a-with-dep</artifactId>
+  <version>1.0.0</version>
 
   <dependencies>
     <dependency>
-      <groupId>org.apache.maven</groupId>
-      <artifactId>maven-core</artifactId>
+      <groupId>org.apache.maven.its.dependency</groupId>
+      <artifactId>b-with-dep</artifactId>
+      <version>1.0.0</version>
     </dependency>
   </dependencies>
 </project>
diff --git 
a/src/it/projects/analyze-invalid-exclude-multumodule-project/module1/pom.xml 
b/src/it/mrm/repository/b-with-dep.pom
similarity index 78%
copy from 
src/it/projects/analyze-invalid-exclude-multumodule-project/module1/pom.xml
copy to src/it/mrm/repository/b-with-dep.pom
index 2b329db3..60c213fe 100644
--- 
a/src/it/projects/analyze-invalid-exclude-multumodule-project/module1/pom.xml
+++ b/src/it/mrm/repository/b-with-dep.pom
@@ -20,21 +20,19 @@
 
 <project xmlns="http://maven.apache.org/POM/4.0.0";
          xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance";
-         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 
http://maven.apache.org/xsd/maven-4.0.0.xsd";>
+         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 
https://maven.apache.org/xsd/maven-4.0.0.xsd";>
   <modelVersion>4.0.0</modelVersion>
 
-  <parent>
-    <groupId>org.apache.maven.its.dependency</groupId>
-    <artifactId>test-parent</artifactId>
-    <version>1.0-SNAPSHOT</version>
-  </parent>
-
-  <artifactId>test-module1</artifactId>
+  <groupId>org.apache.maven.its.dependency</groupId>
+  <artifactId>b-with-dep</artifactId>
+  <version>1.0.0</version>
 
   <dependencies>
     <dependency>
-      <groupId>org.apache.maven</groupId>
-      <artifactId>maven-core</artifactId>
+      <groupId>org.apache.maven.its.dependency</groupId>
+      <artifactId>c-without-dep</artifactId>
+      <version>1.0.0</version>
     </dependency>
   </dependencies>
+
 </project>
diff --git 
a/src/it/projects/analyze-invalid-exclude-multumodule-project/module1/pom.xml 
b/src/it/mrm/repository/c-without-dep.pom
similarity index 73%
copy from 
src/it/projects/analyze-invalid-exclude-multumodule-project/module1/pom.xml
copy to src/it/mrm/repository/c-without-dep.pom
index 2b329db3..36721d29 100644
--- 
a/src/it/projects/analyze-invalid-exclude-multumodule-project/module1/pom.xml
+++ b/src/it/mrm/repository/c-without-dep.pom
@@ -20,21 +20,11 @@
 
 <project xmlns="http://maven.apache.org/POM/4.0.0";
          xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance";
-         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 
http://maven.apache.org/xsd/maven-4.0.0.xsd";>
+         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 
https://maven.apache.org/xsd/maven-4.0.0.xsd";>
   <modelVersion>4.0.0</modelVersion>
 
-  <parent>
-    <groupId>org.apache.maven.its.dependency</groupId>
-    <artifactId>test-parent</artifactId>
-    <version>1.0-SNAPSHOT</version>
-  </parent>
+  <groupId>org.apache.maven.its.dependency</groupId>
+  <artifactId>c-without-dep</artifactId>
+  <version>1.0.0</version>
 
-  <artifactId>test-module1</artifactId>
-
-  <dependencies>
-    <dependency>
-      <groupId>org.apache.maven</groupId>
-      <artifactId>maven-core</artifactId>
-    </dependency>
-  </dependencies>
 </project>
diff --git 
a/src/it/projects/analyze-invalid-exclude-multumodule-project/module1/pom.xml 
b/src/it/projects/analyze-invalid-exclude-multumodule-project/module1/pom.xml
index 2b329db3..fb266266 100644
--- 
a/src/it/projects/analyze-invalid-exclude-multumodule-project/module1/pom.xml
+++ 
b/src/it/projects/analyze-invalid-exclude-multumodule-project/module1/pom.xml
@@ -33,8 +33,23 @@
 
   <dependencies>
     <dependency>
-      <groupId>org.apache.maven</groupId>
-      <artifactId>maven-core</artifactId>
+      <groupId>org.apache.maven.its.dependency</groupId>
+      <artifactId>a-with-dep</artifactId>
+      <version>1.0.0</version>
+      <exclusions>
+        <exclusion>
+          <groupId>org.apache.maven.its.dependency</groupId>
+          <artifactId>invalid-exclusion2</artifactId>
+        </exclusion>
+        <exclusion>
+          <groupId>org.apache.maven.its.dependency</groupId>
+          <artifactId>c-without-dep</artifactId>
+        </exclusion>
+        <exclusion>
+          <groupId>org.apache.maven.its.dependency</groupId>
+          <artifactId>invalid-exclusion3</artifactId>
+        </exclusion>
+      </exclusions>
     </dependency>
   </dependencies>
 </project>
diff --git 
a/src/it/projects/analyze-invalid-exclude-multumodule-project/module2/pom.xml 
b/src/it/projects/analyze-invalid-exclude-multumodule-project/module2/pom.xml
index 17d63f14..59f3a92b 100644
--- 
a/src/it/projects/analyze-invalid-exclude-multumodule-project/module2/pom.xml
+++ 
b/src/it/projects/analyze-invalid-exclude-multumodule-project/module2/pom.xml
@@ -38,8 +38,8 @@
       <version>${project.version}</version>
       <exclusions>
         <exclusion>
-          <groupId>org.apache.maven</groupId>
-          <artifactId>maven-core</artifactId>
+          <groupId>org.apache.maven.its.dependency</groupId>
+          <artifactId>a-with-dep</artifactId>
         </exclusion>
       </exclusions>
     </dependency>
diff --git 
a/src/it/projects/analyze-invalid-exclude-multumodule-project/pom.xml 
b/src/it/projects/analyze-invalid-exclude-multumodule-project/pom.xml
index 56e37b4c..8e9c27a9 100644
--- a/src/it/projects/analyze-invalid-exclude-multumodule-project/pom.xml
+++ b/src/it/projects/analyze-invalid-exclude-multumodule-project/pom.xml
@@ -45,13 +45,13 @@
   <dependencyManagement>
     <dependencies>
       <dependency>
-        <groupId>org.apache.maven</groupId>
-        <artifactId>maven-core</artifactId>
-        <version>3.9.6</version>
+        <groupId>org.apache.maven.its.dependency</groupId>
+        <artifactId>a-with-dep</artifactId>
+        <version>1.0.0</version>
         <exclusions>
           <exclusion>
-            <groupId>javax.servlet</groupId>
-            <artifactId>javax.servlet-api</artifactId>
+            <groupId>org.apache.maven.its.dependency</groupId>
+            <artifactId>invalid-exclusion1</artifactId>
           </exclusion>
         </exclusions>
       </dependency>
diff --git 
a/src/it/projects/analyze-invalid-exclude-multumodule-project/verify.groovy 
b/src/it/projects/analyze-invalid-exclude-multumodule-project/verify.groovy
index 75051429..8b798d26 100644
--- a/src/it/projects/analyze-invalid-exclude-multumodule-project/verify.groovy
+++ b/src/it/projects/analyze-invalid-exclude-multumodule-project/verify.groovy
@@ -1,3 +1,5 @@
+import java.lang.reflect.Array
+
 /*
  * Licensed to the Apache Software Foundation (ASF) under one
  * or more contributor license agreements.  See the NOTICE file
@@ -17,14 +19,34 @@
  * under the License.
  */
 
-File file = new File( basedir, "build.log" );
+
+static void checkMessagedInLogs(logLines, messages) {
+    def index = logLines.indexOf(messages[0])
+    assert index > 0: "no messages: '" + messages[0] + "' in log"
+
+    def logMessages = logLines[index..index + messages.size() - 1]
+
+    assert logMessages == messages
+
+}
+
+def file = new File(basedir, "build.log");
 assert file.exists();
 
-String buildLog = file.getText( "UTF-8" );
-assert buildLog.contains( '[WARNING] test-module1 defines following 
unnecessary excludes');
-assert buildLog.contains( '[WARNING]     org.apache.maven:maven-core:');
-assert buildLog.contains( '[WARNING]         - 
javax.servlet:javax.servlet-api');
+def logLines = buildLog = file.readLines()
+
+checkMessagedInLogs(logLines, [
+        '[WARNING] Test defines following unnecessary excludes',
+        '[WARNING]     org.apache.maven.its.dependency:a-with-dep:1.0.0',
+        '[WARNING]         - 
org.apache.maven.its.dependency:invalid-exclusion1 @ line: 52'
+])
+
+checkMessagedInLogs(logLines, [
+        '[WARNING] test-module1 defines following unnecessary excludes',
+        '[WARNING]     org.apache.maven.its.dependency:a-with-dep:1.0.0',
+        '[WARNING]         - 
org.apache.maven.its.dependency:invalid-exclusion2 @ line: 40',
+        '[WARNING]         - 
org.apache.maven.its.dependency:invalid-exclusion3 @ line: 48'
 
-assert !buildLog.contains( '[WARNING] test-module2 defines following 
unnecessary excludes');
+])
 
-return true;
+assert logLines.count('[INFO] No problems with dependencies exclusions') == 1
diff --git a/src/it/projects/analyze-invalid-exclude/pom.xml 
b/src/it/projects/analyze-invalid-exclude/pom.xml
index 17587fea..5c65025c 100644
--- a/src/it/projects/analyze-invalid-exclude/pom.xml
+++ b/src/it/projects/analyze-invalid-exclude/pom.xml
@@ -36,53 +36,59 @@
     <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
   </properties>
 
+  <dependencyManagement>
+    <dependencies>
+      <dependency>
+        <groupId>org.apache.maven.its.dependency</groupId>
+        <artifactId>a-with-dep</artifactId>
+        <version>1.0.0</version>
+        <exclusions>
+          <exclusion>
+            <groupId>org.apache.maven.its.dependency</groupId>
+            <artifactId>invalid-exclusion1</artifactId>
+          </exclusion>
+        </exclusions>
+      </dependency>
+    </dependencies>
+  </dependencyManagement>
+
   <dependencies>
     <dependency>
-      <groupId>org.apache.maven</groupId>
-      <artifactId>maven-core</artifactId>
+      <groupId>org.apache.maven.its.dependency</groupId>
+      <artifactId>b-with-dep</artifactId>
+      <version>1.0.0</version>
+      <exclusions>
+        <exclusion>
+          <groupId>org.apache.maven.its.dependency</groupId>
+          <artifactId>c-without-dep</artifactId>
+        </exclusion>
+        <exclusion>
+          <groupId>org.apache.maven.its.dependency</groupId>
+          <artifactId>invalid-exclusion3</artifactId>
+        </exclusion>
+      </exclusions>
     </dependency>
     <dependency>
-      <groupId>org.apache.maven</groupId>
-      <artifactId>maven-artifact</artifactId>
-      <version>3.9.6</version>
+      <groupId>org.apache.maven.its.dependency</groupId>
+      <artifactId>a-with-dep</artifactId>
       <exclusions>
         <exclusion>
-          <groupId>javax.annotation</groupId>
-          <artifactId>javax.annotation-api</artifactId>
+          <groupId>org.apache.maven.its.dependency</groupId>
+          <artifactId>invalid-exclusion2</artifactId>
         </exclusion>
         <exclusion>
-          <groupId>javax.activation</groupId>
-          <artifactId>javax.activation-api</artifactId>
+          <groupId>org.apache.maven.its.dependency</groupId>
+          <artifactId>c-without-dep</artifactId>
         </exclusion>
       </exclusions>
     </dependency>
     <dependency>
-      <groupId>org.apache.maven</groupId>
-      <artifactId>maven-model</artifactId>
-      <version>3.9.6</version>
+      <groupId>org.apache.maven.its.dependency</groupId>
+      <artifactId>c-without-dep</artifactId>
+      <version>1.0.0</version>
     </dependency>
   </dependencies>
 
-  <dependencyManagement>
-    <dependencies>
-      <dependency>
-        <groupId>org.apache.maven</groupId>
-        <artifactId>maven-core</artifactId>
-        <version>3.9.6</version>
-        <exclusions>
-          <exclusion>
-            <groupId>javax.servlet</groupId>
-            <artifactId>javax.servlet-api</artifactId>
-          </exclusion>
-          <exclusion>
-            <groupId>org.codehaus.plexus</groupId>
-            <artifactId>*</artifactId>
-          </exclusion>
-        </exclusions>
-      </dependency>
-    </dependencies>
-  </dependencyManagement>
-
   <build>
     <pluginManagement>
       <plugins>
diff --git a/src/it/projects/analyze-invalid-exclude/verify.groovy 
b/src/it/projects/analyze-invalid-exclude/verify.groovy
index 513517d1..fb3c8c7a 100644
--- a/src/it/projects/analyze-invalid-exclude/verify.groovy
+++ b/src/it/projects/analyze-invalid-exclude/verify.groovy
@@ -17,15 +17,23 @@
  * under the License.
  */
 
-File file = new File( basedir, "build.log" );
+def file = new File(basedir, "build.log");
 assert file.exists();
 
-String buildLog = file.getText( "UTF-8" );
-assert buildLog.contains( '[WARNING] test-module defines following unnecessary 
excludes');
-assert buildLog.contains( '[WARNING]     org.apache.maven:maven-artifact:');
-assert buildLog.contains( '[WARNING]         - 
javax.annotation:javax.annotation-api');
-assert buildLog.contains( '[WARNING]         - 
javax.activation:javax.activation-api');
-assert buildLog.contains( '[WARNING]     org.apache.maven:maven-core:');
-assert buildLog.contains( '[WARNING]         - 
javax.servlet:javax.servlet-api');
+def logLines = buildLog = file.readLines()
+
+def index = logLines.indexOf('[WARNING] test-module defines following 
unnecessary excludes')
+assert index > 0: "no messages in log"
+
+def messages = logLines[index..index + 5];
+
+assert messages == [
+        '[WARNING] test-module defines following unnecessary excludes',
+        '[WARNING]     org.apache.maven.its.dependency:a-with-dep:1.0.0',
+        '[WARNING]         - 
org.apache.maven.its.dependency:invalid-exclusion1 @ line: 46',
+        '[WARNING]         - 
org.apache.maven.its.dependency:invalid-exclusion2 @ line: 75',
+        '[WARNING]     org.apache.maven.its.dependency:b-with-dep:1.0.0',
+        '[WARNING]         - 
org.apache.maven.its.dependency:invalid-exclusion3 @ line: 65'
+]
+
 
-return true;
diff --git 
a/src/main/java/org/apache/maven/plugins/dependency/exclusion/AnalyzeExclusionsMojo.java
 
b/src/main/java/org/apache/maven/plugins/dependency/exclusion/AnalyzeExclusionsMojo.java
index 871296f6..3ad8d3b9 100644
--- 
a/src/main/java/org/apache/maven/plugins/dependency/exclusion/AnalyzeExclusionsMojo.java
+++ 
b/src/main/java/org/apache/maven/plugins/dependency/exclusion/AnalyzeExclusionsMojo.java
@@ -18,7 +18,9 @@
  */
 package org.apache.maven.plugins.dependency.exclusion;
 
+import java.util.ArrayList;
 import java.util.Collection;
+import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
 import java.util.Set;
@@ -27,6 +29,7 @@ import java.util.function.Consumer;
 import org.apache.maven.RepositoryUtils;
 import org.apache.maven.execution.MavenSession;
 import org.apache.maven.model.Dependency;
+import org.apache.maven.model.Exclusion;
 import org.apache.maven.plugin.AbstractMojo;
 import org.apache.maven.plugin.MojoExecutionException;
 import org.apache.maven.plugins.annotations.Component;
@@ -79,15 +82,39 @@ public class AnalyzeExclusionsMojo extends AbstractMojo {
     @Parameter(property = "mdep.skip", defaultValue = "false")
     private boolean skip;
 
+    /**
+     * Current project modelId.
+     */
+    private String projectModelId;
+
     @Override
     public void execute() throws MojoExecutionException {
         if (skip) {
             getLog().debug("Skipping execution");
             return;
         }
-        Collection<Dependency> dependenciesWithExclusions = 
project.getDependencies().stream()
-                .filter(dep -> !dep.getExclusions().isEmpty())
-                .collect(toList());
+
+        projectModelId = project.getGroupId() + ":" + project.getArtifactId() 
+ ":" + project.getVersion();
+
+        Map<Coordinates, Collection<Exclusion>> dependenciesWithExclusions = 
new HashMap<>();
+
+        project.getDependencyManagement().getDependencies().forEach(dependency 
-> {
+            Collection<Exclusion> exclusions = 
getExclusionsForDependency(dependency);
+            if (!exclusions.isEmpty()) {
+                dependenciesWithExclusions
+                        .computeIfAbsent(coordinates(dependency), d -> new 
ArrayList<>())
+                        .addAll(exclusions);
+            }
+        });
+
+        project.getDependencies().forEach(dependency -> {
+            Collection<Exclusion> exclusions = 
getExclusionsForDependency(dependency);
+            if (!exclusions.isEmpty()) {
+                dependenciesWithExclusions
+                        .computeIfAbsent(coordinates(dependency), d -> new 
ArrayList<>())
+                        .addAll(exclusions);
+            }
+        });
 
         if (dependenciesWithExclusions.isEmpty()) {
             getLog().debug("No dependencies defined with exclusions - 
exiting");
@@ -98,14 +125,14 @@ public class AnalyzeExclusionsMojo extends AbstractMojo {
 
         ArtifactTypeRegistry artifactTypeRegistry =
                 session.getRepositorySession().getArtifactTypeRegistry();
-        for (final Dependency dependency : dependenciesWithExclusions) {
+        for (Map.Entry<Coordinates, Collection<Exclusion>> entry : 
dependenciesWithExclusions.entrySet()) {
 
-            Coordinates currentCoordinates = 
coordinates(dependency.getGroupId(), dependency.getArtifactId());
+            Coordinates currentCoordinates = entry.getKey();
 
             Collection<org.eclipse.aether.graph.Dependency> actualDependencies 
= null;
             try {
-                actualDependencies =
-                        
resolverUtil.collectDependencies(RepositoryUtils.toDependency(dependency, 
artifactTypeRegistry)
+                actualDependencies = resolverUtil.collectDependencies(
+                        
RepositoryUtils.toDependency(currentCoordinates.getDependency(), 
artifactTypeRegistry)
                                 .setExclusions(null));
             } catch (DependencyCollectionException e) {
                 throw new MojoExecutionException(e.getMessage(), e);
@@ -116,9 +143,8 @@ public class AnalyzeExclusionsMojo extends AbstractMojo {
                     .map(a -> coordinates(a.getGroupId(), a.getArtifactId()))
                     .collect(toSet());
 
-            Set<Coordinates> exclusions = dependency.getExclusions().stream()
-                    .map(e -> coordinates(e.getGroupId(), e.getArtifactId()))
-                    .collect(toSet());
+            Set<Coordinates> exclusions =
+                    
entry.getValue().stream().map(Coordinates::coordinates).collect(toSet());
 
             checker.check(currentCoordinates, exclusions, actualCoordinates);
         }
@@ -130,13 +156,26 @@ public class AnalyzeExclusionsMojo extends AbstractMojo {
             } else {
                 logViolations(project.getName(), checker.getViolations(), 
value -> getLog().warn(value));
             }
+        } else {
+            getLog().info("No problems with dependencies exclusions");
         }
     }
 
+    private Collection<Exclusion> getExclusionsForDependency(Dependency 
dependency) {
+        return dependency.getExclusions().stream()
+                .filter(this::isExclusionInProject)
+                .collect(toList());
+    }
+
+    private boolean isExclusionInProject(Exclusion exclusion) {
+        String modelId = exclusion.getLocation("").getSource().getModelId();
+        return projectModelId.equals(modelId);
+    }
+
     private void logViolations(String name, Map<Coordinates, 
List<Coordinates>> violations, Consumer<String> logger) {
         logger.accept(name + " defines following unnecessary excludes");
         violations.forEach((dependency, invalidExclusions) -> {
-            logger.accept("    " + dependency + ":");
+            logger.accept("    " + dependency);
             invalidExclusions.forEach(invalidExclusion -> logger.accept("      
  - " + invalidExclusion));
         });
     }
diff --git 
a/src/main/java/org/apache/maven/plugins/dependency/exclusion/Coordinates.java 
b/src/main/java/org/apache/maven/plugins/dependency/exclusion/Coordinates.java
index cb4a042e..d81f7b37 100644
--- 
a/src/main/java/org/apache/maven/plugins/dependency/exclusion/Coordinates.java
+++ 
b/src/main/java/org/apache/maven/plugins/dependency/exclusion/Coordinates.java
@@ -25,23 +25,43 @@ import java.nio.file.PathMatcher;
 import java.util.Objects;
 import java.util.function.Predicate;
 
+import org.apache.maven.model.Dependency;
+import org.apache.maven.model.Exclusion;
+import org.apache.maven.model.InputLocation;
+
 /**
  * Simple "record" to hold the coordinates of the dependency which is excluded.
  * <p>
  * When dealing with exclusions the version is not important. Only groupId and 
artifactId is used.
  * </p>
  */
-class Coordinates {
+class Coordinates implements Comparable<Coordinates> {
+
     private final String groupId;
+
     private final String artifactId;
 
-    private Coordinates(String groupId, String artifactId) {
+    private final Dependency dependency;
+
+    private final InputLocation location;
+
+    private Coordinates(String groupId, String artifactId, Dependency 
dependency, InputLocation location) {
         this.groupId = groupId;
         this.artifactId = artifactId;
+        this.dependency = dependency;
+        this.location = location;
     }
 
     public static Coordinates coordinates(String groupId, String artifactId) {
-        return new Coordinates(groupId, artifactId);
+        return new Coordinates(groupId, artifactId, null, null);
+    }
+
+    public static Coordinates coordinates(Dependency dependency) {
+        return new Coordinates(dependency.getGroupId(), 
dependency.getArtifactId(), dependency, null);
+    }
+
+    public static Coordinates coordinates(Exclusion exclusion) {
+        return new Coordinates(exclusion.getGroupId(), 
exclusion.getArtifactId(), null, exclusion.getLocation(""));
     }
 
     public String getGroupId() {
@@ -52,6 +72,10 @@ class Coordinates {
         return artifactId;
     }
 
+    public Dependency getDependency() {
+        return dependency;
+    }
+
     Predicate<Coordinates> getExclusionPattern() {
         PathMatcher groupId = FileSystems.getDefault().getPathMatcher("glob:" 
+ getGroupId());
         PathMatcher artifactId = 
FileSystems.getDefault().getPathMatcher("glob:" + getArtifactId());
@@ -86,16 +110,36 @@ class Coordinates {
             return false;
         }
         Coordinates that = (Coordinates) o;
-        return Objects.equals(groupId, that.groupId) && 
Objects.equals(artifactId, that.artifactId);
+        return Objects.equals(groupId, that.groupId)
+                && Objects.equals(artifactId, that.artifactId)
+                && Objects.equals(location, that.location);
     }
 
     @Override
     public int hashCode() {
-        return Objects.hash(groupId, artifactId);
+        return Objects.hash(groupId, artifactId, location);
+    }
+
+    @Override
+    public int compareTo(Coordinates that) {
+
+        if (location != null && that.location != null) {
+            return location.getLineNumber() - that.location.getLineNumber();
+        }
+
+        return toString().compareTo(that.toString());
     }
 
     @Override
     public String toString() {
-        return groupId + ":" + artifactId;
+        String version = "";
+        if (dependency != null) {
+            version = ":" + dependency.getVersion();
+        }
+        String line = "";
+        if (location != null) {
+            line = " @ line: " + location.getLineNumber();
+        }
+        return groupId + ":" + artifactId + version + line;
     }
 }
diff --git 
a/src/main/java/org/apache/maven/plugins/dependency/exclusion/ExclusionChecker.java
 
b/src/main/java/org/apache/maven/plugins/dependency/exclusion/ExclusionChecker.java
index 7219cdee..1340461b 100644
--- 
a/src/main/java/org/apache/maven/plugins/dependency/exclusion/ExclusionChecker.java
+++ 
b/src/main/java/org/apache/maven/plugins/dependency/exclusion/ExclusionChecker.java
@@ -18,16 +18,16 @@
  */
 package org.apache.maven.plugins.dependency.exclusion;
 
-import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
 import java.util.Set;
+import java.util.TreeMap;
 
 import static java.util.stream.Collectors.toList;
 
 class ExclusionChecker {
 
-    private final Map<Coordinates, List<Coordinates>> violations = new 
HashMap<>();
+    private final Map<Coordinates, List<Coordinates>> violations = new 
TreeMap<>();
 
     Map<Coordinates, List<Coordinates>> getViolations() {
         return violations;
@@ -36,6 +36,7 @@ class ExclusionChecker {
     void check(Coordinates artifact, Set<Coordinates> excludes, 
Set<Coordinates> actualDependencies) {
         List<Coordinates> invalidExclusions = excludes.stream()
                 .filter(exclude -> 
actualDependencies.stream().noneMatch(exclude.getExclusionPattern()))
+                .sorted()
                 .collect(toList());
 
         if (!invalidExclusions.isEmpty()) {
diff --git 
a/src/test/java/org/apache/maven/plugins/dependency/exclusion/AnalyzeExclusionsMojoTest.java
 
b/src/test/java/org/apache/maven/plugins/dependency/exclusion/AnalyzeExclusionsMojoTest.java
index 10ce1844..231871cf 100644
--- 
a/src/test/java/org/apache/maven/plugins/dependency/exclusion/AnalyzeExclusionsMojoTest.java
+++ 
b/src/test/java/org/apache/maven/plugins/dependency/exclusion/AnalyzeExclusionsMojoTest.java
@@ -32,6 +32,8 @@ import org.apache.maven.artifact.Artifact;
 import org.apache.maven.execution.MavenSession;
 import org.apache.maven.model.Dependency;
 import org.apache.maven.model.Exclusion;
+import org.apache.maven.model.InputLocation;
+import org.apache.maven.model.InputSource;
 import org.apache.maven.plugin.LegacySupport;
 import org.apache.maven.plugin.MojoExecutionException;
 import org.apache.maven.plugin.logging.Log;
@@ -63,6 +65,10 @@ public class AnalyzeExclusionsMojoTest extends 
AbstractDependencyMojoTestCase {
 
         project = new DependencyProjectStub();
         project.setName("projectName");
+        project.setGroupId("testGroupId");
+        project.setArtifactId("testArtifactId");
+        project.setVersion("1.0.0");
+
         getContainer().addComponent(project, MavenProject.class.getName());
 
         MavenSession session = newMavenSession(project);
@@ -192,6 +198,7 @@ public class AnalyzeExclusionsMojoTest extends 
AbstractDependencyMojoTestCase {
         dependency.setScope("compile");
         dependency.setType("jar");
         dependency.setClassifier("");
+        dependency.setLocation("", new InputLocation(1, 1));
         return dependency;
     }
 
@@ -203,6 +210,7 @@ public class AnalyzeExclusionsMojoTest extends 
AbstractDependencyMojoTestCase {
         dependency.setScope(scope);
         dependency.setType("jar");
         dependency.setClassifier(classifier);
+        dependency.setLocation("", new InputLocation(1, 1));
         return dependency;
     }
 
@@ -210,6 +218,9 @@ public class AnalyzeExclusionsMojoTest extends 
AbstractDependencyMojoTestCase {
         Exclusion exclusion = new Exclusion();
         exclusion.setGroupId(groupId);
         exclusion.setArtifactId(artifactId);
+        InputSource inputSource = new InputSource();
+        inputSource.setModelId("testGroupId:testArtifactId:1.0.0");
+        exclusion.setLocation("", new InputLocation(1, 1, inputSource));
         return exclusion;
     }
 
diff --git 
a/src/test/java/org/apache/maven/plugins/dependency/exclusion/ExclusionCheckerTest.java
 
b/src/test/java/org/apache/maven/plugins/dependency/exclusion/ExclusionCheckerTest.java
index 857fd6f6..70a42411 100644
--- 
a/src/test/java/org/apache/maven/plugins/dependency/exclusion/ExclusionCheckerTest.java
+++ 
b/src/test/java/org/apache/maven/plugins/dependency/exclusion/ExclusionCheckerTest.java
@@ -54,7 +54,7 @@ public class ExclusionCheckerTest {
         assertThat(checker.getViolations())
                 .containsEntry(
                         artifact,
-                        Arrays.asList(coordinates("com.example", "two"), 
coordinates("com.example", "three")));
+                        Arrays.asList(coordinates("com.example", "three"), 
coordinates("com.example", "two")));
     }
 
     @Test

Reply via email to