[MNG-3260] 2.1: aggregating plugins in submodules of the reactor return all projects causing a chicken/egg issue

git-svn-id: https://svn.apache.org/repos/asf/maven/components/trunk@808394 13f79535-47bb-0310-9956-ffa450edef68
This commit is contained in:
Benjamin Bentmann 2009-08-27 12:17:46 +00:00
parent 3badf71251
commit 481eefc1b3
2 changed files with 56 additions and 3 deletions

View File

@ -103,7 +103,6 @@ public Set<Artifact> resolve( MavenProject project, Collection<String> scopes, R
// FIXME setTransferListener
ArtifactResolutionResult result = repositorySystem.resolve( request );
resolutionErrorHandler.throwErrors( request, result );
project.setArtifacts( result.getArtifacts() );
@ -123,6 +122,8 @@ public Set<Artifact> resolve( MavenProject project, Collection<String> scopes, R
}
project.setDependencyArtifacts( dependencyArtifacts );
resolutionErrorHandler.throwErrors( request, result );
return result.getArtifacts();
}

View File

@ -31,8 +31,11 @@
import java.util.TreeSet;
import org.apache.maven.ProjectDependenciesResolver;
import org.apache.maven.artifact.Artifact;
import org.apache.maven.artifact.ArtifactUtils;
import org.apache.maven.artifact.repository.DefaultRepositoryRequest;
import org.apache.maven.artifact.repository.RepositoryRequest;
import org.apache.maven.artifact.resolver.MultipleArtifactsNotFoundException;
import org.apache.maven.execution.BuildFailure;
import org.apache.maven.execution.BuildSuccess;
import org.apache.maven.execution.DefaultLifecycleEvent;
@ -304,8 +307,36 @@ public void execute( MavenSession session )
for ( MavenProject project : projectsToResolve )
{
repositoryRequest.setRemoteRepositories( project.getRemoteArtifactRepositories() );
projectDependenciesResolver.resolve( project, executionPlan.getRequiredResolutionScopes(),
repositoryRequest );
try
{
projectDependenciesResolver.resolve( project, executionPlan.getRequiredResolutionScopes(),
repositoryRequest );
}
catch ( MultipleArtifactsNotFoundException e )
{
/*
* MNG-2277, the check below compensates for our bad plugin support where we ended up with
* aggregator plugins that require dependency resolution although they usually run in phases of
* the build where project artifacts haven't been assembled yet. The prime example of this is
* "mvn release:prepare".
*/
if ( projectBuild.taskSegment.aggregating
&& areAllArtifactsInReactor( session.getProjects(), e.getMissingArtifacts() ) )
{
logger.warn( "The following artifacts could not be resolved at this point of the build"
+ " but seem to be part of the reactor:" );
for ( Artifact artifact : e.getMissingArtifacts() )
{
logger.warn( "o " + artifact.getId() );
}
logger.warn( "Try running the build up to the lifecycle phase \"package\"" );
}
else
{
throw e;
}
}
}
for ( MojoExecution mojoExecution : executionPlan.getExecutions() )
@ -360,6 +391,27 @@ else if ( MavenExecutionRequest.REACTOR_FAIL_FAST.equals( session.getReactorFail
fireEvent( session, null, LifecycleEventCatapult.SESSION_ENDED );
}
private boolean areAllArtifactsInReactor( Collection<MavenProject> projects, Collection<Artifact> artifacts )
{
Set<String> projectKeys = new HashSet<String>( projects.size() * 2 );
for ( MavenProject project : projects )
{
String key = ArtifactUtils.key( project.getGroupId(), project.getArtifactId(), project.getVersion() );
projectKeys.add( key );
}
for ( Artifact artifact : artifacts )
{
String key = ArtifactUtils.key( artifact );
if ( !projectKeys.contains( key ) )
{
return false;
}
}
return true;
}
private void execute( MavenSession session, MojoExecution mojoExecution, ProjectIndex projectIndex )
throws MojoFailureException, MojoExecutionException, PluginConfigurationException, PluginManagerException
{