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/06/05 15:24:15 UTC

[maven-dependency-tree] branch fix-tests created (now 3794e8a)

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

rfscholte pushed a change to branch fix-tests
in repository https://gitbox.apache.org/repos/asf/maven-dependency-tree.git.


      at 3794e8a  Enable all tests and fix them. Only verbose-IT is failing

This branch includes the following new commits:

     new 3794e8a  Enable all tests and fix them. Only verbose-IT is failing

The 1 revisions listed above as "new" are entirely new to this
repository and will be described in separate emails.  The revisions
listed as "add" were already present in the repository and have only
been added to this reference.


[maven-dependency-tree] 01/01: Enable all tests and fix them. Only verbose-IT is failing

Posted by rf...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

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

commit 3794e8aad8ad38a7b4920dffdaded843431f6715
Author: rfscholte <rf...@apache.org>
AuthorDate: Sat Jun 5 17:23:59 2021 +0200

    Enable all tests and fix them. Only verbose-IT is failing
---
 pom.xml                                            |  20 ----
 src/it/maven-version/invoker.properties            |   2 +-
 src/it/maven-version/pom.xml                       |  13 +--
 src/it/mshared-167/expected-M2.txt                 |  18 ---
 .../mshared-167/{expected-M3.txt => expected.txt}  |   0
 src/it/mshared-167/invoker.properties              |   2 +-
 src/it/mshared-167/pom.xml                         |  31 +----
 src/it/mshared-167/verify.bsh                      |   9 +-
 src/it/reactor/module-z-deps-y/pom.xml             |  15 +--
 src/it/reactor/verify.bsh                          |   9 +-
 .../invoker.properties                             |   0
 .../resolve-extension => setup-extension}/pom.xml  |   0
 .../ResolveDependenciesLifecycleParticipant.java   |  12 +-
 .../invoker.properties                             |   2 +-
 .../resolve-extension => setup-plugin}/pom.xml     |  72 +++++-------
 .../src/main/java/graph/GraphMojo.java             | 105 +++++++++++++++++
 src/it/verbose/pom.xml                             |  17 +--
 .../graph/DependencyCollectorBuilder.java          |   4 +-
 .../dependency/graph/internal/ArtifactKey.java     |  11 +-
 .../dependency/graph/internal/ConflictData.java    |  77 ++++++++++++
 .../DefaultDependencyCollectorBuilder.java         |   6 +-
 .../graph/internal/DefaultDependencyNode.java      |  67 +++++++----
 .../Maven31DependencyCollectorBuilder.java         |  19 ++-
 .../internal/Maven3DependencyCollectorBuilder.java |   3 +-
 .../graph/internal/VerboseDependencyNode.java      | 129 +++++++++++++++++++++
 25 files changed, 428 insertions(+), 215 deletions(-)

diff --git a/pom.xml b/pom.xml
index 40ffc3b..a99ae47 100644
--- a/pom.xml
+++ b/pom.xml
@@ -116,14 +116,6 @@
         </executions>
       </plugin>
       <plugin>
-        <artifactId>maven-surefire-plugin</artifactId>
-        <configuration>
-          <excludes>
-            <exclude>**/DefaultDependencyTreeBuilderTest*</exclude><!-- FIXME: conflict on DefaultArtifactFactory between maven-core 3.x and maven-artifact 2.x -->
-          </excludes>
-        </configuration>
-      </plugin>
-      <plugin>
         <groupId>org.apache.maven.plugins</groupId>
         <artifactId>maven-invoker-plugin</artifactId>
         <configuration>
@@ -134,18 +126,6 @@
           <postBuildHookScript>verify</postBuildHookScript>
           <localRepositoryPath>${project.build.directory}/local-repo</localRepositoryPath>
           <settingsFile>src/it/settings.xml</settingsFile>
-          <setupIncludes>
-            <setupInclude>reactor/resolve-extension/pom.xml</setupInclude>
-          </setupIncludes>
-          <pomIncludes>
-            <pomInclude>*/pom.xml</pomInclude>
-          </pomIncludes>
-          <pomExcludes> <!-- Tree ITs, must be transformed to graph ITs -->
-            <pomExclude>maven-version/pom.xml</pomExclude>
-            <pomExclude>mshared-167/pom.xml</pomExclude>
-            <pomExclude>reactor/pom.xml</pomExclude>
-            <pomExclude>verbose/pom.xml</pomExclude>
-          </pomExcludes>
           <properties>
             <maven.compiler.source>${maven.compiler.source}</maven.compiler.source>
             <maven.compiler.target>${maven.compiler.target}</maven.compiler.target>
diff --git a/src/it/maven-version/invoker.properties b/src/it/maven-version/invoker.properties
index 6e1a8cd..38ca093 100644
--- a/src/it/maven-version/invoker.properties
+++ b/src/it/maven-version/invoker.properties
@@ -15,4 +15,4 @@
 # specific language governing permissions and limitations
 # under the License.
 
