You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@maven.apache.org by be...@apache.org on 2009/07/08 14:23:46 UTC
svn commit: r792111 - in /maven/components/trunk:
maven-core/src/main/java/org/apache/maven/
maven-core/src/main/java/org/apache/maven/execution/
maven-core/src/main/java/org/apache/maven/lifecycle/
maven-embedder/src/main/java/org/apache/maven/cli/
Author: bentmann
Date: Wed Jul 8 12:23:46 2009
New Revision: 792111
URL: http://svn.apache.org/viewvc?rev=792111&view=rev
Log:
o Restored reactor failure behaviors
Added:
maven/components/trunk/maven-core/src/main/java/org/apache/maven/DefaultProjectDependencyGraph.java (with props)
maven/components/trunk/maven-core/src/main/java/org/apache/maven/execution/ProjectDependencyGraph.java (with props)
Modified:
maven/components/trunk/maven-core/src/main/java/org/apache/maven/DefaultMaven.java
maven/components/trunk/maven-core/src/main/java/org/apache/maven/execution/MavenSession.java
maven/components/trunk/maven-core/src/main/java/org/apache/maven/execution/ProjectSorter.java
maven/components/trunk/maven-core/src/main/java/org/apache/maven/lifecycle/DefaultLifecycleExecutor.java
maven/components/trunk/maven-embedder/src/main/java/org/apache/maven/cli/MavenCli.java
Modified: maven/components/trunk/maven-core/src/main/java/org/apache/maven/DefaultMaven.java
URL: http://svn.apache.org/viewvc/maven/components/trunk/maven-core/src/main/java/org/apache/maven/DefaultMaven.java?rev=792111&r1=792110&r2=792111&view=diff
==============================================================================
--- maven/components/trunk/maven-core/src/main/java/org/apache/maven/DefaultMaven.java (original)
+++ maven/components/trunk/maven-core/src/main/java/org/apache/maven/DefaultMaven.java Wed Jul 8 12:23:46 2009
@@ -146,6 +146,8 @@
projects = projectSorter.getSortedProjects();
session.setProjects( projects );
+
+ session.setProjectDependencyGraph( new DefaultProjectDependencyGraph( projectSorter ) );
}
catch ( CycleDetectedException e )
{
Added: maven/components/trunk/maven-core/src/main/java/org/apache/maven/DefaultProjectDependencyGraph.java
URL: http://svn.apache.org/viewvc/maven/components/trunk/maven-core/src/main/java/org/apache/maven/DefaultProjectDependencyGraph.java?rev=792111&view=auto
==============================================================================
--- maven/components/trunk/maven-core/src/main/java/org/apache/maven/DefaultProjectDependencyGraph.java (added)
+++ maven/components/trunk/maven-core/src/main/java/org/apache/maven/DefaultProjectDependencyGraph.java Wed Jul 8 12:23:46 2009
@@ -0,0 +1,105 @@
+package org.apache.maven;
+
+/*
+ * 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.ArrayList;
+import java.util.Collection;
+import java.util.HashSet;
+import java.util.List;
+
+import org.apache.maven.execution.ProjectDependencyGraph;
+import org.apache.maven.execution.ProjectSorter;
+import org.apache.maven.project.MavenProject;
+
+/**
+ * Describes the inter-dependencies between projects in the reactor.
+ *
+ * @author Benjamin Bentmann
+ */
+class DefaultProjectDependencyGraph
+ implements ProjectDependencyGraph
+{
+
+ private ProjectSorter sorter;
+
+ /**
+ * Creates a new project dependency graph based on the specified project sorting.
+ *
+ * @param sorter The project sorter backing the graph, must not be {@code null}.
+ */
+ public DefaultProjectDependencyGraph( ProjectSorter sorter )
+ {
+ if ( sorter == null )
+ {
+ throw new IllegalArgumentException( "project sorter missing" );
+ }
+
+ this.sorter = sorter;
+ }
+
+ public List<MavenProject> getSortedProjects()
+ {
+ return new ArrayList<MavenProject>( sorter.getSortedProjects() );
+ }
+
+ public List<MavenProject> getDownstreamProjects( MavenProject project, boolean transitive )
+ {
+ if ( project == null )
+ {
+ throw new IllegalArgumentException( "project missing" );
+ }
+
+ Collection<String> projectIds = new HashSet<String>();
+
+ getDownstreamProjects( ProjectSorter.getId( project ), projectIds, transitive );
+
+ List<MavenProject> projects = new ArrayList<MavenProject>();
+
+ for ( MavenProject p : sorter.getSortedProjects() )
+ {
+ if ( projectIds.contains( ProjectSorter.getId( p ) ) )
+ {
+ projects.add( p );
+ }
+ }
+
+ return projects;
+ }
+
+ private void getDownstreamProjects( String projectId, Collection<String> projectIds, boolean transitive )
+ {
+ for ( String id : sorter.getDependents( projectId ) )
+ {
+ projectIds.add( id );
+
+ if ( transitive )
+ {
+ getDownstreamProjects( id, projectIds, transitive );
+ }
+ }
+ }
+
+ @Override
+ public String toString()
+ {
+ return sorter.getSortedProjects().toString();
+ }
+
+}
Propchange: maven/components/trunk/maven-core/src/main/java/org/apache/maven/DefaultProjectDependencyGraph.java
------------------------------------------------------------------------------
svn:eol-style = native
Propchange: maven/components/trunk/maven-core/src/main/java/org/apache/maven/DefaultProjectDependencyGraph.java
------------------------------------------------------------------------------
svn:keywords = Author Date Id Revision
Modified: maven/components/trunk/maven-core/src/main/java/org/apache/maven/execution/MavenSession.java
URL: http://svn.apache.org/viewvc/maven/components/trunk/maven-core/src/main/java/org/apache/maven/execution/MavenSession.java?rev=792111&r1=792110&r2=792111&view=diff
==============================================================================
--- maven/components/trunk/maven-core/src/main/java/org/apache/maven/execution/MavenSession.java (original)
+++ maven/components/trunk/maven-core/src/main/java/org/apache/maven/execution/MavenSession.java Wed Jul 8 12:23:46 2009
@@ -20,7 +20,9 @@
*/
import java.util.Arrays;
+import java.util.Collection;
import java.util.HashMap;
+import java.util.HashSet;
import java.util.List;
import java.util.Map;
import java.util.Properties;
@@ -53,7 +55,11 @@
private List<MavenProject> projects;
private MavenProject topLevelProject;
-
+
+ private ProjectDependencyGraph projectDependencyGraph;
+
+ private Collection<String> blackListedProjects;
+
@Deprecated
public MavenSession( PlexusContainer container, MavenExecutionRequest request, MavenExecutionResult result, MavenProject project )
{
@@ -198,4 +204,40 @@
return pluginContext;
}
+ public void setProjectDependencyGraph( ProjectDependencyGraph projectDependencyGraph )
+ {
+ this.projectDependencyGraph = projectDependencyGraph;
+ }
+
+ public String getReactorFailureBehavior()
+ {
+ return request.getReactorFailureBehavior();
+ }
+
+ public boolean isBlackListed( MavenProject project )
+ {
+ return blackListedProjects != null && blackListedProjects.contains( getId( project ) );
+ }
+
+ public void blackList( MavenProject project )
+ {
+ if ( blackListedProjects == null )
+ {
+ blackListedProjects = new HashSet<String>();
+ }
+
+ if ( blackListedProjects.add( getId( project ) ) && projectDependencyGraph != null )
+ {
+ for ( MavenProject downstreamProject : projectDependencyGraph.getDownstreamProjects( project, true ) )
+ {
+ blackListedProjects.add( getId( downstreamProject ) );
+ }
+ }
+ }
+
+ private String getId( MavenProject project )
+ {
+ return project.getGroupId() + ':' + project.getArtifactId() + ':' + project.getVersion();
+ }
+
}
Added: maven/components/trunk/maven-core/src/main/java/org/apache/maven/execution/ProjectDependencyGraph.java
URL: http://svn.apache.org/viewvc/maven/components/trunk/maven-core/src/main/java/org/apache/maven/execution/ProjectDependencyGraph.java?rev=792111&view=auto
==============================================================================
--- maven/components/trunk/maven-core/src/main/java/org/apache/maven/execution/ProjectDependencyGraph.java (added)
+++ maven/components/trunk/maven-core/src/main/java/org/apache/maven/execution/ProjectDependencyGraph.java Wed Jul 8 12:23:46 2009
@@ -0,0 +1,53 @@
+package org.apache.maven.execution;
+
+/*
+ * 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.project.MavenProject;
+
+/**
+ * Describes the inter-dependencies between projects in the reactor.
+ *
+ * @author Benjamin Bentmann
+ */
+public interface ProjectDependencyGraph
+{
+
+ /**
+ * Gets all projects in their intended build order, i.e. after topologically sorting the projects according to their
+ * inter-dependencies.
+ *
+ * @return The projects in the build order, never {@code null}.
+ */
+ List<MavenProject> getSortedProjects();
+
+ /**
+ * Gets the downstream projects of the specified projects. A downstream project is a project that directly or
+ * indirectly depends on the given project.
+ *
+ * @param project The project whose downstream projects should be retrieved, must not be {@code null}.
+ * @param transitive A flag whether to retrieve all direct and indirect downstream projects or just the immediate
+ * downstream projects.
+ * @return The downstream projects in the build order, never {@code null}.
+ */
+ List<MavenProject> getDownstreamProjects( MavenProject project, boolean transitive );
+
+}
Propchange: maven/components/trunk/maven-core/src/main/java/org/apache/maven/execution/ProjectDependencyGraph.java
------------------------------------------------------------------------------
svn:eol-style = native
Propchange: maven/components/trunk/maven-core/src/main/java/org/apache/maven/execution/ProjectDependencyGraph.java
------------------------------------------------------------------------------
svn:keywords = Author Date Id Revision
Modified: maven/components/trunk/maven-core/src/main/java/org/apache/maven/execution/ProjectSorter.java
URL: http://svn.apache.org/viewvc/maven/components/trunk/maven-core/src/main/java/org/apache/maven/execution/ProjectSorter.java?rev=792111&r1=792110&r2=792111&view=diff
==============================================================================
--- maven/components/trunk/maven-core/src/main/java/org/apache/maven/execution/ProjectSorter.java (original)
+++ maven/components/trunk/maven-core/src/main/java/org/apache/maven/execution/ProjectSorter.java Wed Jul 8 12:23:46 2009
@@ -58,11 +58,11 @@
for ( MavenProject project : projects )
{
- String id = ArtifactUtils.versionlessKey( project.getGroupId(), project.getArtifactId() );
+ String id = getId( project );
if ( dag.getVertex( id ) != null )
{
- MavenProject conflictingProject = (MavenProject) projectMap.get( id );
+ MavenProject conflictingProject = projectMap.get( id );
throw new DuplicateProjectException( id, conflictingProject.getFile(), project.getFile(), "Project '" + id + "' is duplicated in the reactor" );
}
@@ -74,7 +74,7 @@
for ( MavenProject project : projects )
{
- String id = ArtifactUtils.versionlessKey( project.getGroupId(), project.getArtifactId() );
+ String id = getId( project );
for( Dependency dependency : project.getDependencies() )
{
@@ -82,7 +82,7 @@
if ( dag.getVertex( dependencyId ) != null )
{
- project.addProjectReference( (MavenProject) projectMap.get( dependencyId ) );
+ project.addProjectReference( projectMap.get( dependencyId ) );
dag.addEdge( id, dependencyId );
}
@@ -139,7 +139,7 @@
private void addEdgeWithParentCheck( Map<String,MavenProject> projectMap, String projectRefId, MavenProject project, String id )
throws CycleDetectedException
{
- MavenProject extProject = (MavenProject) projectMap.get( projectRefId );
+ MavenProject extProject = projectMap.get( projectRefId );
if ( extProject == null )
{
@@ -165,9 +165,9 @@
{
if ( topLevelProject == null )
{
- for ( Iterator i = sortedProjects.iterator(); i.hasNext() && ( topLevelProject == null ); )
+ for ( Iterator<MavenProject> i = sortedProjects.iterator(); i.hasNext() && ( topLevelProject == null ); )
{
- MavenProject project = (MavenProject) i.next();
+ MavenProject project = i.next();
if ( project.isExecutionRoot() )
{
topLevelProject = project;
@@ -188,8 +188,14 @@
return sortedProjects.size() > 1;
}
- List<String> getDependents( String id )
+ public List<String> getDependents( String id )
{
return dag.getParentLabels( id );
}
-}
\ No newline at end of file
+
+ public static String getId( MavenProject project )
+ {
+ return ArtifactUtils.versionlessKey( project.getGroupId(), project.getArtifactId() );
+ }
+
+}
Modified: maven/components/trunk/maven-core/src/main/java/org/apache/maven/lifecycle/DefaultLifecycleExecutor.java
URL: http://svn.apache.org/viewvc/maven/components/trunk/maven-core/src/main/java/org/apache/maven/lifecycle/DefaultLifecycleExecutor.java?rev=792111&r1=792110&r2=792111&view=diff
==============================================================================
--- maven/components/trunk/maven-core/src/main/java/org/apache/maven/lifecycle/DefaultLifecycleExecutor.java (original)
+++ maven/components/trunk/maven-core/src/main/java/org/apache/maven/lifecycle/DefaultLifecycleExecutor.java Wed Jul 8 12:23:46 2009
@@ -35,8 +35,7 @@
import org.apache.maven.artifact.repository.metadata.Metadata;
import org.apache.maven.artifact.repository.metadata.RepositoryMetadataReadException;
import org.apache.maven.artifact.repository.metadata.io.xpp3.MetadataXpp3Reader;
-import org.apache.maven.artifact.resolver.ArtifactNotFoundException;
-import org.apache.maven.artifact.resolver.ArtifactResolutionException;
+import org.apache.maven.execution.MavenExecutionRequest;
import org.apache.maven.execution.MavenSession;
import org.apache.maven.lifecycle.mapping.LifecycleMapping;
import org.apache.maven.model.Dependency;
@@ -144,43 +143,27 @@
for ( MavenProject currentProject : session.getProjects() )
{
+ if ( session.isBlackListed( currentProject ) )
+ {
+ logger.info( "Skipping " + currentProject.getName() );
+ logger.info( "This project has been banned from the build due to previous failures." );
+
+ continue;
+ }
+
logger.info( "Building " + currentProject.getName() );
try
{
session.setCurrentProject( currentProject );
- MavenExecutionPlan executionPlan;
-
- try
- {
- executionPlan = calculateExecutionPlan( session, goals.toArray( new String[] {} ) );
- }
- catch ( Exception e )
- {
- session.getResult().addException( e );
- return;
- }
+ MavenExecutionPlan executionPlan = calculateExecutionPlan( session, goals.toArray( new String[] {} ) );
//TODO: once we have calculated the build plan then we should accurately be able to download
// the project dependencies. Having it happen in the plugin manager is a tangled mess. We can optimize this
// later by looking at the build plan. Would be better to just batch download everything required by the reactor.
- // mojoDescriptor.isDependencyResolutionRequired() is actually the scope of the dependency resolution required, not a boolean ... yah.
- try
- {
- projectDependenciesResolver.resolve( currentProject, executionPlan.getRequiredResolutionScopes(), session.getLocalRepository(), currentProject.getRemoteArtifactRepositories() );
- }
- catch ( ArtifactNotFoundException e )
- {
- session.getResult().addException( e );
- return;
- }
- catch ( ArtifactResolutionException e )
- {
- session.getResult().addException( e );
- return;
- }
+ projectDependenciesResolver.resolve( currentProject, executionPlan.getRequiredResolutionScopes(), session.getLocalRepository(), currentProject.getRemoteArtifactRepositories() );
if ( logger.isDebugEnabled() )
{
@@ -200,19 +183,35 @@
for ( MojoExecution mojoExecution : executionPlan.getExecutions() )
{
- try
- {
- logger.info( executionDescription( mojoExecution, currentProject ) );
- pluginManager.executeMojo( session, mojoExecution );
- }
- catch ( Exception e )
- {
- session.getResult().addException( e );
- return;
- }
+ logger.info( executionDescription( mojoExecution, currentProject ) );
+ pluginManager.executeMojo( session, mojoExecution );
}
}
+ catch ( Exception e )
+ {
+ session.getResult().addException( e );
+
+ if ( MavenExecutionRequest.REACTOR_FAIL_NEVER.equals( session.getReactorFailureBehavior() ) )
+ {
+ // continue the build
+ }
+ else if ( MavenExecutionRequest.REACTOR_FAIL_AT_END.equals( session.getReactorFailureBehavior() ) )
+ {
+ // continue the build but ban all projects that depend on the failed one
+ session.blackList( currentProject );
+ }
+ else if ( MavenExecutionRequest.REACTOR_FAIL_FAST.equals( session.getReactorFailureBehavior() ) )
+ {
+ // abort the build
+ return;
+ }
+ else
+ {
+ throw new IllegalArgumentException( "invalid reactor failure behavior "
+ + session.getReactorFailureBehavior() );
+ }
+ }
finally
{
session.setCurrentProject( null );
Modified: maven/components/trunk/maven-embedder/src/main/java/org/apache/maven/cli/MavenCli.java
URL: http://svn.apache.org/viewvc/maven/components/trunk/maven-embedder/src/main/java/org/apache/maven/cli/MavenCli.java?rev=792111&r1=792110&r2=792111&view=diff
==============================================================================
--- maven/components/trunk/maven-embedder/src/main/java/org/apache/maven/cli/MavenCli.java (original)
+++ maven/components/trunk/maven-embedder/src/main/java/org/apache/maven/cli/MavenCli.java Wed Jul 8 12:23:46 2009
@@ -192,7 +192,16 @@
es.getException().printStackTrace();
}
- return 1;
+ if ( MavenExecutionRequest.REACTOR_FAIL_NEVER.equals( request.getReactorFailureBehavior() ) )
+ {
+ System.out.println( "+ Build failures were ignored." );
+
+ return 0;
+ }
+ else
+ {
+ return 1;
+ }
}
else
{