Added example snippet demonstrating verbose dependency graph aka m2e-like dependency hierarchy
Project: http://git-wip-us.apache.org/repos/asf/maven-resolver/repo Commit: http://git-wip-us.apache.org/repos/asf/maven-resolver/commit/e4260601 Tree: http://git-wip-us.apache.org/repos/asf/maven-resolver/tree/e4260601 Diff: http://git-wip-us.apache.org/repos/asf/maven-resolver/diff/e4260601 Branch: refs/heads/master Commit: e426060176028c5a3aab1850c5fa74b73f68aace Parents: bfcb0fd Author: Benjamin Bentmann <bentm...@sonatype.com> Authored: Sat Aug 17 18:22:06 2013 +0200 Committer: Benjamin Bentmann <bentm...@sonatype.com> Committed: Sat Aug 17 18:22:06 2013 +0200 ---------------------------------------------------------------------- .../eclipse/aether/examples/AllAetherDemos.java | 3 +- .../aether/examples/GetDependencyHierarchy.java | 65 ++++++++++++++++++++ .../util/ConsoleDependencyGraphDumper.java | 49 ++++++++++++++- 3 files changed, 115 insertions(+), 2 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/maven-resolver/blob/e4260601/aether-demo-snippets/src/main/java/org/eclipse/aether/examples/AllAetherDemos.java ---------------------------------------------------------------------- diff --git a/aether-demo-snippets/src/main/java/org/eclipse/aether/examples/AllAetherDemos.java b/aether-demo-snippets/src/main/java/org/eclipse/aether/examples/AllAetherDemos.java index bb85d29..b53079b 100644 --- a/aether-demo-snippets/src/main/java/org/eclipse/aether/examples/AllAetherDemos.java +++ b/aether-demo-snippets/src/main/java/org/eclipse/aether/examples/AllAetherDemos.java @@ -1,5 +1,5 @@ /******************************************************************************* - * Copyright (c) 2010, 2011 Sonatype, Inc. + * Copyright (c) 2010, 2013 Sonatype, Inc. * All rights reserved. This program and the accompanying materials * are made available under the terms of the Eclipse Public License v1.0 * which accompanies this distribution, and is available at @@ -23,6 +23,7 @@ public class AllAetherDemos FindNewestVersion.main( args ); GetDirectDependencies.main( args ); GetDependencyTree.main( args ); + GetDependencyHierarchy.main( args ); ResolveArtifact.main( args ); ResolveTransitiveDependencies.main( args ); InstallArtifacts.main( args ); http://git-wip-us.apache.org/repos/asf/maven-resolver/blob/e4260601/aether-demo-snippets/src/main/java/org/eclipse/aether/examples/GetDependencyHierarchy.java ---------------------------------------------------------------------- diff --git a/aether-demo-snippets/src/main/java/org/eclipse/aether/examples/GetDependencyHierarchy.java b/aether-demo-snippets/src/main/java/org/eclipse/aether/examples/GetDependencyHierarchy.java new file mode 100644 index 0000000..2991714 --- /dev/null +++ b/aether-demo-snippets/src/main/java/org/eclipse/aether/examples/GetDependencyHierarchy.java @@ -0,0 +1,65 @@ +/******************************************************************************* + * Copyright (c) 2013 Sonatype, Inc. + * All rights reserved. This program and the accompanying materials + * are made available under the terms of the Eclipse Public License v1.0 + * which accompanies this distribution, and is available at + * http://www.eclipse.org/legal/epl-v10.html + * + * Contributors: + * Sonatype, Inc. - initial API and implementation + *******************************************************************************/ +package org.eclipse.aether.examples; + +import org.eclipse.aether.DefaultRepositorySystemSession; +import org.eclipse.aether.RepositorySystem; +import org.eclipse.aether.artifact.Artifact; +import org.eclipse.aether.artifact.DefaultArtifact; +import org.eclipse.aether.collection.CollectRequest; +import org.eclipse.aether.collection.CollectResult; +import org.eclipse.aether.examples.util.Booter; +import org.eclipse.aether.examples.util.ConsoleDependencyGraphDumper; +import org.eclipse.aether.repository.RemoteRepository; +import org.eclipse.aether.resolution.ArtifactDescriptorRequest; +import org.eclipse.aether.resolution.ArtifactDescriptorResult; +import org.eclipse.aether.util.graph.manager.DependencyManagerUtils; +import org.eclipse.aether.util.graph.transformer.ConflictResolver; + +/** + * Visualizes the transitive dependencies of an artifact similar to m2e's dependency hierarchy view. + */ +public class GetDependencyHierarchy +{ + + public static void main( String[] args ) + throws Exception + { + System.out.println( "------------------------------------------------------------" ); + System.out.println( GetDependencyHierarchy.class.getSimpleName() ); + + RepositorySystem system = Booter.newRepositorySystem(); + + DefaultRepositorySystemSession session = Booter.newRepositorySystemSession( system ); + + session.setConfigProperty( ConflictResolver.CONFIG_PROP_VERBOSE, true ); + session.setConfigProperty( DependencyManagerUtils.CONFIG_PROP_VERBOSE, true ); + + Artifact artifact = new DefaultArtifact( "org.apache.maven:maven-aether-provider:3.1.0" ); + + RemoteRepository repo = Booter.newCentralRepository(); + + ArtifactDescriptorResult descriptorResult = + system.readArtifactDescriptor( session, + new ArtifactDescriptorRequest().setArtifact( artifact ).addRepository( repo ) ); + + CollectRequest collectRequest = new CollectRequest(); + collectRequest.setRootArtifact( descriptorResult.getArtifact() ); + collectRequest.setDependencies( descriptorResult.getDependencies() ); + collectRequest.setManagedDependencies( descriptorResult.getManagedDependencies() ); + collectRequest.addRepository( repo ); + + CollectResult collectResult = system.collectDependencies( session, collectRequest ); + + collectResult.getRoot().accept( new ConsoleDependencyGraphDumper() ); + } + +} http://git-wip-us.apache.org/repos/asf/maven-resolver/blob/e4260601/aether-demo-snippets/src/main/java/org/eclipse/aether/examples/util/ConsoleDependencyGraphDumper.java ---------------------------------------------------------------------- diff --git a/aether-demo-snippets/src/main/java/org/eclipse/aether/examples/util/ConsoleDependencyGraphDumper.java b/aether-demo-snippets/src/main/java/org/eclipse/aether/examples/util/ConsoleDependencyGraphDumper.java index 254b200..b829990 100644 --- a/aether-demo-snippets/src/main/java/org/eclipse/aether/examples/util/ConsoleDependencyGraphDumper.java +++ b/aether-demo-snippets/src/main/java/org/eclipse/aether/examples/util/ConsoleDependencyGraphDumper.java @@ -15,8 +15,13 @@ import java.util.ArrayList; import java.util.Iterator; import java.util.List; +import org.eclipse.aether.artifact.Artifact; +import org.eclipse.aether.graph.Dependency; import org.eclipse.aether.graph.DependencyNode; import org.eclipse.aether.graph.DependencyVisitor; +import org.eclipse.aether.util.artifact.ArtifactIdUtils; +import org.eclipse.aether.util.graph.manager.DependencyManagerUtils; +import org.eclipse.aether.util.graph.transformer.ConflictResolver; /** * A dependency visitor that dumps the graph to the console. @@ -58,7 +63,49 @@ public class ConsoleDependencyGraphDumper private String formatNode( DependencyNode node ) { - return String.valueOf( node ); + StringBuilder buffer = new StringBuilder( 128 ); + Artifact a = node.getArtifact(); + Dependency d = node.getDependency(); + buffer.append( a ); + if ( d != null && d.getScope().length() > 0 ) + { + buffer.append( " [" ).append( d.getScope() ); + if ( d.isOptional() ) + { + buffer.append( ", optional" ); + } + buffer.append( "]" ); + } + { + String premanaged = DependencyManagerUtils.getPremanagedVersion( node ); + if ( premanaged != null && !premanaged.equals( a.getBaseVersion() ) ) + { + buffer.append( " (version managed from " ).append( premanaged ).append( ")" ); + } + } + { + String premanaged = DependencyManagerUtils.getPremanagedScope( node ); + if ( premanaged != null && !premanaged.equals( d.getScope() ) ) + { + buffer.append( " (scope managed from " ).append( premanaged ).append( ")" ); + } + } + DependencyNode winner = (DependencyNode) node.getData().get( ConflictResolver.NODE_DATA_WINNER ); + if ( winner != null && !ArtifactIdUtils.equalsId( a, winner.getArtifact() ) ) + { + Artifact w = winner.getArtifact(); + buffer.append( " (conflicts with " ); + if ( ArtifactIdUtils.toVersionlessId( a ).equals( ArtifactIdUtils.toVersionlessId( w ) ) ) + { + buffer.append( w.getVersion() ); + } + else + { + buffer.append( w ); + } + buffer.append( ")" ); + } + return buffer.toString(); } public boolean visitLeave( DependencyNode node )