-invoker.goals = clean dependency:tree
+invoker.goals = org.apache.maven.its.dependency-tree:graph-maven-plugin:graph
diff --git a/src/it/maven-version/pom.xml b/src/it/maven-version/pom.xml
index 289994a..2396604 100644
--- a/src/it/maven-version/pom.xml
+++ b/src/it/maven-version/pom.xml
@@ -70,19 +70,12 @@
     <pluginManagement>
       <plugins>
         <plugin>
-          <groupId>org.apache.maven.plugins</groupId>
-          <artifactId>maven-dependency-plugin</artifactId>
-          <version>2.8</version>
+          <groupId>org.apache.maven.its.dependency-tree</groupId>
+          <artifactId>graph-maven-plugin</artifactId>
+          <version>1.0-SNAPSHOT</version>
           <configuration>
             <outputFile>target/tree.txt</outputFile>
           </configuration>
-          <dependencies>
-            <dependency>
-              <groupId>@project.groupId@</groupId>
-              <artifactId>@project.artifactId@</artifactId>
-              <version>@project.version@</version>
-            </dependency>
-          </dependencies>
         </plugin>
       </plugins>
     </pluginManagement>
diff --git a/src/it/mshared-167/expected-M2.txt b/src/it/mshared-167/expected-M2.txt
deleted file mode 100644
index da04271..0000000
--- a/src/it/mshared-167/expected-M2.txt
+++ /dev/null
@@ -1,18 +0,0 @@
-org.apache.maven.its.dependency-tree:mshared-167:jar:1.0-SNAPSHOT
-\- org.apache.xmlgraphics:batik-swing:jar:1.7:compile
-   +- org.apache.xmlgraphics:batik-awt-util:jar:1.7:compile
-   +- org.apache.xmlgraphics:batik-bridge:jar:1.7:compile
-   |  +- org.apache.xmlgraphics:batik-anim:jar:1.7:compile
-   |  +- org.apache.xmlgraphics:batik-parser:jar:1.7:compile
-   |  +- org.apache.xmlgraphics:batik-script:jar:1.7:compile
-   |  +- org.apache.xmlgraphics:batik-xml:jar:1.7:compile
-   |  \- xalan:xalan:jar:2.6.0:compile
-   +- org.apache.xmlgraphics:batik-css:jar:1.7:compile
-   +- org.apache.xmlgraphics:batik-dom:jar:1.7:compile
-   +- org.apache.xmlgraphics:batik-ext:jar:1.7:compile
-   +- org.apache.xmlgraphics:batik-gui-util:jar:1.7:compile
-   +- org.apache.xmlgraphics:batik-gvt:jar:1.7:compile
-   +- org.apache.xmlgraphics:batik-svg-dom:jar:1.7:compile
-   +- org.apache.xmlgraphics:batik-util:jar:1.7:compile
-   +- xml-apis:xml-apis:jar:1.3.04:compile
-   \- xml-apis:xml-apis-ext:jar:1.3.04:compile
diff --git a/src/it/mshared-167/expected-M3.txt b/src/it/mshared-167/expected.txt
similarity index 100%
rename from src/it/mshared-167/expected-M3.txt
rename to src/it/mshared-167/expected.txt
diff --git a/src/it/mshared-167/invoker.properties b/src/it/mshared-167/invoker.properties
index 6e1a8cd..38ca093 100644
--- a/src/it/mshared-167/invoker.properties
+++ b/src/it/mshared-167/invoker.properties
@@ -15,4 +15,4 @@
 # specific language governing permissions and limitations
 # under the License.
 
-invoker.goals = clean dependency:tree
+invoker.goals = org.apache.maven.its.dependency-tree:graph-maven-plugin:graph
diff --git a/src/it/mshared-167/pom.xml b/src/it/mshared-167/pom.xml
index 132e479..9f641f8 100644
--- a/src/it/mshared-167/pom.xml
+++ b/src/it/mshared-167/pom.xml
@@ -35,7 +35,6 @@
 
   <properties>
     <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
-    <outputFile>target/tree-M2.txt</outputFile>
   </properties>
 
   <dependencies>
@@ -50,36 +49,14 @@
     <pluginManagement>
       <plugins>
         <plugin>
-          <groupId>org.apache.maven.plugins</groupId>
-          <artifactId>maven-dependency-plugin</artifactId>
-          <version>2.8</version>
+          <groupId>org.apache.maven.its.dependency-tree</groupId>
+          <artifactId>graph-maven-plugin</artifactId>
+          <version>1.0-SNAPSHOT</version>
           <configuration>
-            <outputFile>${outputFile}</outputFile>
+            <outputFile>target/tree.txt</outputFile>
           </configuration>
