refactored code to better show the logic
git-svn-id: https://svn.apache.org/repos/asf/maven/shared/trunk@1597312 13f79535-47bb-0310-9956-ffa450edef68
diff --git a/src/it/reactor/verify.bsh b/src/it/reactor/verify.bsh
index 17c1e47..cffa5c5 100644
--- a/src/it/reactor/verify.bsh
+++ b/src/it/reactor/verify.bsh
@@ -36,7 +36,7 @@
String resolved = FileUtils.fileRead( new File( basedir, "resolved-module-z-deps-y.txt" ) );
-if ( !"Could not resolve the 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 ) )
+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" );
}
diff --git a/src/main/java/org/apache/maven/shared/dependency/graph/DependencyGraphBuilder.java b/src/main/java/org/apache/maven/shared/dependency/graph/DependencyGraphBuilder.java
index c17c904..c5100ce 100644
--- a/src/main/java/org/apache/maven/shared/dependency/graph/DependencyGraphBuilder.java
+++ b/src/main/java/org/apache/maven/shared/dependency/graph/DependencyGraphBuilder.java
@@ -46,14 +46,14 @@
/**
* Build the dependency graph, with a hack to include dependencies contained in the reactor projects
* but that are not yet compiled, which is the minimum prerequisite for Maven core's
- * ReactorReader to find them. Notice that this hack doesn't work for Maven 2.
+ * ReactorReader to find them. Notice that this hack hasn't been done for Maven 2.
* <p>Notice: If Maven core did collect instead of resolving dependencies (ie did not try to get the
* artifacts but only the poms), probably this hack wouldn't be necessary even for people requiring
* the dependency graph before compiling. TODO: for Maven 3, use Aether to collect dependencies.</p>
*
* @param project the project
* @param filter artifact filter (can be <code>null</code>)
- * @param reactorProjects Collection of those projects contained in the reactor.
+ * @param reactorProjects Collection of those projects contained in the reactor (can be <code>null</code>).
* @return the dependency graph
* @throws DependencyGraphBuilderException if some of the dependencies could not be resolved.
*/
diff --git a/src/main/java/org/apache/maven/shared/dependency/graph/internal/DefaultDependencyGraphBuilder.java b/src/main/java/org/apache/maven/shared/dependency/graph/internal/DefaultDependencyGraphBuilder.java
index 85bea70..122d624 100644
--- a/src/main/java/org/apache/maven/shared/dependency/graph/internal/DefaultDependencyGraphBuilder.java
+++ b/src/main/java/org/apache/maven/shared/dependency/graph/internal/DefaultDependencyGraphBuilder.java
@@ -63,7 +63,7 @@
public DependencyNode buildDependencyGraph( MavenProject project, ArtifactFilter filter )
throws DependencyGraphBuilderException
{
- return buildDependencyGraph( project, filter, Collections.<MavenProject>emptyList() );
+ return buildDependencyGraph( project, filter, null );
}
/**
@@ -71,7 +71,7 @@
*
* @param project the project
* @param filter artifact filter (can be <code>null</code>)
- * @param reactorProjects Collection of those projects contained in the reactor.
+ * @param reactorProjects Collection of those projects contained in the reactor (can be <code>null</code>)
* @return DependencyNode containing the dependency graph.
* @throws DependencyGraphBuilderException if some of the dependencies could not be resolved.
*/
diff --git a/src/main/java/org/apache/maven/shared/dependency/graph/internal/Maven2DependencyGraphBuilder.java b/src/main/java/org/apache/maven/shared/dependency/graph/internal/Maven2DependencyGraphBuilder.java
index 6386860..bb0fbca 100644
--- a/src/main/java/org/apache/maven/shared/dependency/graph/internal/Maven2DependencyGraphBuilder.java
+++ b/src/main/java/org/apache/maven/shared/dependency/graph/internal/Maven2DependencyGraphBuilder.java
@@ -73,12 +73,13 @@
/**
* Builds the dependency graph for Maven 2.
- *
- * NB the reactor projects are ignored as Maven 2 is not able to resolve projects from the reactor.
- *
- * @param project the project
- * @param filter artifact filter (can be <code>null</code>)
- * @param reactorProjects Ignored.
+ * <p>
+ * notice: the reactor projects are ignored as no work has been done to try to do the same hack as with Maven 3.
+ * </p>
+ *
+ * @param project the project
+ * @param filter artifact filter (can be <code>null</code>)
+ * @param reactorProjects Ignored.
* @return DependencyNode containing the dependency graph.
* @throws DependencyGraphBuilderException if some of the dependencies could not be resolved.
*/
@@ -86,7 +87,11 @@
Collection<MavenProject> reactorProjects )
throws DependencyGraphBuilderException
{
- getLogger().warn( "Reactor projects ignored - reactor dependencies cannot be resolved in Maven2" );
+ if ( reactorProjects != null )
+ {
+ getLogger().warn( "Reactor projects ignored - reactor project collection not implemented" );
+ }
+
return buildDependencyGraph( project, filter );
}
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 9687a71..4256816 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
@@ -76,15 +76,16 @@
public DependencyNode buildDependencyGraph( MavenProject project, ArtifactFilter filter )
throws DependencyGraphBuilderException
{
- return buildDependencyGraph( project, filter, Collections.<MavenProject>emptyList() );
+ return buildDependencyGraph( project, filter, null );
}
/**
- * Builds the dependency graph for Maven 3.1+ including any dependencies from any projects in the reactor.
+ * Builds the dependency graph for Maven 3.1+, eventually hacking for collecting projects from
+ * reactor not yet built.
*
* @param project the project
* @param filter artifact filter (can be <code>null</code>)
- * @param reactorProjects Collection of those projects contained in the reactor.
+ * @param reactorProjects Collection of those projects contained in the reactor (can be <code>null</code>).
* @return DependencyNode containing the dependency graph.
* @throws DependencyGraphBuilderException if some of the dependencies could not be resolved.
*/
@@ -127,51 +128,51 @@
}
catch ( DependencyResolutionException e )
{
- // Ignore any resolution failure for deps that are part of the reactor but have not yet been built.
- // NB Typing has been removed because DependencyResolutionResult returns Sonatype Aether in 3.0.4 and
- // Eclipse Aether in 3.1.1 and while dep-tree is a single module we can only compile against one of them.
- //
- // NB While applying this code to Maven3DependencyGraphBuilder is trivial it won't work because
- // in Maven 3, MavenProject.getProjectReferences isn't populated. So we would need to have the reactor
- // modules passed in separately which would change the API for DependencyGraphBuilder. If
- // MavenProject.getProjectReferences were populated (like it should be) then this would work for Maven3 too.
- //
- // NB There doesn't seem to be any way to apply this to Maven2DependencyGraphBuilder as there is no
- // concept of partial resolution like there is is 3 and 3.1
- final DependencyResolutionResult result = e.getResult();
-
- final List<Dependency> reactorDeps =
- getReactorDependencies( reactorProjects, result.getUnresolvedDependencies() );
- result.getUnresolvedDependencies().removeAll( reactorDeps );
- Invoker.invoke( result.getResolvedDependencies(), "addAll", Collection.class, reactorDeps );
-
- if ( !result.getUnresolvedDependencies().isEmpty() )
+ if ( reactorProjects == null )
{
- throw new DependencyGraphBuilderException( "Could not resolve the following dependencies: "
- + result.getUnresolvedDependencies(), e );
+ throw new DependencyGraphBuilderException( "Could not resolve following dependencies: "
+ + e.getResult().getUnresolvedDependencies(), e );
}
- getLogger().debug( "Resolved dependencies after ignoring reactor dependencies: " + reactorDeps );
-
- return result;
+ // try collecting from reactor
+ return collectDependenciesFromReactor( e, reactorProjects );
}
}
+ private DependencyResolutionResult collectDependenciesFromReactor( DependencyResolutionException e,
+ Collection<MavenProject> reactorProjects )
+ throws DependencyGraphBuilderException
+ {
+ DependencyResolutionResult result = e.getResult();
+
+ List<Dependency> reactorDeps = getReactorDependencies( reactorProjects, result.getUnresolvedDependencies() );
+ result.getUnresolvedDependencies().removeAll( reactorDeps );
+ Invoker.invoke( result.getResolvedDependencies(), "addAll", Collection.class, reactorDeps );
+
+ if ( !result.getUnresolvedDependencies().isEmpty() )
+ {
+ throw new DependencyGraphBuilderException( "Could not resolve nor collect following dependencies: "
+ + result.getUnresolvedDependencies(), e );
+ }
+
+ return result;
+ }
+
private List<Dependency> getReactorDependencies( Collection<MavenProject> reactorProjects, List<?> dependencies )
{
- final Set<ArtifactKey> reactorProjectsIds = new HashSet<ArtifactKey>();
- for ( final MavenProject project : reactorProjects )
+ Set<ArtifactKey> reactorProjectsIds = new HashSet<ArtifactKey>();
+ for ( MavenProject project : reactorProjects )
{
reactorProjectsIds.add( new ArtifactKey( project ) );
}
- final List<Dependency> reactorDeps = new ArrayList<Dependency>();
- for ( final Object untypedDependency : dependencies )
+ List<Dependency> reactorDeps = new ArrayList<Dependency>();
+ for ( Object untypedDependency : dependencies )
{
- final Dependency dependency = (Dependency) untypedDependency;
- final org.eclipse.aether.artifact.Artifact depArtifact = dependency.getArtifact();
+ Dependency dependency = (Dependency) untypedDependency;
+ org.eclipse.aether.artifact.Artifact depArtifact = dependency.getArtifact();
- final ArtifactKey key =
+ ArtifactKey key =
new ArtifactKey( depArtifact.getGroupId(), depArtifact.getArtifactId(), depArtifact.getVersion() );
if ( reactorProjectsIds.contains( key ) )
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 7718057..f47363a 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
@@ -75,15 +75,16 @@
public DependencyNode buildDependencyGraph( MavenProject project, ArtifactFilter filter )
throws DependencyGraphBuilderException
{
- return buildDependencyGraph( project, filter, Collections.<MavenProject>emptyList() );
+ return buildDependencyGraph( project, filter, null );
}
/**
- * Builds the dependency graph for Maven 3 including any dependencies from any projects in the reactor.
+ * Builds the dependency graph for Maven 3, eventually hacking for collecting projects from
+ * reactor not yet built.
*
* @param project the project
* @param filter artifact filter (can be <code>null</code>)
- * @param reactorProjects Collection of those projects contained in the reactor.
+ * @param reactorProjects Collection of those projects contained in the reactor (can be <code>null</code>).
* @return DependencyNode containing the dependency graph.
* @throws DependencyGraphBuilderException if some of the dependencies could not be resolved.
*/
@@ -97,7 +98,7 @@
DependencyResolutionRequest request =
new DefaultDependencyResolutionRequest( project, projectBuildingRequest.getRepositorySession() );
- final DependencyResolutionResult result = resolveDependencies( request, reactorProjects );
+ DependencyResolutionResult result = resolveDependencies( request, reactorProjects );
return buildDependencyNode( null, result.getDependencyGraph(), project.getArtifact(), filter );
}
@@ -112,52 +113,53 @@
}
catch ( DependencyResolutionException e )
{
- // Ignore any resolution failure for deps that are part of the reactor but have not yet been built.
- // NB Typing has been removed because DependencyResolutionResult returns Sonatype aether in 3.0.4 and
- // Eclipse aether in 3.1.1 and while dep-tree is a single module we can only compile against one of them.
- //
- // NB While applying this code to Maven3DependencyGraphBuilder is trivial it won't work because
- // in Maven 3, MavenProject.getProjectReferences isn't populated. So we would need to have the reactor
- // modules passed in separately which would change the API for DependencyGraphBuilder. If
- // MavenProject.getProjectReferences were populated (like it should be) then this would work for Maven3 too.
- //
- // NB There doesn't seem to be any way to apply this to Maven2DependencyGraphBuilder as there is no
- // concept of partial resolution like there is is 3 and 3.1
- final DependencyResolutionResult result = e.getResult();
-
- final List<Dependency> reactorDeps =
- getReactorDependencies( reactorProjects, result.getUnresolvedDependencies() );
- result.getUnresolvedDependencies().removeAll( reactorDeps );
- Invoker.invoke( result.getResolvedDependencies(), "addAll", Collection.class, reactorDeps );
-
- if ( !result.getUnresolvedDependencies().isEmpty() )
+ if ( reactorProjects == null )
{
- throw new DependencyGraphBuilderException( "Could not resolve the following dependencies: "
- + result.getUnresolvedDependencies(), e );
+ throw new DependencyGraphBuilderException( "Could not resolve following dependencies: "
+ + e.getResult().getUnresolvedDependencies(), e );
}
- getLogger().debug( "Resolved dependencies after ignoring reactor dependencies: " + reactorDeps );
-
- return result;
+ // try collecting from reactor
+ return collectDependenciesFromReactor( e, reactorProjects );
}
}
+ private DependencyResolutionResult collectDependenciesFromReactor( DependencyResolutionException e,
+ Collection<MavenProject> reactorProjects )
+ throws DependencyGraphBuilderException
+ {
+ DependencyResolutionResult result = e.getResult();
+
+ List<Dependency> reactorDeps = getReactorDependencies( reactorProjects, result.getUnresolvedDependencies() );
+
+ result.getUnresolvedDependencies().removeAll( reactorDeps );
+ Invoker.invoke( result.getResolvedDependencies(), "addAll", Collection.class, reactorDeps );
+
+ if ( !result.getUnresolvedDependencies().isEmpty() )
+ {
+ throw new DependencyGraphBuilderException( "Could not resolve nor collect following dependencies: "
+ + result.getUnresolvedDependencies(), e );
+ }
+
+ return result;
+ }
+
private List<org.sonatype.aether.graph.Dependency> getReactorDependencies( Collection<MavenProject> reactorProjects,
List<?> dependencies )
{
- final Set<ArtifactKey> reactorProjectsIds = new HashSet<ArtifactKey>();
- for ( final MavenProject project : reactorProjects )
+ Set<ArtifactKey> reactorProjectsIds = new HashSet<ArtifactKey>();
+ for ( MavenProject project : reactorProjects )
{
reactorProjectsIds.add( new ArtifactKey( project ) );
}
- final List<Dependency> reactorDeps = new ArrayList<Dependency>();
- for ( final Object untypedDependency : dependencies )
+ List<Dependency> reactorDeps = new ArrayList<Dependency>();
+ for ( Object untypedDependency : dependencies )
{
- final Dependency dependency = (Dependency) untypedDependency;
- final org.sonatype.aether.artifact.Artifact depArtifact = dependency.getArtifact();
+ Dependency dependency = (Dependency) untypedDependency;
+ org.sonatype.aether.artifact.Artifact depArtifact = dependency.getArtifact();
- final ArtifactKey key =
+ ArtifactKey key =
new ArtifactKey( depArtifact.getGroupId(), depArtifact.getArtifactId(), depArtifact.getVersion() );
if ( reactorProjectsIds.contains( key ) )