-          <dependencies>
-            <dependency>
-              <groupId>@project.groupId@</groupId>
-              <artifactId>@project.artifactId@</artifactId>
-              <version>@project.version@</version>
-            </dependency>
-          </dependencies>
         </plugin>
       </plugins>
     </pluginManagement>
   </build>
-
-  <profiles>
-    <profile>
-      <id>maven-3</id>
-      <activation>
-        <file>
-          <!--  This employs that the basedir expression is only recognized by Maven 3.x (see MNG-2363) -->
-          <exists>${basedir}</exists>
-         </file>
-      </activation>
-      <properties>
-        <outputFile>target/tree-M3.txt</outputFile>
-      </properties>
-    </profile>    
-  </profiles>
 </project>
diff --git a/src/it/mshared-167/verify.bsh b/src/it/mshared-167/verify.bsh
index c5f7249..958b237 100644
--- a/src/it/mshared-167/verify.bsh
+++ b/src/it/mshared-167/verify.bsh
@@ -21,13 +21,8 @@ import java.io.*;
 
 import org.codehaus.plexus.util.*;
 
-File outputFile = new File( basedir, "target/tree-M2.txt" );
-File expectedFile = new File( basedir, "expected-M2.txt" );
-if ( ! outputFile.exists() )
-{
-  outputFile = new File( basedir, "target/tree-M3.txt" );
-  expectedFile = new File( basedir, "expected-M3.txt" );
-}
+File outputFile = new File( basedir, "target/tree.txt" );
+File expectedFile = new File( basedir, "expected.txt" );
 
 String actual = FileUtils.fileRead( outputFile );
 String expected = FileUtils.fileRead( expectedFile );
diff --git a/src/it/reactor/module-z-deps-y/pom.xml b/src/it/reactor/module-z-deps-y/pom.xml
index f6788fc..9279585 100644
--- a/src/it/reactor/module-z-deps-y/pom.xml
+++ b/src/it/reactor/module-z-deps-y/pom.xml
@@ -51,16 +51,9 @@
   <build>
     <plugins>
       <plugin>
-        <groupId>org.apache.maven.plugins</groupId>
-        <artifactId>maven-dependency-plugin</artifactId>
-        <version>2.8</version>
-        <dependencies>
-          <dependency>
-            <groupId>@project.groupId@</groupId>
-            <artifactId>@project.artifactId@</artifactId>
-            <version>@project.version@</version>
-          </dependency>
-        </dependencies>
+        <groupId>org.apache.maven.its.dependency-tree</groupId>
+        <artifactId>graph-maven-plugin</artifactId>
+        <version>1.0-SNAPSHOT</version>
         <executions>
           <execution>
             <id>default</id>
@@ -69,7 +62,7 @@
               <outputFile>target/tree.txt</outputFile>
             </configuration>
             <goals>
-              <goal>tree</goal>
+              <goal>graph</goal>
             </goals>
           </execution>
         </executions>
diff --git a/src/it/reactor/verify.bsh b/src/it/reactor/verify.bsh
index cffa5c5..845be14 100644
--- a/src/it/reactor/verify.bsh
+++ b/src/it/reactor/verify.bsh
@@ -34,11 +34,6 @@ if ( !actual.equals( expected ) )
     throw new Exception( "Unexpected dependency tree" );
 }
 
-String resolved = FileUtils.fileRead( new File( basedir, "resolved-module-z-deps-y.txt" ) );
+File resolved = new File( basedir, "resolved-module-z-deps-y.txt" );
 
-if ( !"Could not resolve following dependencies: [org.apache.maven.its.dependency-tree:module-y-deps-x:jar:1.0-SNAPSHOT (compile), org.apache.maven.its.dependency-tree:module-x:jar:1.0-SNAPSHOT (compile)]".equals( resolved ) )
-{
-    throw new Exception( "unexpected content in resolved-module-z-deps-y.txt written by ResolveDependenciesLifecycleParticipant" );
-}
-
-return true;
+return !resolved.exists();
diff --git a/src/it/reactor/resolve-extension/invoker.properties b/src/it/setup-extension/invoker.properties
similarity index 100%
rename from src/it/reactor/resolve-extension/invoker.properties
rename to src/it/setup-extension/invoker.properties
diff --git a/src/it/reactor/resolve-extension/pom.xml b/src/it/setup-extension/pom.xml
similarity index 100%
copy from src/it/reactor/resolve-extension/pom.xml
copy to src/it/setup-extension/pom.xml
diff --git a/src/it/reactor/resolve-extension/src/main/java/org/apache/maven/its/deptree/ResolveDependenciesLifecycleParticipant.java b/src/it/setup-extension/src/main/java/org/apache/maven/its/deptree/ResolveDependenciesLifecycleParticipant.java
similarity index 88%
rename from src/it/reactor/resolve-extension/src/main/java/org/apache/maven/its/deptree/ResolveDependenciesLifecycleParticipant.java
rename to src/it/setup-extension/src/main/java/org/apache/maven/its/deptree/ResolveDependenciesLifecycleParticipant.java
index fba7dfa..8ae9c42 100644
--- a/src/it/reactor/resolve-extension/src/main/java/org/apache/maven/its/deptree/ResolveDependenciesLifecycleParticipant.java
+++ b/src/it/setup-extension/src/main/java/org/apache/maven/its/deptree/ResolveDependenciesLifecycleParticipant.java
@@ -76,16 +76,6 @@ public final class ResolveDependenciesLifecycleParticipant extends AbstractMaven
             log.info( "building dependency graph for project " + project.getArtifact() );
 
             File resolved = new File( basedir, "resolved-" + project.getArtifactId() + ".txt" );
-            try
-            {
-                log.info( "building with reactor projects" );
-                // No need to filter our search. We want to resolve all artifacts.
-                dependencyGraphBuilder.buildDependencyGraph( buildingRequest, null, projects );
-            }
-            catch ( DependencyGraphBuilderException e )
-            {
-                throw new MavenExecutionException( "Could not resolve dependencies for project: " + project, e );
-            }
 
             try
             {
@@ -95,7 +85,7 @@ public final class ResolveDependenciesLifecycleParticipant extends AbstractMaven
             }
             catch ( DependencyGraphBuilderException e )
             {
-                log.info( "expected resolution failure: " + e.getMessage() );
+                log.info( "unexpected resolution failure: " + e.getMessage() );
 
                 try
                 {
diff --git a/src/it/mshared-167/invoker.properties b/src/it/setup-plugin/invoker.properties
similarity index 95%
copy from src/it/mshared-167/invoker.properties
copy to src/it/setup-plugin/invoker.properties
index 6e1a8cd..d5d6ca5 100644
--- a/src/it/mshared-167/invoker.properties
+++ b/src/it/setup-plugin/invoker.properties
@@ -15,4 +15,4 @@
 # specific language governing permissions and limitations
 # under the License.
 
-invoker.goals = clean dependency:tree
+invoker.goals = install
diff --git a/src/it/reactor/resolve-extension/pom.xml b/src/it/setup-plugin/pom.xml
similarity index 65%
rename from src/it/reactor/resolve-extension/pom.xml
rename to src/it/setup-plugin/pom.xml
index f71bd43..1a0098a 100644
--- a/src/it/reactor/resolve-extension/pom.xml
+++ b/src/it/setup-plugin/pom.xml
@@ -24,66 +24,48 @@
   <modelVersion>4.0.0</modelVersion>
 
   <groupId>org.apache.maven.its.dependency-tree</groupId>
-  <artifactId>resolve-extension</artifactId>
+  <artifactId>graph-maven-plugin</artifactId>
   <version>1.0-SNAPSHOT</version>
-  <packaging>jar</packaging>
-
-  <name>Resolve Dependency from Reactor Check Extension</name>
-  <description>
-    Extension to check that maven-dependency-tree resolves deps that only exist within the reactor.
-  </description>
+  <packaging>maven-plugin</packaging>
 
   <properties>
     <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
-    <maven.version>3.0.4</maven.version>
   </properties>
 
-  <dependencyManagement>
-  </dependencyManagement>
+  <build>
+    <plugins>
+      <plugin>
+        <groupId>org.apache.maven.plugins</groupId>
+        <artifactId>maven-plugin-plugin</artifactId>
+        <version>3.6.1</version>
+        <executions>
+          <execution>
+            <id>default-descriptor</id>
+            <phase>process-classes</phase>
+          </execution>
+        </executions>
+      </plugin>
+    </plugins>
+  </build>
 
   <dependencies>
     <dependency>
-      <groupId>org.apache.maven</groupId>
-      <artifactId>maven-core</artifactId>
-      <version>${maven.version}</version>
-      <scope>provided</scope>
+      <groupId>org.apache.maven.shared</groupId>
+      <artifactId>maven-dependency-tree</artifactId>
+      <version>@project.version@</version>
     </dependency>
     <dependency>
-      <groupId>org.codehaus.plexus</groupId>
-      <artifactId>plexus-container-default</artifactId>
-      <version>1.0-alpha-9-stable-1</version>
+      <groupId>org.apache.maven.plugin-tools</groupId>
+      <artifactId>maven-plugin-annotations</artifactId>
+      <version>3.5.2</version>
       <scope>provided</scope>
     </dependency>
     <dependency>
-      <groupId>org.apache.maven.shared</groupId>
-      <artifactId>maven-dependency-tree</artifactId>
-      <version>@project.version@</version>
+      <groupId>org.apache.maven</groupId>
+      <artifactId>maven-core</artifactId>
+      <version>3.0.5</version>
+      <scope>provided</scope>
     </dependency>
   </dependencies>
 
-  <build>
-    <pluginManagement>
-      <plugins>
-        <plugin>
-          <groupId>org.codehaus.plexus</groupId>
-          <artifactId>plexus-component-metadata</artifactId>
-          <version>1.7.1</version>
-        </plugin>
-      </plugins>
-    </pluginManagement>
-
-    <plugins>
-      <plugin>
-        <groupId>org.codehaus.plexus</groupId>
-        <artifactId>plexus-component-metadata</artifactId>
-        <executions>
-          <execution>
-            <goals>
-              <goal>generate-metadata</goal>
-            </goals>
-          </execution>
-        </executions>
-      </plugin>
-    </plugins>
-  </build>
 </project>
diff --git a/src/it/setup-plugin/src/main/java/graph/GraphMojo.java b/src/it/setup-plugin/src/main/java/graph/GraphMojo.java
new file mode 100644
index 0000000..6cdc0a2
--- /dev/null
+++ b/src/it/setup-plugin/src/main/java/graph/GraphMojo.java
@@ -0,0 +1,105 @@
+package graph;
+
+import java.io.File;
+import java.io.FileWriter;
+import java.io.Writer;
+
+/*
+ * 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.
+ */
+
+import org.apache.maven.artifact.resolver.filter.ArtifactFilter;
+import org.apache.maven.execution.MavenSession;
+import org.apache.maven.plugin.AbstractMojo;
+import org.apache.maven.plugins.annotations.Component;
+import org.apache.maven.plugins.annotations.Mojo;
+import org.apache.maven.plugins.annotations.Parameter;
+import org.apache.maven.project.DefaultProjectBuildingRequest;
+import org.apache.maven.project.MavenProject;
+import org.apache.maven.project.ProjectBuildingRequest;
+import org.apache.maven.plugin.MojoExecutionException;
+import org.apache.maven.shared.dependency.graph.DependencyCollectorBuilder;
+import org.apache.maven.shared.dependency.graph.DependencyGraphBuilder;
+import org.apache.maven.shared.dependency.graph.DependencyNode;
+import org.apache.maven.shared.dependency.graph.traversal.SerializingDependencyNodeVisitor;
+
+@Mojo( name = "graph" )
+public class GraphMojo
+    extends AbstractMojo
+{
+
+    @Parameter( defaultValue = "${session}", readonly = true, required = true )
+    private MavenSession session;
+
+    @Parameter( defaultValue = "${project}", readonly = true, required = true )
+    private MavenProject project;
+    
+    @Parameter
+    private ArtifactFilter artifactFilter;
+    
+    @Parameter
+    private File outputFile;
+    
+    @Parameter
+    private boolean verbose;
+
+    @Component
+    private DependencyGraphBuilder graphBuilder;
+
+    @Component
+    private DependencyCollectorBuilder collectorBuilder;
+    
+    @Override
+    public void execute() throws MojoExecutionException
+    {
+        // Code currently assumes project has been set...
+        ProjectBuildingRequest buildingRequest = new DefaultProjectBuildingRequest( session.getProjectBuildingRequest() );
+        buildingRequest.setProject( project );
+        
+        try
+        {
+            DependencyNode node;
+            if ( verbose )
+            {
+                node = collectorBuilder.collectDependencyGraph( buildingRequest, artifactFilter );
+            }
+            else
+            {
+                node = graphBuilder.buildDependencyGraph( buildingRequest, artifactFilter );
+            }
+            
+            if ( outputFile != null )
+            {
+                outputFile.getParentFile().mkdirs();
+
+                try ( Writer writer = new FileWriter( outputFile ) )
+                {
+                    node.accept( new SerializingDependencyNodeVisitor( writer,
+                                                                       SerializingDependencyNodeVisitor.STANDARD_TOKENS ) );
+                }
+            }
+        }
+        catch ( Exception e ) // Catch all is good enough for IT
+        {
+            throw new MojoExecutionException( "Failed to build dependency graph", e );
+        }
+    }
+
+    
+    
+}
\ No newline at end of file
diff --git a/src/it/verbose/pom.xml b/src/it/verbose/pom.xml
index c57704f..26a918a 100644
--- a/src/it/verbose/pom.xml
+++ b/src/it/verbose/pom.xml
@@ -81,16 +81,9 @@
   <build>
     <plugins>
       <plugin>
-        <groupId>org.apache.maven.plugins</groupId>
-        <artifactId>maven-dependency-plugin</artifactId>
-        <version>2.8</version>
-        <dependencies>
-          <dependency>
-            <groupId>@project.groupId@</groupId>
-            <artifactId>@project.artifactId@</artifactId>
-            <version>@project.version@</version>
-          </dependency>
-        </dependencies>
+        <groupId>org.apache.maven.its.dependency-tree</groupId>
+        <artifactId>graph-maven-plugin</artifactId>
+        <version>1.0-SNAPSHOT</version>
         <executions>
           <execution>
             <id>verbose</id>
@@ -100,7 +93,7 @@
               <verbose>true</verbose>
             </configuration>
             <goals>
-              <goal>tree</goal>
+              <goal>graph</goal>
             </goals>
           </execution>
           <execution>
@@ -110,7 +103,7 @@
               <outputFile>target/tree-default.txt</outputFile>
             </configuration>
             <goals>
-              <goal>tree</goal>
+              <goal>graph</goal>
             </goals>
           </execution>
         </executions>
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 43cfb40..516a6f6 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
@@ -19,7 +19,6 @@ package org.apache.maven.shared.dependency.graph;
  * under the License.
  */
 
-import org.apache.maven.artifact.repository.ArtifactRepository;
 import org.apache.maven.artifact.resolver.filter.ArtifactFilter;
 import org.apache.maven.project.ProjectBuildingRequest;
 
@@ -43,8 +42,7 @@ public interface DependencyCollectorBuilder
      * @return the raw dependency tree
      * @throws DependencyGraphBuilderException if some of the dependencies could not be collected.
      */
-    DependencyNode collectDependencyGraph( ArtifactRepository localRepository, ProjectBuildingRequest buildingRequest,
-                                         ArtifactFilter filter )
+    DependencyNode collectDependencyGraph( ProjectBuildingRequest buildingRequest, ArtifactFilter filter )
         throws DependencyCollectorBuilderException;
 
 }
diff --git a/src/main/java/org/apache/maven/shared/dependency/graph/internal/ArtifactKey.java b/src/main/java/org/apache/maven/shared/dependency/graph/internal/ArtifactKey.java
index 885796f..40f9f3c 100644
--- a/src/main/java/org/apache/maven/shared/dependency/graph/internal/ArtifactKey.java
+++ b/src/main/java/org/apache/maven/shared/dependency/graph/internal/ArtifactKey.java
@@ -19,6 +19,8 @@ package org.apache.maven.shared.dependency.graph.internal;
  * under the License.
  */
 
+import java.util.Objects;
+
 import org.apache.maven.project.MavenProject;
 
 /**
@@ -26,17 +28,17 @@ import org.apache.maven.project.MavenProject;
  */
 final class ArtifactKey
 {
-    private static final int HASH_PRIME = 31;
-
     private final String groupId;
     private final String artifactId;
     private final String version;
+    private final int hashCode;
 
     ArtifactKey( String groupId, String artifactId, String version )
     {
         this.groupId = groupId;
         this.artifactId = artifactId;
         this.version = version;
+        this.hashCode = Objects.hash( groupId, artifactId, version );
     }
 
     ArtifactKey( MavenProject project )
@@ -65,9 +67,6 @@ final class ArtifactKey
     @Override
     public int hashCode()
     {
-        int result = groupId.hashCode();
-        result = HASH_PRIME * result + artifactId.hashCode();
-        result = HASH_PRIME * result + version.hashCode();
-        return result;
+        return hashCode;
     }
 }
diff --git a/src/main/java/org/apache/maven/shared/dependency/graph/internal/ConflictData.java b/src/main/java/org/apache/maven/shared/dependency/graph/internal/ConflictData.java
new file mode 100644
index 0000000..4b2ac2a
--- /dev/null
+++ b/src/main/java/org/apache/maven/shared/dependency/graph/internal/ConflictData.java
@@ -0,0 +1,77 @@
+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.
+ */
+
+/**
+ * Excplicit subset of Aethers DependencyNode.getData()
+ * 
+ * @author Robert Scholte
+ *
+ */
+public class ConflictData
+{
+    private String winnerVersion;
+
+    private String originalScope;
+    
+    private String ignoredScope;
+    
+    private Boolean originaOptionality;
+    
+    public ConflictData( String winnerVersion )
+    {
+        this.winnerVersion = winnerVersion;
+    }
+    
+    public String getWinnerVersion()
+    {
+        return winnerVersion;
+    }
+    
+    public String getOriginalScope()
+    {
+        return originalScope;
+    }
+
+    public void setOriginalScope( String originalScope )
+    {
+        this.originalScope = originalScope;
+    }
+
+    public Boolean getOriginaOptionality()
+    {
+        return originaOptionality;
+    }
+
+    public void setOriginaOptionality( Boolean originaOptionality )
+    {
+        this.originaOptionality = originaOptionality;
+    }
+
+    public String getIgnoredScope()
+    {
+        return ignoredScope;
+    }
+
+    public void setIgnoredScope( String ignoredScope )
+    {
+        this.ignoredScope = ignoredScope;
+    }
+}
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 e29cc9d..13b3a51 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
@@ -19,7 +19,6 @@ package org.apache.maven.shared.dependency.graph.internal;
  * under the License.
  */
 
-import org.apache.maven.artifact.repository.ArtifactRepository;
 import org.apache.maven.artifact.resolver.filter.ArtifactFilter;
 import org.apache.maven.project.MavenProject;
 import org.apache.maven.project.ProjectBuildingRequest;
@@ -50,8 +49,7 @@ public class DefaultDependencyCollectorBuilder
     protected PlexusContainer container;
 
     @Override
-    public DependencyNode collectDependencyGraph( ArtifactRepository localRepository,
-                                                ProjectBuildingRequest buildingRequest, ArtifactFilter filter )
+    public DependencyNode collectDependencyGraph( ProjectBuildingRequest buildingRequest, ArtifactFilter filter )
         throws DependencyCollectorBuilderException
     {
         try
@@ -70,7 +68,7 @@ public class DefaultDependencyCollectorBuilder
                     + effectiveGraphBuilder.getClass().getSimpleName() );
             }
 
-            return effectiveGraphBuilder.collectDependencyGraph( localRepository, buildingRequest, filter );
+            return effectiveGraphBuilder.collectDependencyGraph( buildingRequest, filter );
         }
         catch ( ComponentLookupException e )
         {
diff --git a/src/main/java/org/apache/maven/shared/dependency/graph/internal/DefaultDependencyNode.java b/src/main/java/org/apache/maven/shared/dependency/graph/internal/DefaultDependencyNode.java
index 440eaea..3b4cc5a 100644
--- a/src/main/java/org/apache/maven/shared/dependency/graph/internal/DefaultDependencyNode.java
+++ b/src/main/java/org/apache/maven/shared/dependency/graph/internal/DefaultDependencyNode.java
@@ -78,6 +78,16 @@ public class DefaultDependencyNode implements DependencyNode
         this.optional = optional;
         this.exclusions = exclusions;
     }
+    
+    // user to refer to winner
+    public DefaultDependencyNode( Artifact artifact )
+    {
+        this.artifact = artifact;
+        this.parent = null;
+        this.premanagedScope = null;
+        this.premanagedVersion = null;
+        this.versionConstraint = null;
+    }
 
     /**
      * Applies the specified dependency node visitor to this dependency node and its children.
@@ -179,29 +189,29 @@ public class DefaultDependencyNode implements DependencyNode
 
         buffer.append( artifact );
 
-        ItemAppender appender = new ItemAppender( buffer, " (", "; ", ")" );
-
-        if ( getPremanagedVersion() != null )
-        {
-            appender.append( "version managed from ", getPremanagedVersion() );
-        }
-
-        if ( getPremanagedScope() != null )
-        {
-            appender.append( "scope managed from ", getPremanagedScope() );
-        }
-
-        if ( getVersionConstraint() != null )
-        {
-            appender.append( "version selected from constraint ", getVersionConstraint() );
-        }
-
-
-        appender.flush();
-        if ( optional != null && optional )
-        {
-            buffer.append( " (optional) " );
-        }
+//        ItemAppender appender = new ItemAppender( buffer, " (", "; ", ")" );
+//
+//        if ( getPremanagedVersion() != null )
+//        {
+//            appender.append( "version managed from ", getPremanagedVersion() );
+//        }
+//
+//        if ( getPremanagedScope() != null )
+//        {
+//            appender.append( "scope managed from ", getPremanagedScope() );
+//        }
+//
+//        if ( getVersionConstraint() != null )
+//        {
+//            appender.append( "version selected from constraint ", getVersionConstraint() );
+//        }
+//
+//
+//        appender.flush();
+//        if ( optional != null && optional )
+//        {
+//            buffer.append( " (optional) " );
+//        }
 
         return buffer.toString();
     }
@@ -209,7 +219,7 @@ public class DefaultDependencyNode implements DependencyNode
     /**
      * Utility class to concatenate a number of parameters with separator tokens.
      */
-    private static class ItemAppender
+    static class ItemAppender
     {
         private StringBuilder buffer;
 
@@ -231,6 +241,15 @@ public class DefaultDependencyNode implements DependencyNode
             appended = false;
         }
 
+        public ItemAppender append( String item1 )
+        {
+            appendToken();
+
+            buffer.append( item1 );
+
+            return this;
+        }
+
         public ItemAppender append( String item1, String item2 )
         {
             appendToken();
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 15c173d..a09da7b 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
@@ -89,8 +89,7 @@ public class Maven31DependencyCollectorBuilder
     }
 
     @Override
-    public DependencyNode collectDependencyGraph( ArtifactRepository localRepository,
-                                                  ProjectBuildingRequest buildingRequest, ArtifactFilter filter )
+    public DependencyNode collectDependencyGraph( ProjectBuildingRequest buildingRequest, ArtifactFilter filter )
         throws DependencyCollectorBuilderException
     {
         DefaultRepositorySystemSession session = null;
@@ -276,10 +275,20 @@ public class Maven31DependencyCollectorBuilder
             }
         }
 
-        DefaultDependencyNode current =
-            new DefaultDependencyNode( parent, artifact, premanagedVersion, premanagedScope,
+        org.eclipse.aether.graph.DependencyNode winner =
+            (org.eclipse.aether.graph.DependencyNode) node.getData().get( ConflictResolver.NODE_DATA_WINNER );
+        String winnerNode = null;
+        if ( winner != null )
+        {
+            winnerNode = winner.getArtifact().getBaseVersion();
+        }
+        
+        ConflictData data = new ConflictData( winnerNode );
+        
+        VerboseDependencyNode current =
+            new VerboseDependencyNode( parent, artifact, premanagedVersion, premanagedScope,
                                        getVersionSelectedFromRange( node.getVersionConstraint() ), optional,
-                                       exclusions );
+                                       exclusions, data );
 
         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/Maven3DependencyCollectorBuilder.java b/src/main/java/org/apache/maven/shared/dependency/graph/internal/Maven3DependencyCollectorBuilder.java
index 24c0d65..272fa08 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
@@ -89,8 +89,7 @@ public class Maven3DependencyCollectorBuilder
     }
 
     @Override
-    public DependencyNode collectDependencyGraph( ArtifactRepository localRepository,
-                                                ProjectBuildingRequest buildingRequest, ArtifactFilter filter )
+    public DependencyNode collectDependencyGraph( ProjectBuildingRequest buildingRequest, ArtifactFilter filter )
         throws DependencyCollectorBuilderException
     {
         try
diff --git a/src/main/java/org/apache/maven/shared/dependency/graph/internal/VerboseDependencyNode.java b/src/main/java/org/apache/maven/shared/dependency/graph/internal/VerboseDependencyNode.java
new file mode 100644
index 0000000..79b7723
--- /dev/null
+++ b/src/main/java/org/apache/maven/shared/dependency/graph/internal/VerboseDependencyNode.java
@@ -0,0 +1,129 @@
+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.
+ */
+
+import java.util.List;
+
+import org.apache.maven.artifact.Artifact;
+import org.apache.maven.model.Exclusion;
+import org.apache.maven.shared.dependency.graph.DependencyNode;
+
+class VerboseDependencyNode
+    extends DefaultDependencyNode
+{
+
+    private final ConflictData data;
+    
+    VerboseDependencyNode( DependencyNode parent, Artifact artifact, String premanagedVersion,
+                                  String premanagedScope, String versionConstraint, Boolean optional,
+                                  List<Exclusion> exclusions, ConflictData data )
+    {
+        super( parent, artifact, premanagedVersion, premanagedScope, versionConstraint, optional, exclusions );
+
+        this.data = data;
+    }
+    
+    @Override
+    public String toNodeString()
+    {
+        StringBuilder buffer = new StringBuilder();
+
+        boolean included = ( data.getWinnerVersion() == null );
+
+        if ( !included )
+        {
+            buffer.append( '(' );
+        }
+
+        buffer.append( getArtifact() );
+
+        ItemAppender appender = new ItemAppender( buffer, included ? " (" : " - ", "; ", included ? ")" : "" );
+
+        if ( getPremanagedVersion() != null )
+        {
+            appender.append( "version managed from ", getPremanagedVersion() );
+        }
+
+        if ( getPremanagedScope() != null )
+        {
+            appender.append( "scope managed from ", getPremanagedScope() );
+        }
+
+        if ( data.getOriginalScope() != null )
+        {
+            appender.append( "scope updated from ", data.getOriginalScope() );
+        }
+
+        if ( data.getIgnoredScope() != null )
+        {
+            appender.append( "scope not updated to ", data.getIgnoredScope() );
+        }
+
+//        if ( getVersionSelectedFromRange() != null )
+//        {
+//            appender.append( "version selected from range ", getVersionSelectedFromRange().toString() );
+//            appender.append( "available versions ", getAvailableVersions().toString() );
+//        }
+
+        if ( data.getWinnerVersion() != null )
+        {
+            String winnerVersion = data.getWinnerVersion(); 
+            if ( winnerVersion.equals( getArtifact().getVersion() ) )
+            {
+              appender.append( "omitted for duplicate" );
+            }
+            else
+            {
+              appender.append( "omitted for conflict with ", winnerVersion );
+            }
+        }
+        
+//        switch ( data.getState() )
+//        {
+//            case ConflictData.INCLUDED:
+//                break;
+//
+//            case ConflictData.OMITTED_FOR_DUPLICATE:
+//                appender.append( "omitted for duplicate" );
+//                break;
+//
+////            case ConflictData.OMITTED_FOR_CONFLICT:
+////                appender.append( "omitted for conflict with ", relatedArtifact.getVersion() );
+////                break;
+//
+//            case ConflictData.OMITTED_FOR_CYCLE:
+//                appender.append( "omitted for cycle" );
+//                break;
+//
+//            default:
+//                break;
+//        }
+
+        appender.flush();
+
+        if ( !included )
+        {
+            buffer.append( ')' );
+        }
+
+        return buffer.toString();
+    }
+
+}