Cleaning up exception wrapping to allow better reporting of errors to end users. Also implementing the beginnings of a new error reporter, and bumping the version of plexus-container-default up to 1.0-alpha-33-SNAPSHOT to improve the accessibility to ClassRealm info for ComponentLookupException.

git-svn-id: https://svn.apache.org/repos/asf/maven/components/trunk@584343 13f79535-47bb-0310-9956-ffa450edef68
This commit is contained in:
John Dennis Casey 2007-10-13 00:10:29 +00:00
parent 957a77435a
commit 0d0f7396b2
53 changed files with 2522 additions and 1218 deletions

View File

@ -17,7 +17,7 @@
classworlds.version=1.2-alpha-10 classworlds.version=1.2-alpha-10
plexus-active-collections.version=1.0-beta-1 plexus-active-collections.version=1.0-beta-1
plexus.version=1.0-alpha-32 plexus.version=1.0-alpha-33-SNAPSHOT
plexus-utils.version=1.4.5 plexus-utils.version=1.4.5
maven-artifact.version=3.0-SNAPSHOT maven-artifact.version=3.0-SNAPSHOT
commons-cli.version=1.0 commons-cli.version=1.0

View File

@ -0,0 +1,50 @@
package org.apache.maven;
import org.apache.maven.lifecycle.MojoBindingUtils;
import org.apache.maven.lifecycle.model.MojoBinding;
import org.apache.maven.plugin.MojoFailureException;
/**
* Exception which occurs when an @aggregator plugin fails to execute. This
* exception is meant to wrap a {@link MojoFailureException}, and provide
* additional details about the mojo that failed, via {@link MojoBinding} and
* the root directory in which the build executes.
*
* @author jdcasey
*
*/
public class AggregatedBuildFailureException
extends BuildFailureException
{
private final String executionRootDirectory;
private final MojoBinding binding;
public AggregatedBuildFailureException( String executionRootDirectory,
MojoBinding binding,
MojoFailureException cause )
{
super( "Build in root directory: " + executionRootDirectory
+ " failed during execution of aggregator mojo: "
+ MojoBindingUtils.toString( binding ), cause );
this.executionRootDirectory = executionRootDirectory;
this.binding = binding;
}
public MojoFailureException getMojoFailureException()
{
return (MojoFailureException) getCause();
}
public String getExecutionRootDirectory()
{
return executionRootDirectory;
}
public MojoBinding getBinding()
{
return binding;
}
}

View File

@ -1,5 +1,6 @@
package org.apache.maven; package org.apache.maven;
/* /*
* Licensed to the Apache Software Foundation (ASF) under one * Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file * or more contributor license agreements. See the NOTICE file
@ -25,15 +26,15 @@ package org.apache.maven;
* @author <a href="mailto:brett@apache.org">Brett Porter</a> * @author <a href="mailto:brett@apache.org">Brett Porter</a>
* @version $Id$ * @version $Id$
*/ */
public class BuildFailureException public abstract class BuildFailureException
extends Exception extends Exception
{ {
public BuildFailureException( String message ) protected BuildFailureException( String message )
{ {
super( message ); super( message );
} }
public BuildFailureException( String message, Throwable cause ) protected BuildFailureException( String message, Throwable cause )
{ {
super( message, cause ); super( message, cause );
} }

View File

@ -42,7 +42,6 @@ import org.apache.maven.monitor.event.DefaultEventDispatcher;
import org.apache.maven.monitor.event.EventDispatcher; import org.apache.maven.monitor.event.EventDispatcher;
import org.apache.maven.monitor.event.MavenEvents; import org.apache.maven.monitor.event.MavenEvents;
import org.apache.maven.profiles.ProfileManager; import org.apache.maven.profiles.ProfileManager;
import org.apache.maven.profiles.activation.ProfileActivationException;
import org.apache.maven.project.DuplicateProjectException; import org.apache.maven.project.DuplicateProjectException;
import org.apache.maven.project.MavenProject; import org.apache.maven.project.MavenProject;
import org.apache.maven.project.MavenProjectBuilder; import org.apache.maven.project.MavenProjectBuilder;
@ -117,10 +116,14 @@ public class DefaultMaven
request.setProjectPresent( false ); request.setProjectPresent( false );
} }
} }
catch ( Exception e ) catch ( ProjectBuildingException e )
{ {
result.addException( e ); result.addProjectBuildingException( e );
return null;
}
catch ( MavenExecutionException e )
{
result.addMavenExecutionException( e );
return null; return null;
} }
@ -136,19 +139,18 @@ public class DefaultMaven
} }
catch ( CycleDetectedException e ) catch ( CycleDetectedException e )
{ {
result.addException( String message = "The projects in the reactor contain a cyclic reference: "
new BuildFailureException( + e.getMessage();
"The projects in the reactor contain a cyclic reference: " + e.getMessage(),
e ) ); ProjectCycleException error = new ProjectCycleException( projects, message, e );
result.addBuildFailureException( error );
return null; return null;
} }
catch ( DuplicateProjectException e ) catch ( DuplicateProjectException e )
{ {
result.addException( result.addDuplicateProjectException( e );
new BuildFailureException(
e.getMessage(),
e ) );
return null; return null;
} }
@ -192,7 +194,7 @@ public class DefaultMaven
if ( !tvr.isTaskValid() ) if ( !tvr.isTaskValid() )
{ {
result.addException( new BuildFailureException( tvr.getMessage() ) ); result.addBuildFailureException( new InvalidTaskException( tvr ) );
return result; return result;
} }
@ -223,12 +225,12 @@ public class DefaultMaven
} }
catch ( LifecycleExecutionException e ) catch ( LifecycleExecutionException e )
{ {
result.addException( e ); result.addLifecycleExecutionException( e );
return result; return result;
} }
catch ( BuildFailureException e ) catch ( BuildFailureException e )
{ {
result.addException( e ); result.addBuildFailureException( e );
return result; return result;
} }
@ -258,7 +260,7 @@ public class DefaultMaven
} }
private List getProjects( MavenExecutionRequest request ) private List getProjects( MavenExecutionRequest request )
throws MavenExecutionException, BuildFailureException throws MavenExecutionException
{ {
List projects; List projects;
@ -298,10 +300,6 @@ public class DefaultMaven
{ {
throw new MavenExecutionException( e.getMessage(), e ); throw new MavenExecutionException( e.getMessage(), e );
} }
catch ( ProfileActivationException e )
{
throw new MavenExecutionException( e.getMessage(), e );
}
return projects; return projects;
} }
@ -310,8 +308,7 @@ public class DefaultMaven
boolean recursive, boolean recursive,
ProfileManager globalProfileManager, ProfileManager globalProfileManager,
boolean isRoot ) boolean isRoot )
throws ArtifactResolutionException, ProjectBuildingException, ProfileActivationException, throws ArtifactResolutionException, ProjectBuildingException, MavenExecutionException
MavenExecutionException, BuildFailureException
{ {
List projects = new ArrayList( files.size() ); List projects = new ArrayList( files.size() );
@ -341,7 +338,7 @@ public class DefaultMaven
if ( runtimeInformation.getApplicationVersion().compareTo( version ) < 0 ) if ( runtimeInformation.getApplicationVersion().compareTo( version ) < 0 )
{ {
throw new BuildFailureException( throw new MavenExecutionException(
"Unable to build project '" + project.getFile() + "Unable to build project '" + project.getFile() +
"; it requires Maven version " + version.toString() ); "; it requires Maven version " + version.toString() );
} }
@ -396,13 +393,9 @@ public class DefaultMaven
moduleFiles.add( moduleFile ); moduleFiles.add( moduleFile );
} }
List collectedProjects = List collectedProjects = collectProjects( moduleFiles, localRepository, recursive,
collectProjects( globalProfileManager, false );
moduleFiles,
localRepository,
recursive,
globalProfileManager,
false );
projects.addAll( collectedProjects ); projects.addAll( collectedProjects );
project.setCollectedProjects( collectedProjects ); project.setCollectedProjects( collectedProjects );
} }

View File

@ -0,0 +1,31 @@
package org.apache.maven;
import org.apache.maven.lifecycle.TaskValidationResult;
/**
* Exception which occurs when a task or goal is specified on the command line
* but cannot be resolved for execution. This validation is done up front, and
* this exception wraps the {@link TaskValidationResult} generated as a result
* of verifying the task.
*
* @author jdcasey
*
*/
public class InvalidTaskException
extends BuildFailureException
{
private final String task;
public InvalidTaskException( TaskValidationResult result )
{
super( result.getMessage(), result.getCause() );
task = result.getInvalidTask();
}
public String getTask()
{
return task;
}
}

View File

@ -0,0 +1,20 @@
package org.apache.maven;
/**
* Exception indicating that Maven has no instructions for what to execute. This
* happens when no goals are specified on the command line, and there is no
* defaultGoal specified in the POM itself.
*
* @author jdcasey
*
*/
public class NoGoalsSpecifiedException
extends BuildFailureException
{
public NoGoalsSpecifiedException( String message )
{
super( message );
}
}

View File

@ -0,0 +1,50 @@
package org.apache.maven;
import org.apache.maven.lifecycle.MojoBindingUtils;
import org.apache.maven.lifecycle.model.MojoBinding;
import org.apache.maven.plugin.MojoFailureException;
/**
* Exception which occurs when a normal (i.e. non-aggregator) mojo fails to
* execute. In this case, the mojo failed while executing against a particular
* project instance, so we can wrap the {@link MojoFailureException} with context
* information including projectId and the {@link MojoBinding} that caused the
* failure.
*
* @author jdcasey
*
*/
public class ProjectBuildFailureException
extends BuildFailureException
{
private final String projectId;
private final MojoBinding binding;
public ProjectBuildFailureException( String projectId,
MojoBinding binding,
MojoFailureException cause )
{
super( "Build for project: " + projectId + " failed during execution of mojo: "
+ MojoBindingUtils.toString( binding ), cause );
this.projectId = projectId;
this.binding = binding;
}
public MojoFailureException getMojoFailureException()
{
return (MojoFailureException) getCause();
}
public String getProjectId()
{
return projectId;
}
public MojoBinding getBinding()
{
return binding;
}
}

View File

@ -0,0 +1,37 @@
package org.apache.maven;
import org.apache.maven.execution.ReactorManager;
import org.apache.maven.project.ProjectSorter;
import org.codehaus.plexus.util.dag.CycleDetectedException;
import java.util.List;
/**
* Exception which occurs when creating a new {@link ReactorManager} instance,
* due to failure to sort the current projects. The embedded {@link CycleDetectedException}
* is thrown by the {@link ProjectSorter}, and context of this wrapped exception
* includes the list of projects that contain the cycle, along with a friendly
* rendering of the cycle message indicating that it comes from the current projects list.
*
* @author jdcasey
*
*/
public class ProjectCycleException
extends BuildFailureException
{
private final List projects;
public ProjectCycleException( List projects, String message,
CycleDetectedException cause )
{
super( message, cause );
this.projects = projects;
}
public List getProjects()
{
return projects;
}
}

View File

@ -19,8 +19,13 @@ package org.apache.maven.execution;
* under the License. * under the License.
*/ */
import org.apache.maven.BuildFailureException;
import org.apache.maven.artifact.resolver.ArtifactResolutionResult; import org.apache.maven.artifact.resolver.ArtifactResolutionResult;
import org.apache.maven.lifecycle.LifecycleExecutionException;
import org.apache.maven.project.DuplicateProjectException;
import org.apache.maven.project.MavenProject; import org.apache.maven.project.MavenProject;
import org.apache.maven.project.ProjectBuildingException;
import org.apache.maven.reactor.MavenExecutionException;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.List; import java.util.List;
@ -80,7 +85,49 @@ public class DefaultMavenExecutionResult
return exceptions; return exceptions;
} }
public MavenExecutionResult addException( Throwable t ) public MavenExecutionResult addProjectBuildingException( ProjectBuildingException e )
{
addException( e );
return this;
}
public MavenExecutionResult addMavenExecutionException( MavenExecutionException e )
{
addException( e );
return this;
}
public MavenExecutionResult addBuildFailureException( BuildFailureException e )
{
addException( e );
return this;
}
public MavenExecutionResult addDuplicateProjectException( DuplicateProjectException e )
{
addException( e );
return this;
}
public MavenExecutionResult addLifecycleExecutionException( LifecycleExecutionException e )
{
addException( e );
return this;
}
public MavenExecutionResult addUnknownException( Throwable t )
{
addException( t );
return this;
}
private void addException( Throwable t )
{ {
if ( exceptions == null ) if ( exceptions == null )
{ {
@ -88,13 +135,11 @@ public class DefaultMavenExecutionResult
} }
exceptions.add( t ); exceptions.add( t );
return this;
} }
public boolean hasExceptions() public boolean hasExceptions()
{ {
return (exceptions != null && exceptions.size() > 0 ); return (( exceptions != null ) && ( exceptions.size() > 0 ) );
} }
public ReactorManager getReactorManager() public ReactorManager getReactorManager()

View File

@ -19,8 +19,13 @@ package org.apache.maven.execution;
* under the License. * under the License.
*/ */
import org.apache.maven.BuildFailureException;
import org.apache.maven.artifact.resolver.ArtifactResolutionResult; import org.apache.maven.artifact.resolver.ArtifactResolutionResult;
import org.apache.maven.lifecycle.LifecycleExecutionException;
import org.apache.maven.project.DuplicateProjectException;
import org.apache.maven.project.MavenProject; import org.apache.maven.project.MavenProject;
import org.apache.maven.project.ProjectBuildingException;
import org.apache.maven.reactor.MavenExecutionException;
import java.util.List; import java.util.List;
@ -47,6 +52,13 @@ public interface MavenExecutionResult
// - invalid project model exception: list of markers // - invalid project model exception: list of markers
// - xmlpull parser exception // - xmlpull parser exception
List getExceptions(); List getExceptions();
MavenExecutionResult addException( Throwable t );
MavenExecutionResult addLifecycleExecutionException( LifecycleExecutionException e );
MavenExecutionResult addDuplicateProjectException( DuplicateProjectException duplicateProjectException );
MavenExecutionResult addBuildFailureException( BuildFailureException buildFailureException );
MavenExecutionResult addMavenExecutionException( MavenExecutionException e );
MavenExecutionResult addProjectBuildingException (ProjectBuildingException e );
MavenExecutionResult addUnknownException( Throwable t );
boolean hasExceptions(); boolean hasExceptions();
} }

View File

@ -19,12 +19,14 @@ package org.apache.maven.lifecycle;
* under the License. * under the License.
*/ */
import org.apache.maven.AggregatedBuildFailureException;
import org.apache.maven.BuildFailureException; import org.apache.maven.BuildFailureException;
import org.apache.maven.NoGoalsSpecifiedException;
import org.apache.maven.ProjectBuildFailureException;
import org.apache.maven.artifact.handler.ArtifactHandler; import org.apache.maven.artifact.handler.ArtifactHandler;
import org.apache.maven.artifact.handler.manager.ArtifactHandlerManager; import org.apache.maven.artifact.handler.manager.ArtifactHandlerManager;
import org.apache.maven.artifact.resolver.ArtifactNotFoundException; import org.apache.maven.artifact.resolver.ArtifactNotFoundException;
import org.apache.maven.artifact.resolver.ArtifactResolutionException; import org.apache.maven.artifact.resolver.ArtifactResolutionException;
import org.apache.maven.artifact.versioning.InvalidVersionSpecificationException;
import org.apache.maven.context.BuildContextManager; import org.apache.maven.context.BuildContextManager;
import org.apache.maven.execution.MavenSession; import org.apache.maven.execution.MavenSession;
import org.apache.maven.execution.ReactorManager; import org.apache.maven.execution.ReactorManager;
@ -101,6 +103,7 @@ public class DefaultLifecycleExecutor
* @param session * @param session
* @param reactorManager * @param reactorManager
* @param dispatcher * @param dispatcher
* @throws MojoFailureException
*/ */
public void execute( final MavenSession session, public void execute( final MavenSession session,
final ReactorManager reactorManager, final ReactorManager reactorManager,
@ -125,7 +128,7 @@ public class DefaultLifecycleExecutor
if ( goals.isEmpty() ) if ( goals.isEmpty() )
{ {
throw new BuildFailureException( "You must specify at least one goal. Try 'install'" ); throw new NoGoalsSpecifiedException( "You must specify at least one goal. Try 'install'" );
} }
List taskSegments = segmentTaskListByAggregationNeeds( List taskSegments = segmentTaskListByAggregationNeeds(
@ -143,7 +146,7 @@ public class DefaultLifecycleExecutor
catch ( PluginNotFoundException e ) catch ( PluginNotFoundException e )
{ {
throw new LifecycleExecutionException( throw new LifecycleExecutionException(
e.getMessage(), "Plugin could not be not found while searching for artifact-type handlers.",
e ); e );
} }
@ -210,14 +213,31 @@ public class DefaultLifecycleExecutor
{ {
MojoBinding binding = (MojoBinding) mojoIterator.next(); MojoBinding binding = (MojoBinding) mojoIterator.next();
executeGoalAndHandleFailures( try
binding, {
session, executeGoalAndHandleFailures(
dispatcher, binding,
event, session,
reactorManager, dispatcher,
buildStartTime, event,
target ); reactorManager,
buildStartTime,
target );
}
catch ( MojoFailureException e )
{
AggregatedBuildFailureException error = new AggregatedBuildFailureException(
session.getExecutionRootDirectory(),
binding,
e );
dispatcher.dispatchError( event, target, error );
if ( handleExecutionFailure( reactorManager, rootProject, error, binding, buildStartTime ) )
{
throw error;
}
}
} }
// clean up the execution context, so we don't pollute for future project-executions. // clean up the execution context, so we don't pollute for future project-executions.
@ -285,19 +305,32 @@ public class DefaultLifecycleExecutor
for ( Iterator mojoIterator = mojoBindings.iterator(); mojoIterator.hasNext(); ) for ( Iterator mojoIterator = mojoBindings.iterator(); mojoIterator.hasNext(); )
{ {
MojoBinding mojoBinding = (MojoBinding) mojoIterator.next(); MojoBinding binding = (MojoBinding) mojoIterator.next();
getLogger().debug( getLogger().debug(
"Mojo: " + mojoBinding.getGoal() + " has config:\n" "Mojo: " + binding.getGoal() + " has config:\n"
+ mojoBinding.getConfiguration() ); + binding.getConfiguration() );
executeGoalAndHandleFailures(
mojoBinding, try
session, {
dispatcher, executeGoalAndHandleFailures( binding, session, dispatcher,
event, event, reactorManager,
reactorManager, buildStartTime, target );
buildStartTime, }
target ); catch ( MojoFailureException e )
{
ProjectBuildFailureException error = new ProjectBuildFailureException(
currentProject.getId(),
binding,
e );
dispatcher.dispatchError( event, target, error );
if ( handleExecutionFailure( reactorManager, currentProject, error, binding, buildStartTime ) )
{
throw error;
}
}
} }
LifecycleExecutionContext.delete( buildContextManager ); LifecycleExecutionContext.delete( buildContextManager );
@ -373,7 +406,7 @@ public class DefaultLifecycleExecutor
final ReactorManager rm, final ReactorManager rm,
final long buildStartTime, final long buildStartTime,
final String target ) final String target )
throws BuildFailureException, LifecycleExecutionException throws LifecycleExecutionException, MojoFailureException
{ {
// NEW: Retrieve/use the current project stored in the execution context, for consistency. // NEW: Retrieve/use the current project stored in the execution context, for consistency.
LifecycleExecutionContext ctx = LifecycleExecutionContext.read( buildContextManager ); LifecycleExecutionContext ctx = LifecycleExecutionContext.read( buildContextManager );
@ -446,12 +479,6 @@ public class DefaultLifecycleExecutor
e.getMessage(), e.getMessage(),
e ); e );
} }
catch ( MojoFailureException e )
{
throw new BuildFailureException(
e.getMessage(),
e );
}
catch ( MojoExecutionException e ) catch ( MojoExecutionException e )
{ {
throw new LifecycleExecutionException( throw new LifecycleExecutionException(
@ -474,34 +501,9 @@ public class DefaultLifecycleExecutor
} }
catch ( LifecycleExecutionException e ) catch ( LifecycleExecutionException e )
{ {
dispatcher.dispatchError( dispatcher.dispatchError( event, target, e );
event,
target,
e );
if ( handleExecutionFailure( if ( handleExecutionFailure( rm, project, e, mojoBinding, buildStartTime ) )
rm,
project,
e,
mojoBinding,
buildStartTime ) )
{
throw e;
}
}
catch ( BuildFailureException e )
{
dispatcher.dispatchError(
event,
target,
e );
if ( handleExecutionFailure(
rm,
project,
e,
mojoBinding,
buildStartTime ) )
{ {
throw e; throw e;
} }
@ -542,13 +544,13 @@ public class DefaultLifecycleExecutor
if ( rootProject != null ) if ( rootProject != null )
{ {
if ( !LifecycleUtils.isValidPhaseName( task ) ) if ( !LifecycleUtils.isValidPhaseName( task ) )
{ {
MojoDescriptor mojo = null;
// definitely a CLI goal, can use prefix // definitely a CLI goal, can use prefix
try try
{ {
mojo = getMojoDescriptorForDirectInvocation( getMojoDescriptorForDirectInvocation(
task, task,
session, session,
rootProject ); rootProject );
@ -595,7 +597,6 @@ public class DefaultLifecycleExecutor
private List segmentTaskListByAggregationNeeds( final List tasks, private List segmentTaskListByAggregationNeeds( final List tasks,
final MavenSession session, final MavenSession session,
final MavenProject rootProject ) final MavenProject rootProject )
throws LifecycleExecutionException, BuildFailureException
{ {
List segments = new ArrayList(); List segments = new ArrayList();
@ -782,12 +783,6 @@ public class DefaultLifecycleExecutor
e.getMessage(), e.getMessage(),
e ); e );
} }
catch ( InvalidVersionSpecificationException e )
{
throw new LifecycleExecutionException(
e.getMessage(),
e );
}
catch ( InvalidPluginException e ) catch ( InvalidPluginException e )
{ {
throw new LifecycleExecutionException( throw new LifecycleExecutionException(

View File

@ -1,5 +1,18 @@
package org.apache.maven.lifecycle; package org.apache.maven.lifecycle;
import org.apache.maven.artifact.resolver.ArtifactNotFoundException;
import org.apache.maven.artifact.resolver.ArtifactResolutionException;
import org.apache.maven.artifact.versioning.InvalidVersionSpecificationException;
import org.apache.maven.plugin.InvalidPluginException;
import org.apache.maven.plugin.MojoExecutionException;
import org.apache.maven.plugin.PluginConfigurationException;
import org.apache.maven.plugin.PluginManagerException;
import org.apache.maven.plugin.PluginNotFoundException;
import org.apache.maven.plugin.loader.PluginLoaderException;
import org.apache.maven.plugin.version.PluginVersionNotFoundException;
import org.apache.maven.plugin.version.PluginVersionResolutionException;
import org.apache.maven.project.artifact.InvalidDependencyVersionException;
/* /*
* Licensed to the Apache Software Foundation (ASF) under one * Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file * or more contributor license agreements. See the NOTICE file
@ -31,13 +44,82 @@ public class LifecycleExecutionException
super( message ); super( message );
} }
public LifecycleExecutionException( Throwable cause ) public LifecycleExecutionException( String message,
{ PluginManagerException cause )
super( cause );
}
public LifecycleExecutionException( String message, Throwable cause )
{ {
super( message, cause ); super( message, cause );
} }
public LifecycleExecutionException( String message,
PluginNotFoundException cause )
{
super( message, cause );
}
public LifecycleExecutionException( String message,
PluginVersionResolutionException cause )
{
super( message, cause );
}
public LifecycleExecutionException( String message,
InvalidVersionSpecificationException cause )
{
super( message, cause );
}
public LifecycleExecutionException( String message,
InvalidPluginException cause )
{
super( message, cause );
}
public LifecycleExecutionException( String message,
ArtifactNotFoundException cause )
{
super( message, cause );
}
public LifecycleExecutionException( String message,
ArtifactResolutionException cause )
{
super( message, cause );
}
public LifecycleExecutionException( String message,
PluginLoaderException cause )
{
super( message, cause );
}
public LifecycleExecutionException( String message,
LifecycleException cause )
{
super( message, cause );
}
public LifecycleExecutionException( String message,
InvalidDependencyVersionException cause )
{
super( message, cause );
}
public LifecycleExecutionException( String message,
MojoExecutionException cause )
{
super( message, cause );
}
public LifecycleExecutionException( String message,
PluginConfigurationException cause )
{
super( message, cause );
}
public LifecycleExecutionException( String message,
PluginVersionNotFoundException cause )
{
super( message, cause );
}
} }

View File

@ -20,10 +20,10 @@ package org.apache.maven.lifecycle;
*/ */
import org.apache.maven.BuildFailureException; import org.apache.maven.BuildFailureException;
import org.apache.maven.project.MavenProject;
import org.apache.maven.execution.MavenSession; import org.apache.maven.execution.MavenSession;
import org.apache.maven.execution.ReactorManager; import org.apache.maven.execution.ReactorManager;
import org.apache.maven.monitor.event.EventDispatcher; import org.apache.maven.monitor.event.EventDispatcher;
import org.apache.maven.project.MavenProject;
/** /**
* @author <a href="mailto:jason@maven.org">Jason van Zyl</a> * @author <a href="mailto:jason@maven.org">Jason van Zyl</a>
@ -33,7 +33,7 @@ public interface LifecycleExecutor
{ {
String ROLE = LifecycleExecutor.class.getName(); String ROLE = LifecycleExecutor.class.getName();
TaskValidationResult isTaskValid( String task, MavenSession session, MavenProject rootProject ); TaskValidationResult isTaskValid( String task, MavenSession session, MavenProject rootProject );
void execute( MavenSession session, ReactorManager rm, EventDispatcher dispatcher ) void execute( MavenSession session, ReactorManager rm, EventDispatcher dispatcher )
throws LifecycleExecutionException, BuildFailureException; throws LifecycleExecutionException, BuildFailureException;

View File

@ -5,6 +5,8 @@ public class TaskValidationResult
{ {
private String invalidTask; private String invalidTask;
private Throwable cause;
private String message; private String message;
public TaskValidationResult() public TaskValidationResult()
@ -14,10 +16,16 @@ public class TaskValidationResult
public TaskValidationResult( String invalidTask, String message ) public TaskValidationResult( String invalidTask, String message )
{ {
this.invalidTask = invalidTask; this.invalidTask = invalidTask;
this.message = message; this.message = message;
} }
public TaskValidationResult( String invalidTask, String message, Throwable cause )
{
this.message = message;
this.cause = cause;
this.invalidTask = invalidTask;
}
public String getInvalidTask() public String getInvalidTask()
{ {
return invalidTask; return invalidTask;
@ -28,6 +36,11 @@ public class TaskValidationResult
return message; return message;
} }
public Throwable getCause()
{
return cause;
}
public boolean isTaskValid() public boolean isTaskValid()
{ {
return invalidTask == null; return invalidTask == null;

View File

@ -166,7 +166,7 @@ public class DefaultPluginManager
MavenProject project, MavenProject project,
MavenSession session ) MavenSession session )
throws ArtifactResolutionException, PluginVersionResolutionException, throws ArtifactResolutionException, PluginVersionResolutionException,
ArtifactNotFoundException, InvalidVersionSpecificationException, InvalidPluginException, ArtifactNotFoundException, InvalidPluginException,
PluginManagerException, PluginNotFoundException, PluginVersionNotFoundException PluginManagerException, PluginNotFoundException, PluginVersionNotFoundException
{ {
// TODO: this should be possibly outside // TODO: this should be possibly outside
@ -187,7 +187,7 @@ public class DefaultPluginManager
MavenProject project, MavenProject project,
MavenSession session ) MavenSession session )
throws PluginVersionResolutionException, ArtifactNotFoundException, throws PluginVersionResolutionException, ArtifactNotFoundException,
ArtifactResolutionException, InvalidVersionSpecificationException, InvalidPluginException, ArtifactResolutionException, InvalidPluginException,
PluginManagerException, PluginNotFoundException PluginManagerException, PluginNotFoundException
{ {
ArtifactRepository localRepository = session.getLocalRepository(); ArtifactRepository localRepository = session.getLocalRepository();
@ -199,7 +199,7 @@ public class DefaultPluginManager
MavenProject project, MavenProject project,
ArtifactRepository localRepository ) ArtifactRepository localRepository )
throws PluginVersionResolutionException, ArtifactNotFoundException, throws PluginVersionResolutionException, ArtifactNotFoundException,
ArtifactResolutionException, InvalidVersionSpecificationException, InvalidPluginException, ArtifactResolutionException, InvalidPluginException,
PluginManagerException, PluginNotFoundException PluginManagerException, PluginNotFoundException
{ {
getLogger().debug( "In verifyVersionedPlugin for: " + plugin.getKey() ); getLogger().debug( "In verifyVersionedPlugin for: " + plugin.getKey() );
@ -213,7 +213,15 @@ public class DefaultPluginManager
// if the groupId is internal, don't try to resolve it... // if the groupId is internal, don't try to resolve it...
if ( !RESERVED_GROUP_IDS.contains( plugin.getGroupId() ) ) if ( !RESERVED_GROUP_IDS.contains( plugin.getGroupId() ) )
{ {
VersionRange versionRange = VersionRange.createFromVersionSpec( plugin.getVersion() ); VersionRange versionRange;
try
{
versionRange = VersionRange.createFromVersionSpec( plugin.getVersion() );
}
catch ( InvalidVersionSpecificationException e )
{
throw new PluginManagerException( plugin, e );
}
List remoteRepositories = new ArrayList(); List remoteRepositories = new ArrayList();
@ -257,12 +265,12 @@ public class DefaultPluginManager
if ( ( groupId == null ) || ( artifactId == null ) || ( version == null ) ) if ( ( groupId == null ) || ( artifactId == null ) || ( version == null ) )
{ {
throw new PluginNotFoundException( e ); throw new PluginNotFoundException( plugin, e );
} }
else if ( groupId.equals( e.getGroupId() ) && artifactId.equals( e.getArtifactId() ) else if ( groupId.equals( e.getGroupId() ) && artifactId.equals( e.getArtifactId() )
&& version.equals( e.getVersion() ) && "maven-plugin".equals( e.getType() ) ) && version.equals( e.getVersion() ) && "maven-plugin".equals( e.getType() ) )
{ {
throw new PluginNotFoundException( e ); throw new PluginNotFoundException( plugin, e );
} }
else else
{ {
@ -412,12 +420,12 @@ public class DefaultPluginManager
componentRealm = container.createComponentRealm( projectPlugin.getKey(), jars ); componentRealm = container.createComponentRealm( projectPlugin.getKey(), jars );
String parentRealmId = componentRealm.getParentRealm().getId();
// adding for MNG-3012 to try to work around problems with Xpp3Dom (from plexus-utils) // adding for MNG-3012 to try to work around problems with Xpp3Dom (from plexus-utils)
// spawning a ClassCastException when a mojo calls plugin.getConfiguration() from maven-model... // spawning a ClassCastException when a mojo calls plugin.getConfiguration() from maven-model...
componentRealm.importFrom( componentRealm.getParentRealm().getId(), componentRealm.importFrom( parentRealmId, Xpp3Dom.class.getName() );
Xpp3Dom.class.getName() ); componentRealm.importFrom( parentRealmId, "org.codehaus.plexus.util.xml.pull" );
componentRealm.importFrom( componentRealm.getParentRealm().getId(),
"org.codehaus.plexus.util.xml.pull" );
// Adding for MNG-2878, since maven-reporting-impl was removed from the // Adding for MNG-2878, since maven-reporting-impl was removed from the
// internal list of artifacts managed by maven, the classloader is different // internal list of artifacts managed by maven, the classloader is different
@ -425,17 +433,17 @@ public class DefaultPluginManager
// is not available from the AbstractMavenReport since it uses: // is not available from the AbstractMavenReport since it uses:
// getClass().getResourceAsStream( "/default-report.xml" ) // getClass().getResourceAsStream( "/default-report.xml" )
// (maven-reporting-impl version 2.0; line 134; affects: checkstyle plugin, and probably others) // (maven-reporting-impl version 2.0; line 134; affects: checkstyle plugin, and probably others)
componentRealm.importFrom( componentRealm.getParentRealm().getId(), "/default-report.xml" ); componentRealm.importFrom( parentRealmId, "/default-report.xml" );
} }
catch ( PlexusContainerException e ) catch ( PlexusContainerException e )
{ {
throw new PluginManagerException( "Failed to create realm for plugin '" + projectPlugin throw new PluginContainerException( plugin, componentRealm, "Failed to create realm for plugin '" + projectPlugin
+ ".", e ); + ".", e );
} }
catch ( NoSuchRealmException e ) catch ( NoSuchRealmException e )
{ {
throw new PluginManagerException( throw new PluginContainerException( plugin, componentRealm,
"Failed to import Xpp3Dom from parent realm for plugin: '" "Failed to import Xpp3Dom from core realm for plugin: '"
+ projectPlugin + ".", e ); + projectPlugin + ".", e );
} }
@ -716,7 +724,7 @@ public class DefaultPluginManager
MavenProject project, MavenProject project,
MavenSession session ) MavenSession session )
throws PluginVersionResolutionException, ArtifactResolutionException, throws PluginVersionResolutionException, ArtifactResolutionException,
ArtifactNotFoundException, InvalidVersionSpecificationException, InvalidPluginException, ArtifactNotFoundException, InvalidPluginException,
PluginManagerException, PluginNotFoundException, PluginVersionNotFoundException PluginManagerException, PluginNotFoundException, PluginVersionNotFoundException
{ {
String version = reportPlugin.getVersion(); String version = reportPlugin.getVersion();
@ -759,72 +767,81 @@ public class DefaultPluginManager
Mojo plugin; Mojo plugin;
try ClassRealm realm = mojoDescriptor.getPluginDescriptor().getClassRealm();
// We are forcing the use of the plugin realm for all lookups that might occur during
// the lifecycle that is part of the lookup. Here we are specifically trying to keep
// lookups that occur in contextualize calls in line with the right realm.
if ( realm != null )
{ {
ClassRealm realm = mojoDescriptor.getPluginDescriptor().getClassRealm(); ClassRealm oldRealm = container.setLookupRealm( realm );
// We are forcing the use of the plugin realm for all lookups that might occur during getLogger().debug(
// the lifecycle that is part of the lookup. Here we are specifically trying to keep "Looking up mojo " + mojoDescriptor.getRoleHint() + " in realm "
// lookups that occur in contextualize calls in line with the right realm. + realm.getId() + " - descRealmId="
+ mojoDescriptor.getRealmId() );
if ( realm != null ) try
{ {
ClassRealm oldRealm = container.setLookupRealm( realm );
getLogger().debug(
"Looking up mojo " + mojoDescriptor.getRoleHint() + " in realm "
+ realm.getId() + " - descRealmId="
+ mojoDescriptor.getRealmId() );
plugin = (Mojo) container.lookup( Mojo.ROLE, mojoDescriptor.getRoleHint(), realm ); plugin = (Mojo) container.lookup( Mojo.ROLE, mojoDescriptor.getRoleHint(), realm );
}
catch ( ComponentLookupException e )
{
throw new PluginContainerException( mojoDescriptor, realm, "Unable to find the mojo '"
+ mojoDescriptor.getRoleHint() + "' in the plugin '"
+ pluginDescriptor.getPluginLookupKey() + "'", e );
}
if ( plugin != null ) if ( plugin != null )
{ {
getLogger().debug( getLogger().debug(
"Looked up - " + plugin + " - " "Looked up - " + plugin + " - "
+ plugin.getClass().getClassLoader() ); + plugin.getClass().getClassLoader() );
}
else
{
getLogger().warn( "No luck." );
}
container.setLookupRealm( oldRealm );
} }
else else
{ {
getLogger().info( getLogger().warn( "No luck." );
"Looking up mojo " + mojoDescriptor.getRoleHint()
+ " in default realm "
+ container.getLookupRealm() + " - descRealmId="
+ mojoDescriptor.getRealmId() );
plugin = (Mojo) container.lookup( Mojo.ROLE, mojoDescriptor.getRoleHint() );
if ( plugin != null )
{
getLogger().info(
"Looked up - " + plugin + " - "
+ plugin.getClass().getClassLoader() );
}
else
{
getLogger().warn( "No luck." );
}
} }
if ( report && !( plugin instanceof MavenReport ) ) container.setLookupRealm( oldRealm );
{
// TODO: the mojoDescriptor should actually capture this information so we don't get this far
return null;
}
} }
catch ( ComponentLookupException e ) else
{ {
throw new PluginManagerException( "Unable to find the mojo '" getLogger().info(
+ mojoDescriptor.getRoleHint() + "' in the plugin '" "Looking up mojo " + mojoDescriptor.getRoleHint()
+ pluginDescriptor.getPluginLookupKey() + "'", e ); + " in default realm "
+ container.getLookupRealm() + " - descRealmId="
+ mojoDescriptor.getRealmId() );
try
{
plugin = (Mojo) container.lookup( Mojo.ROLE, mojoDescriptor.getRoleHint() );
}
catch ( ComponentLookupException e )
{
throw new PluginContainerException( mojoDescriptor, container.getContainerRealm(), "Unable to find the mojo '"
+ mojoDescriptor.getRoleHint() + "' in the plugin '"
+ pluginDescriptor.getPluginLookupKey() + "' (using core class realm)", e );
}
if ( plugin != null )
{
getLogger().info(
"Looked up - " + plugin + " - "
+ plugin.getClass().getClassLoader() );
}
else
{
getLogger().warn( "No luck." );
}
}
if ( report && !( plugin instanceof MavenReport ) )
{
// TODO: the mojoDescriptor should actually capture this information so we don't get this far
return null;
} }
if ( plugin instanceof ContextEnabled ) if ( plugin instanceof ContextEnabled )

View File

@ -1,5 +1,8 @@
package org.apache.maven.plugin; package org.apache.maven.plugin;
import org.apache.maven.project.ProjectBuildingException;
import org.apache.maven.project.artifact.InvalidDependencyVersionException;
/* /*
* Licensed to the Apache Software Foundation (ASF) under one * Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file * or more contributor license agreements. See the NOTICE file
@ -28,8 +31,14 @@ package org.apache.maven.plugin;
public class InvalidPluginException public class InvalidPluginException
extends Exception extends Exception
{ {
public InvalidPluginException( String message, Exception e ) public InvalidPluginException( String message, ProjectBuildingException e )
{ {
super( message, e ); super( message, e );
} }
public InvalidPluginException( String message, InvalidDependencyVersionException e )
{
super( message, e );
}
} }

View File

@ -20,6 +20,9 @@ package org.apache.maven.plugin;
*/ */
import org.apache.maven.plugin.descriptor.PluginDescriptor; import org.apache.maven.plugin.descriptor.PluginDescriptor;
import org.codehaus.plexus.component.configurator.ComponentConfigurationException;
import org.codehaus.plexus.component.configurator.expression.ExpressionEvaluationException;
import org.codehaus.plexus.component.repository.exception.ComponentLookupException;
/** /**
* @author <a href="mailto:jason@maven.org">Jason van Zyl</a> * @author <a href="mailto:jason@maven.org">Jason van Zyl</a>
@ -44,10 +47,30 @@ public class PluginConfigurationException
public PluginConfigurationException( public PluginConfigurationException(
PluginDescriptor pluginDescriptor, PluginDescriptor pluginDescriptor,
String originalMessage, String originalMessage,
Throwable e ) ExpressionEvaluationException cause )
{ {
super( e ); super( cause );
this.pluginDescriptor = pluginDescriptor; this.pluginDescriptor = pluginDescriptor;
this.originalMessage = originalMessage; this.originalMessage = originalMessage;
} }
public PluginConfigurationException(
PluginDescriptor pluginDescriptor,
String originalMessage,
ComponentConfigurationException cause )
{
super( cause );
this.pluginDescriptor = pluginDescriptor;
this.originalMessage = originalMessage;
}
public PluginConfigurationException(
PluginDescriptor pluginDescriptor,
String originalMessage,
ComponentLookupException cause )
{
super( cause );
this.pluginDescriptor = pluginDescriptor;
this.originalMessage = originalMessage;
}
} }

View File

@ -0,0 +1,60 @@
package org.apache.maven.plugin;
import org.apache.maven.model.Plugin;
import org.apache.maven.plugin.descriptor.MojoDescriptor;
import org.codehaus.plexus.PlexusContainerException;
import org.codehaus.plexus.classworlds.realm.ClassRealm;
import org.codehaus.plexus.classworlds.realm.NoSuchRealmException;
import org.codehaus.plexus.component.repository.exception.ComponentLookupException;
/**
* Exception which occurs to indicate that the plugin cannot be initialized due
* to some deeper problem with Plexus. Context information includes the groupId,
* artifactId, and version for the plugin; at times, the goal name for which
* execution failed; a message detailing the problem; the ClassRealm used to
* lookup the plugin; and the Plexus exception that caused this error.
*
* @author jdcasey
*
*/
public class PluginContainerException
extends PluginManagerException
{
private final ClassRealm pluginRealm;
public PluginContainerException( MojoDescriptor mojoDescriptor,
ClassRealm pluginRealm,
String message,
ComponentLookupException e )
{
super( mojoDescriptor, message, e );
this.pluginRealm = pluginRealm;
}
public PluginContainerException( Plugin plugin,
ClassRealm pluginRealm,
String message,
NoSuchRealmException e )
{
super( plugin, message, e );
this.pluginRealm = pluginRealm;
}
public PluginContainerException( Plugin plugin,
ClassRealm pluginRealm,
String message,
PlexusContainerException e )
{
super( plugin, message, e );
this.pluginRealm = pluginRealm;
}
public ClassRealm getPluginRealm()
{
return pluginRealm;
}
}

View File

@ -19,10 +19,8 @@ package org.apache.maven.plugin;
* under the License. * under the License.
*/ */
import org.apache.maven.artifact.repository.ArtifactRepository;
import org.apache.maven.artifact.resolver.ArtifactNotFoundException; import org.apache.maven.artifact.resolver.ArtifactNotFoundException;
import org.apache.maven.artifact.resolver.ArtifactResolutionException; import org.apache.maven.artifact.resolver.ArtifactResolutionException;
import org.apache.maven.artifact.versioning.InvalidVersionSpecificationException;
import org.apache.maven.execution.MavenSession; import org.apache.maven.execution.MavenSession;
import org.apache.maven.model.Plugin; import org.apache.maven.model.Plugin;
import org.apache.maven.model.ReportPlugin; import org.apache.maven.model.ReportPlugin;
@ -32,7 +30,6 @@ import org.apache.maven.plugin.version.PluginVersionResolutionException;
import org.apache.maven.project.MavenProject; import org.apache.maven.project.MavenProject;
import org.apache.maven.project.artifact.InvalidDependencyVersionException; import org.apache.maven.project.artifact.InvalidDependencyVersionException;
import org.apache.maven.reporting.MavenReport; import org.apache.maven.reporting.MavenReport;
import org.apache.maven.settings.Settings;
import org.codehaus.plexus.component.repository.exception.ComponentLookupException; import org.codehaus.plexus.component.repository.exception.ComponentLookupException;
import java.util.Map; import java.util.Map;
@ -62,19 +59,19 @@ public interface PluginManager
Plugin getPluginDefinitionForPrefix( String prefix, Plugin getPluginDefinitionForPrefix( String prefix,
MavenSession session, MavenSession session,
MavenProject project ); MavenProject project );
PluginDescriptor verifyPlugin( Plugin plugin, PluginDescriptor verifyPlugin( Plugin plugin,
MavenProject project, MavenProject project,
MavenSession session ) MavenSession session )
throws ArtifactResolutionException, PluginVersionResolutionException, ArtifactNotFoundException, throws ArtifactResolutionException, PluginVersionResolutionException, ArtifactNotFoundException,
InvalidVersionSpecificationException, InvalidPluginException, PluginManagerException, PluginNotFoundException, InvalidPluginException, PluginManagerException, PluginNotFoundException,
PluginVersionNotFoundException; PluginVersionNotFoundException;
PluginDescriptor verifyReportPlugin( ReportPlugin reportPlugin, PluginDescriptor verifyReportPlugin( ReportPlugin reportPlugin,
MavenProject project, MavenProject project,
MavenSession session ) MavenSession session )
throws PluginVersionResolutionException, ArtifactResolutionException, ArtifactNotFoundException, throws PluginVersionResolutionException, ArtifactResolutionException, ArtifactNotFoundException,
InvalidVersionSpecificationException, InvalidPluginException, PluginManagerException, PluginNotFoundException, InvalidPluginException, PluginManagerException, PluginNotFoundException,
PluginVersionNotFoundException; PluginVersionNotFoundException;
Object getPluginComponent( Plugin plugin, Object getPluginComponent( Plugin plugin,

View File

@ -1,5 +1,12 @@
package org.apache.maven.plugin; package org.apache.maven.plugin;
import org.apache.maven.artifact.versioning.InvalidVersionSpecificationException;
import org.apache.maven.model.Plugin;
import org.apache.maven.plugin.descriptor.MojoDescriptor;
import org.codehaus.plexus.PlexusContainerException;
import org.codehaus.plexus.classworlds.realm.NoSuchRealmException;
import org.codehaus.plexus.component.repository.exception.ComponentLookupException;
/* /*
* Licensed to the Apache Software Foundation (ASF) under one * Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file * or more contributor license agreements. See the NOTICE file
@ -28,13 +35,74 @@ package org.apache.maven.plugin;
public class PluginManagerException public class PluginManagerException
extends Exception extends Exception
{ {
public PluginManagerException( String message )
private final String pluginGroupId;
private final String pluginArtifactId;
private final String pluginVersion;
private String goal;
protected PluginManagerException( Plugin plugin,
String message,
PlexusContainerException cause )
{ {
super( message ); super( message, cause );
pluginGroupId = plugin.getGroupId();
pluginArtifactId = plugin.getArtifactId();
pluginVersion = plugin.getVersion();
} }
public PluginManagerException( String message, Exception e ) protected PluginManagerException( Plugin plugin, String message,
NoSuchRealmException cause )
{ {
super( message, e ); super( message, cause );
pluginGroupId = plugin.getGroupId();
pluginArtifactId = plugin.getArtifactId();
pluginVersion = plugin.getVersion();
}
protected PluginManagerException( MojoDescriptor mojoDescriptor,
String message,
ComponentLookupException cause )
{
super( message, cause );
pluginGroupId = mojoDescriptor.getPluginDescriptor().getGroupId();
pluginArtifactId = mojoDescriptor.getPluginDescriptor().getArtifactId();
pluginVersion = mojoDescriptor.getPluginDescriptor().getVersion();
goal = mojoDescriptor.getGoal();
}
public PluginManagerException( Plugin plugin,
InvalidVersionSpecificationException cause )
{
super( cause );
pluginGroupId = plugin.getGroupId();
pluginArtifactId = plugin.getArtifactId();
pluginVersion = plugin.getVersion();
}
public String getPluginGroupId()
{
return pluginGroupId;
}
public String getPluginArtifactId()
{
return pluginArtifactId;
}
public String getPluginVersion()
{
return pluginVersion;
}
public String getGoal()
{
return goal;
} }
} }

View File

@ -21,6 +21,7 @@ package org.apache.maven.plugin;
import org.apache.maven.artifact.resolver.AbstractArtifactResolutionException; import org.apache.maven.artifact.resolver.AbstractArtifactResolutionException;
import org.apache.maven.artifact.resolver.ArtifactNotFoundException; import org.apache.maven.artifact.resolver.ArtifactNotFoundException;
import org.apache.maven.model.Plugin;
/** /**
* Exception occurring trying to resolve a plugin. * Exception occurring trying to resolve a plugin.
@ -31,9 +32,17 @@ import org.apache.maven.artifact.resolver.ArtifactNotFoundException;
public class PluginNotFoundException public class PluginNotFoundException
extends AbstractArtifactResolutionException extends AbstractArtifactResolutionException
{ {
public PluginNotFoundException( ArtifactNotFoundException e ) private final Plugin plugin;
public PluginNotFoundException( Plugin plugin, ArtifactNotFoundException e )
{ {
super( "Plugin could not be found - check that the goal name is correct: " + e.getMessage(), e.getGroupId(), super( "Plugin could not be found - check that the goal name is correct: " + e.getMessage(), e.getGroupId(),
e.getArtifactId(), e.getVersion(), "maven-plugin",null, e.getRemoteRepositories(), null, e.getCause() ); e.getArtifactId(), e.getVersion(), "maven-plugin",null, e.getRemoteRepositories(), null, e.getCause() );
this.plugin = plugin;
}
public Plugin getPlugin()
{
return plugin;
} }
} }

View File

@ -44,16 +44,6 @@ public class PluginParameterException
this.parameters = parameters; this.parameters = parameters;
} }
public PluginParameterException( MojoDescriptor mojo, List parameters, Throwable cause )
{
super( mojo.getPluginDescriptor(),
"Invalid or missing parameters: " + parameters + " for mojo: " + mojo.getRoleHint(), cause );
this.mojo = mojo;
this.parameters = parameters;
}
public MojoDescriptor getMojoDescriptor() public MojoDescriptor getMojoDescriptor()
{ {
return mojo; return mojo;

View File

@ -3,7 +3,6 @@ package org.apache.maven.plugin.loader;
import org.apache.maven.artifact.repository.ArtifactRepository; import org.apache.maven.artifact.repository.ArtifactRepository;
import org.apache.maven.artifact.resolver.ArtifactNotFoundException; import org.apache.maven.artifact.resolver.ArtifactNotFoundException;
import org.apache.maven.artifact.resolver.ArtifactResolutionException; import org.apache.maven.artifact.resolver.ArtifactResolutionException;
import org.apache.maven.artifact.versioning.InvalidVersionSpecificationException;
import org.apache.maven.context.BuildContextManager; import org.apache.maven.context.BuildContextManager;
import org.apache.maven.execution.SessionContext; import org.apache.maven.execution.SessionContext;
import org.apache.maven.lifecycle.model.MojoBinding; import org.apache.maven.lifecycle.model.MojoBinding;
@ -30,7 +29,7 @@ import java.util.Iterator;
/** /**
* Responsible for loading plugins, reports, and any components contained therein. Will resolve * Responsible for loading plugins, reports, and any components contained therein. Will resolve
* plugin versions and plugin prefixes as necessary for plugin resolution. * plugin versions and plugin prefixes as necessary for plugin resolution.
* *
* @author jdcasey * @author jdcasey
* *
*/ */
@ -66,7 +65,7 @@ public class DefaultPluginLoader
{ {
Throwable cause = e.getCause(); Throwable cause = e.getCause();
if ( cause != null && ( cause instanceof ComponentLookupException ) ) if ( ( cause != null ) && ( cause instanceof ComponentLookupException ) )
{ {
StringBuffer message = new StringBuffer(); StringBuffer message = new StringBuffer();
message.append( "ComponentLookupException in PluginManager while looking up a component in the realm of: " ); message.append( "ComponentLookupException in PluginManager while looking up a component in the realm of: " );
@ -98,8 +97,8 @@ public class DefaultPluginLoader
} }
/** /**
* Load the {@link PluginDescriptor} instance for the plugin implied by the specified MojoBinding, * Load the {@link PluginDescriptor} instance for the plugin implied by the specified MojoBinding,
* using the project for {@link ArtifactRepository} and other supplemental plugin information as * using the project for {@link ArtifactRepository} and other supplemental plugin information as
* necessary. * necessary.
*/ */
public PluginDescriptor loadPlugin( MojoBinding mojoBinding, MavenProject project ) public PluginDescriptor loadPlugin( MojoBinding mojoBinding, MavenProject project )
@ -193,7 +192,7 @@ public class DefaultPluginLoader
} }
/** /**
* Look for a plugin in the pluginGroups specified in the settings.xml that has a prefix * Look for a plugin in the pluginGroups specified in the settings.xml that has a prefix
* matching the one specified. Return the {@link PluginDescriptor} if a match is found. * matching the one specified. Return the {@link PluginDescriptor} if a match is found.
*/ */
private PluginDescriptor loadByPrefix( String prefix, MavenProject project ) private PluginDescriptor loadByPrefix( String prefix, MavenProject project )
@ -254,10 +253,6 @@ public class DefaultPluginLoader
{ {
throw new PluginLoaderException( plugin, "Failed to load plugin. Reason: " + e.getMessage(), e ); throw new PluginLoaderException( plugin, "Failed to load plugin. Reason: " + e.getMessage(), e );
} }
catch ( InvalidVersionSpecificationException e )
{
throw new PluginLoaderException( plugin, "Failed to load plugin. Reason: " + e.getMessage(), e );
}
catch ( InvalidPluginException e ) catch ( InvalidPluginException e )
{ {
throw new PluginLoaderException( plugin, "Failed to load plugin. Reason: " + e.getMessage(), e ); throw new PluginLoaderException( plugin, "Failed to load plugin. Reason: " + e.getMessage(), e );
@ -278,8 +273,8 @@ public class DefaultPluginLoader
} }
/** /**
* Load the {@link PluginDescriptor} instance for the report plugin implied by the specified MojoBinding, * Load the {@link PluginDescriptor} instance for the report plugin implied by the specified MojoBinding,
* using the project for {@link ArtifactRepository} and other supplemental report/plugin information as * using the project for {@link ArtifactRepository} and other supplemental report/plugin information as
* necessary. * necessary.
*/ */
public PluginDescriptor loadReportPlugin( MojoBinding mojoBinding, MavenProject project ) public PluginDescriptor loadReportPlugin( MojoBinding mojoBinding, MavenProject project )
@ -328,10 +323,6 @@ public class DefaultPluginLoader
{ {
throw new PluginLoaderException( plugin, "Failed to load plugin. Reason: " + e.getMessage(), e ); throw new PluginLoaderException( plugin, "Failed to load plugin. Reason: " + e.getMessage(), e );
} }
catch ( InvalidVersionSpecificationException e )
{
throw new PluginLoaderException( plugin, "Failed to load plugin. Reason: " + e.getMessage(), e );
}
catch ( InvalidPluginException e ) catch ( InvalidPluginException e )
{ {
throw new PluginLoaderException( plugin, "Failed to load plugin. Reason: " + e.getMessage(), e ); throw new PluginLoaderException( plugin, "Failed to load plugin. Reason: " + e.getMessage(), e );

View File

@ -1,12 +1,20 @@
package org.apache.maven.plugin.loader; package org.apache.maven.plugin.loader;
import org.apache.maven.artifact.resolver.ArtifactNotFoundException;
import org.apache.maven.artifact.resolver.ArtifactResolutionException;
import org.apache.maven.artifact.versioning.InvalidVersionSpecificationException;
import org.apache.maven.model.Plugin; import org.apache.maven.model.Plugin;
import org.apache.maven.model.ReportPlugin; import org.apache.maven.model.ReportPlugin;
import org.apache.maven.plugin.InvalidPluginException;
import org.apache.maven.plugin.PluginManagerException;
import org.apache.maven.plugin.PluginNotFoundException;
import org.apache.maven.plugin.version.PluginVersionNotFoundException;
import org.apache.maven.plugin.version.PluginVersionResolutionException;
/** /**
* Signifies a failure to load a plugin. This is used to abstract the specific errors which may be * Signifies a failure to load a plugin. This is used to abstract the specific errors which may be
* encountered at lower levels, and provide a dependable interface to the plugin-loading framework. * encountered at lower levels, and provide a dependable interface to the plugin-loading framework.
* *
* @author jdcasey * @author jdcasey
* *
*/ */
@ -16,18 +24,60 @@ public class PluginLoaderException
private String pluginKey; private String pluginKey;
public PluginLoaderException( Plugin plugin, String message, Throwable cause ) public PluginLoaderException( Plugin plugin, String message, ArtifactResolutionException cause )
{ {
super( message, cause ); super( message, cause );
this.pluginKey = plugin.getKey(); pluginKey = plugin.getKey();
}
public PluginLoaderException( Plugin plugin, String message, ArtifactNotFoundException cause )
{
super( message, cause );
pluginKey = plugin.getKey();
}
public PluginLoaderException( Plugin plugin, String message, PluginNotFoundException cause )
{
super( message, cause );
pluginKey = plugin.getKey();
}
public PluginLoaderException( Plugin plugin, String message, PluginVersionResolutionException cause )
{
super( message, cause );
pluginKey = plugin.getKey();
}
public PluginLoaderException( Plugin plugin, String message, InvalidVersionSpecificationException cause )
{
super( message, cause );
pluginKey = plugin.getKey();
}
public PluginLoaderException( Plugin plugin, String message, InvalidPluginException cause )
{
super( message, cause );
pluginKey = plugin.getKey();
}
public PluginLoaderException( Plugin plugin, String message, PluginManagerException cause )
{
super( message, cause );
pluginKey = plugin.getKey();
}
public PluginLoaderException( Plugin plugin, String message, PluginVersionNotFoundException cause )
{
super( message, cause );
pluginKey = plugin.getKey();
} }
public PluginLoaderException( Plugin plugin, String message ) public PluginLoaderException( Plugin plugin, String message )
{ {
super( message ); super( message );
this.pluginKey = plugin.getKey(); pluginKey = plugin.getKey();
} }
public PluginLoaderException( String message ) public PluginLoaderException( String message )
{ {
super( message ); super( message );
@ -41,15 +91,15 @@ public class PluginLoaderException
public PluginLoaderException( ReportPlugin plugin, String message, Throwable cause ) public PluginLoaderException( ReportPlugin plugin, String message, Throwable cause )
{ {
super( message, cause ); super( message, cause );
this.pluginKey = plugin.getKey(); pluginKey = plugin.getKey();
} }
public PluginLoaderException( ReportPlugin plugin, String message ) public PluginLoaderException( ReportPlugin plugin, String message )
{ {
super( message ); super( message );
this.pluginKey = plugin.getKey(); pluginKey = plugin.getKey();
} }
public String getPluginKey() public String getPluginKey()
{ {
return pluginKey; return pluginKey;

View File

@ -1,5 +1,8 @@
package org.apache.maven.plugin.version; package org.apache.maven.plugin.version;
import org.apache.maven.artifact.metadata.ArtifactMetadataRetrievalException;
import org.apache.maven.artifact.versioning.InvalidVersionSpecificationException;
/* /*
* Licensed to the Apache Software Foundation (ASF) under one * Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file * or more contributor license agreements. See the NOTICE file
@ -47,7 +50,16 @@ public class PluginVersionResolutionException
private final String baseMessage; private final String baseMessage;
public PluginVersionResolutionException( String groupId, String artifactId, String baseMessage, Throwable cause ) public PluginVersionResolutionException( String groupId, String artifactId, String baseMessage, ArtifactMetadataRetrievalException cause )
{
super( "Error resolving version for \'" + groupId + ":" + artifactId + "\': " + baseMessage, cause );
this.groupId = groupId;
this.artifactId = artifactId;
this.baseMessage = baseMessage;
}
public PluginVersionResolutionException( String groupId, String artifactId, String baseMessage, InvalidVersionSpecificationException cause )
{ {
super( "Error resolving version for \'" + groupId + ":" + artifactId + "\': " + baseMessage, cause ); super( "Error resolving version for \'" + groupId + ":" + artifactId + "\': " + baseMessage, cause );

View File

@ -1,5 +1,11 @@
package org.apache.maven.reactor; package org.apache.maven.reactor;
import org.apache.maven.artifact.resolver.ArtifactResolutionException;
import org.apache.maven.extension.ExtensionScanningException;
import org.apache.maven.project.ProjectBuildingException;
import java.io.IOException;
/* /*
* Licensed to the Apache Software Foundation (ASF) under one * Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file * or more contributor license agreements. See the NOTICE file
@ -59,7 +65,22 @@ public class MavenExecutionException
super( cause ); super( cause );
} }
public MavenExecutionException( String message, Throwable cause ) public MavenExecutionException( String message, IOException cause )
{
super( message, cause );
}
public MavenExecutionException( String message, ProjectBuildingException cause )
{
super( message, cause );
}
public MavenExecutionException( String message, ArtifactResolutionException cause )
{
super( message, cause );
}
public MavenExecutionException( String message, ExtensionScanningException cause )
{ {
super( message, cause ); super( message, cause );
} }

View File

@ -245,4 +245,21 @@ under the License.
</build> </build>
</profile> </profile>
</profiles> </profiles>
<!--
<build>
<pluginManagement>
<plugins>
<plugin>
<artifactId>maven-surefire-plugin</artifactId>
<configuration>
<excludes>
<exclude>**/TestEmbedderLogger.java</exclude>
</excludes>
</configuration>
</plugin>
</plugins>
</pluginManagement>
</build>
-->
</project> </project>

View File

@ -92,66 +92,52 @@ public class CLIManager
{ {
options = new Options(); options = new Options();
options.addOption( OptionBuilder.withLongOpt( "file" ).hasArg().withDescription( options.addOption( OptionBuilder.hasArg( true ).create( ALTERNATE_POM_FILE ) );
"Force the use of an alternate POM file." ).create( ALTERNATE_POM_FILE ) );
options.addOption( options.addOption(
OptionBuilder.withLongOpt( "define" ).hasArg().withDescription( "Define a system property" ).create( OptionBuilder.hasArg( true ).create(
SET_SYSTEM_PROPERTY ) ); SET_SYSTEM_PROPERTY ) );
options.addOption( options.addOption(
OptionBuilder.withLongOpt( "offline" ).withDescription( "Work offline" ).create( OFFLINE ) ); OptionBuilder.create( OFFLINE ) );
options.addOption( options.addOption(
OptionBuilder.withLongOpt( "help" ).withDescription( "Display help information" ).create( HELP ) ); OptionBuilder.create( HELP ) );
options.addOption( options.addOption(
OptionBuilder.withLongOpt( "version" ).withDescription( "Display version information" ).create( OptionBuilder.create(
VERSION ) ); VERSION ) );
options.addOption( options.addOption(
OptionBuilder.withLongOpt( "quiet" ).withDescription( "Quiet output - only show errors" ).create( OptionBuilder.create(
QUIET ) ); QUIET ) );
options.addOption( options.addOption(
OptionBuilder.withLongOpt( "debug" ).withDescription( "Produce execution debug output" ).create( OptionBuilder.create(
DEBUG ) ); DEBUG ) );
options.addOption( options.addOption(
OptionBuilder.withLongOpt( "errors" ).withDescription( "Produce execution error messages" ).create( OptionBuilder.create(
ERRORS ) ); ERRORS ) );
options.addOption( OptionBuilder.withLongOpt( "reactor" ).withDescription( options.addOption( OptionBuilder.create( REACTOR ) );
"Execute goals for project found in the reactor" ).create( REACTOR ) ); options.addOption( OptionBuilder.create( NON_RECURSIVE ) );
options.addOption( OptionBuilder.withLongOpt( "non-recursive" ).withDescription( options.addOption( OptionBuilder.create( UPDATE_SNAPSHOTS ) );
"Do not recurse into sub-projects" ).create( NON_RECURSIVE ) ); options.addOption( OptionBuilder.hasArg( true ).create( ACTIVATE_PROFILES ) );
options.addOption( OptionBuilder.withLongOpt( "update-snapshots" ).withDescription(
"Forces a check for updated releases and snapshots on remote repositories" ).create( UPDATE_SNAPSHOTS ) );
options.addOption( OptionBuilder.withLongOpt( "activate-profiles" ).withDescription(
"Comma-delimited list of profiles to activate" ).hasArg().create( ACTIVATE_PROFILES ) );
options.addOption( OptionBuilder.withLongOpt( "batch-mode" ).withDescription( options.addOption( OptionBuilder.create( BATCH_MODE ) );
"Run in non-interactive (batch) mode" ).create( BATCH_MODE ) );
options.addOption( OptionBuilder.withLongOpt( "check-plugin-updates" ).withDescription( options.addOption( OptionBuilder.create( FORCE_PLUGIN_UPDATES ) );
"Force upToDate check for any relevant registered plugins" ).create( FORCE_PLUGIN_UPDATES ) ); options.addOption( OptionBuilder.create( FORCE_PLUGIN_UPDATES2 ) );
options.addOption( OptionBuilder.withLongOpt( "update-plugins" ).withDescription( options.addOption( OptionBuilder.create( SUPPRESS_PLUGIN_UPDATES ) );
"Synonym for " + FORCE_PLUGIN_UPDATES ).create( FORCE_PLUGIN_UPDATES2 ) );
options.addOption( OptionBuilder.withLongOpt( "no-plugin-updates" ).withDescription(
"Suppress upToDate check for any relevant registered plugins" ).create( SUPPRESS_PLUGIN_UPDATES ) );
options.addOption(OptionBuilder.withLongOpt("no-snapshot-updates") options.addOption(OptionBuilder
.withDescription("Supress SNAPSHOT updates")
.create(SUPRESS_SNAPSHOT_UPDATES)); .create(SUPRESS_SNAPSHOT_UPDATES));
options.addOption( OptionBuilder.withLongOpt( "no-plugin-registry" ).withDescription( options.addOption( OptionBuilder.create( SUPPRESS_PLUGIN_REGISTRY ) );
"Don't use ~/.m2/plugin-registry.xml for plugin versions" ).create( SUPPRESS_PLUGIN_REGISTRY ) );
options.addOption( OptionBuilder.withLongOpt( "strict-checksums" ).withDescription( options.addOption( OptionBuilder.create( CHECKSUM_FAILURE_POLICY ) );
"Fail the build if checksums don't match" ).create( CHECKSUM_FAILURE_POLICY ) );
options.addOption( options.addOption(
OptionBuilder.withLongOpt( "lax-checksums" ).withDescription( "Warn if checksums don't match" ).create( OptionBuilder.create(
CHECKSUM_WARNING_POLICY ) ); CHECKSUM_WARNING_POLICY ) );
options.addOption( OptionBuilder.withLongOpt( "settings" ) options.addOption( OptionBuilder.hasArg( true )
.withDescription( "Alternate path for the user settings file" ).hasArg()
.create( ALTERNATE_USER_SETTINGS ) ); .create( ALTERNATE_USER_SETTINGS ) );
options.addOption( OptionBuilder.withLongOpt( "fail-fast" ).withDescription( options.addOption( OptionBuilder.create( FAIL_FAST ) );
"Stop at first failure in reactorized builds" ).create( FAIL_FAST ) );
options.addOption( OptionBuilder.withLongOpt( "fail-at-end" ).withDescription( options.addOption( OptionBuilder.withLongOpt( "fail-at-end" ).withDescription(
"Only fail the build afterwards; allow all non-impacted builds to continue" ).create( FAIL_AT_END ) ); "Only fail the build afterwards; allow all non-impacted builds to continue" ).create( FAIL_AT_END ) );

View File

@ -0,0 +1,585 @@
package org.apache.maven.cli;
import org.apache.maven.BuildFailureException;
import org.apache.maven.artifact.resolver.ArtifactNotFoundException;
import org.apache.maven.embedder.MavenEmbedderConsoleLogger;
import org.apache.maven.embedder.MavenEmbedderLogger;
import org.apache.maven.execution.BuildFailure;
import org.apache.maven.execution.MavenExecutionRequest;
import org.apache.maven.execution.MavenExecutionResult;
import org.apache.maven.execution.ReactorManager;
import org.apache.maven.extension.ExtensionScanningException;
import org.apache.maven.lifecycle.LifecycleExecutionException;
import org.apache.maven.plugin.AbstractMojoExecutionException;
import org.apache.maven.plugin.MojoFailureException;
import org.apache.maven.plugin.PluginNotFoundException;
import org.apache.maven.project.DuplicateProjectException;
import org.apache.maven.project.InvalidProjectModelException;
import org.apache.maven.project.MavenProject;
import org.apache.maven.project.ProjectBuildingException;
import org.apache.maven.reactor.MavenExecutionException;
import org.codehaus.plexus.util.xml.pull.XmlPullParserException;
import java.io.File;
import java.io.IOException;
import java.io.InputStream;
import java.io.PrintWriter;
import java.io.StringWriter;
import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Iterator;
import java.util.Locale;
import java.util.Properties;
import java.util.TimeZone;
/**
* Utility class used to report errors, statistics, application version info, etc.
*
* @author jdcasey
*
*/
public final class CLIReportingUtils
{
public static final long MB = 1024 * 1024;
public static final int MS_PER_SEC = 1000;
public static final int SEC_PER_MIN = 60;
public static final String OS_NAME = System.getProperty( "os.name" ).toLowerCase( Locale.US );
public static final String OS_ARCH = System.getProperty( "os.arch" ).toLowerCase( Locale.US );
public static final String OS_VERSION = System.getProperty( "os.version" )
.toLowerCase( Locale.US );
private static final String NEWLINE = System.getProperty( "line.separator" );
private CLIReportingUtils()
{
}
static void showVersion()
{
InputStream resourceAsStream;
try
{
Properties properties = new Properties();
resourceAsStream = MavenCli.class.getClassLoader()
.getResourceAsStream(
"META-INF/maven/org.apache.maven/maven-core/pom.properties" );
properties.load( resourceAsStream );
if ( properties.getProperty( "builtOn" ) != null )
{
System.out.println( "Maven version: "
+ properties.getProperty( "version", "unknown" ) + " built on "
+ properties.getProperty( "builtOn" ) );
}
else
{
System.out.println( "Maven version: "
+ properties.getProperty( "version", "unknown" ) );
}
System.out.println( "Java version: "
+ System.getProperty( "java.version", "<unknown java version>" ) );
//TODO: when plexus can return the family type, add that here because it will make it easier to know what profile activation settings to use.
System.out.println( "OS name: \"" + OS_NAME + "\" version: \"" + OS_VERSION
+ "\" arch: \"" + OS_ARCH + "\"" );
}
catch ( IOException e )
{
System.err.println( "Unable determine version from JAR file: " + e.getMessage() );
}
}
static void logResult( MavenExecutionRequest request,
MavenExecutionResult result,
MavenEmbedderLogger logger )
{
ReactorManager reactorManager = result.getReactorManager();
logReactorSummary( reactorManager, logger );
if ( ( reactorManager != null ) && reactorManager.hasBuildFailures() )
{
logErrors( reactorManager, request.isShowErrors(), logger );
if ( !ReactorManager.FAIL_NEVER.equals( reactorManager.getFailureBehavior() ) )
{
logger.info( "BUILD FAILED" );
line( logger );
stats( request.getStartTime(), logger );
line( logger );
}
else
{
logger.info( " + Ignoring build failures" );
}
}
if ( result.hasExceptions() )
{
for ( Iterator i = result.getExceptions().iterator(); i.hasNext(); )
{
Exception e = (Exception) i.next();
showError( e, request.isShowErrors(), logger );
}
}
else
{
line( logger );
logger.info( "BUILD SUCCESSFUL" );
line( logger );
stats( request.getStartTime(), logger );
line( logger );
}
logger.close();
}
private static void logErrors( ReactorManager rm,
boolean showErrors,
MavenEmbedderLogger logger )
{
for ( Iterator it = rm.getSortedProjects().iterator(); it.hasNext(); )
{
MavenProject project = (MavenProject) it.next();
if ( rm.hasBuildFailure( project ) )
{
BuildFailure buildFailure = rm.getBuildFailure( project );
logger.info( "Error for project: " + project.getName() + " (during "
+ buildFailure.getTask() + ")" );
line( logger );
}
}
if ( !showErrors )
{
logger.info( "For more information, run Maven with the -e switch" );
line( logger );
}
}
static void showError( String message,
Exception e,
boolean showErrors )
{
showError( message, e, showErrors, new MavenEmbedderConsoleLogger() );
}
static void showError( Exception e, boolean show, MavenEmbedderLogger logger )
{
showError( null, e, show, logger );
}
static void showError( String message, Exception e,
boolean showStackTraces,
MavenEmbedderLogger logger )
{
StringWriter writer = new StringWriter();
writer.write( NEWLINE );
if ( message != null )
{
writer.write( message );
writer.write( NEWLINE );
}
buildErrorMessage( e, showStackTraces, writer );
writer.write( NEWLINE );
if ( showStackTraces )
{
writer.write( "Error stacktrace:" );
writer.write( NEWLINE );
e.printStackTrace( new PrintWriter( writer ) );
}
else
{
writer.write( "For more information, run with the -e flag" );
}
logger.error( writer.toString() );
}
private static void buildErrorMessage( Exception e, boolean showStackTraces, StringWriter writer )
{
boolean handled = false;
if ( e instanceof BuildFailureException )
{
handled = handleBuildFailureException( (BuildFailureException) e, writer );
}
else if ( e instanceof ProjectBuildingException )
{
handled = handleProjectBuildingException( (ProjectBuildingException) e, writer );
}
else if ( e instanceof LifecycleExecutionException )
{
handled = handleLifecycleExecutionException( (LifecycleExecutionException) e, showStackTraces, writer );
}
else if ( e instanceof DuplicateProjectException )
{
handled = handleDuplicateProjectException( (DuplicateProjectException) e, writer );
}
else if ( e instanceof MavenExecutionException )
{
handled = handleMavenExecutionException( (MavenExecutionException) e, writer );
}
if ( !handled )
{
handleGenericException( e, writer );
}
}
private static boolean handleMavenExecutionException( MavenExecutionException e,
StringWriter writer )
{
writer.write( "While scanning for build extensions:" );
writer.write( NEWLINE );
writer.write( NEWLINE );
Throwable cause = e.getCause();
if ( cause != null )
{
if ( cause instanceof IOException )
{
writer.write( e.getMessage() );
writer.write( NEWLINE );
handleGenericException( cause, writer );
return true;
}
else if ( cause instanceof ExtensionScanningException )
{
Throwable nestedCause = cause.getCause();
if ( ( nestedCause != null ) && ( nestedCause instanceof ProjectBuildingException ) )
{
return handleProjectBuildingException( (ProjectBuildingException) nestedCause, writer );
}
else
{
handleGenericException( cause, writer );
return true;
}
}
else if ( cause instanceof ProjectBuildingException )
{
return handleProjectBuildingException( (ProjectBuildingException) cause, writer );
}
}
return false;
}
private static boolean handleDuplicateProjectException( DuplicateProjectException e,
StringWriter writer )
{
File existing = e.getExistingProjectFile();
File conflicting = e.getConflictingProjectFile();
String projectId = e.getProjectId();
writer.write( "Duplicated project detected." );
writer.write( NEWLINE );
writer.write( NEWLINE );
writer.write( "Project: " + projectId );
writer.write( NEWLINE );
writer.write( "File: " );
writer.write( existing.getAbsolutePath() );
writer.write( NEWLINE );
writer.write( "File: " );
writer.write( conflicting.getAbsolutePath() );
return true;
}
private static void handleGenericException( Throwable exception, StringWriter writer )
{
writer.write( exception.getMessage() );
writer.write( NEWLINE );
}
private static boolean handleLifecycleExecutionException( LifecycleExecutionException e,
boolean showStackTraces, StringWriter writer )
{
Throwable cause = e.getCause();
if ( cause != null )
{
if ( cause instanceof PluginNotFoundException )
{
// Plugin plugin = ( (PluginNotFoundException) cause ).getPlugin();
ArtifactNotFoundException artifactException = (ArtifactNotFoundException) ( (PluginNotFoundException) cause ).getCause();
writer.write( NEWLINE );
writer.write( NEWLINE );
handleGenericException( artifactException, writer );
return true;
}
}
return false;
}
private static boolean handleProjectBuildingException( ProjectBuildingException e,
StringWriter writer )
{
boolean result = false;
Throwable cause = e.getCause();
if ( cause instanceof XmlPullParserException )
{
writer.write( "Error parsing POM:" );
writer.write( NEWLINE );
writer.write( NEWLINE );
writer.write( cause.getMessage() );
writer.write( NEWLINE );
writer.write( NEWLINE );
writer.write( "Line: " );
writer.write( "" + ( (XmlPullParserException) cause ).getLineNumber() );
writer.write( NEWLINE );
writer.write( "Column: " );
writer.write( "" + ( (XmlPullParserException) cause ).getColumnNumber() );
result = true;
}
else if ( e instanceof InvalidProjectModelException )
{
InvalidProjectModelException error = (InvalidProjectModelException) e;
writer.write( error.getMessage() );
writer.write( NEWLINE );
writer.write( "The following POM validation errors occurred:" );
writer.write( NEWLINE );
for ( Iterator it = error.getValidationResult().getMessages().iterator(); it.hasNext(); )
{
String message = (String) it.next();
writer.write( NEWLINE );
writer.write( " - " );
writer.write( message );
}
writer.write( NEWLINE );
writer.write( NEWLINE );
result = true;
}
writer.write( NEWLINE );
writer.write( "Project Id: " );
writer.write( e.getProjectId() );
writer.write( NEWLINE );
writer.write( "Project File: " );
writer.write( e.getPomLocation() );
writer.write( NEWLINE );
return result;
}
private static boolean handleBuildFailureException( BuildFailureException e, StringWriter writer )
{
Throwable cause = e.getCause();
if ( ( cause != null ) && ( cause instanceof MojoFailureException ) )
{
writer.write( ( (AbstractMojoExecutionException) cause ).getLongMessage() );
writer.write( NEWLINE );
return true;
}
return false;
}
private static void logReactorSummary( ReactorManager rm,
MavenEmbedderLogger logger )
{
if ( ( rm != null ) && rm.hasMultipleProjects() && rm.executedMultipleProjects() )
{
logger.info( "" );
logger.info( "" );
// -------------------------
// Reactor Summary:
// -------------------------
// o project-name...........FAILED
// o project2-name..........SKIPPED (dependency build failed or was skipped)
// o project-3-name.........SUCCESS
line( logger );
logger.info( "Reactor Summary:" );
line( logger );
for ( Iterator it = rm.getSortedProjects().iterator(); it.hasNext(); )
{
MavenProject project = (MavenProject) it.next();
if ( rm.hasBuildFailure( project ) )
{
logReactorSummaryLine( project.getName(), "FAILED",
rm.getBuildFailure( project ).getTime(), logger );
}
else if ( rm.isBlackListed( project ) )
{
logReactorSummaryLine( project.getName(),
"SKIPPED (dependency build failed or was skipped)",
logger );
}
else if ( rm.hasBuildSuccess( project ) )
{
logReactorSummaryLine( project.getName(), "SUCCESS",
rm.getBuildSuccess( project ).getTime(),
logger );
}
else
{
logReactorSummaryLine( project.getName(), "NOT BUILT", logger );
}
}
line( logger );
}
}
private static void stats( Date start,
MavenEmbedderLogger logger )
{
Date finish = new Date();
long time = finish.getTime() - start.getTime();
logger.info( "Total time: " + formatTime( time ) );
logger.info( "Finished at: " + finish );
//noinspection CallToSystemGC
System.gc();
Runtime r = Runtime.getRuntime();
logger.info( "Final Memory: " + ( r.totalMemory() - r.freeMemory() ) / MB + "M/"
+ r.totalMemory() / MB + "M" );
}
private static void line( MavenEmbedderLogger logger )
{
logger.info( "------------------------------------------------------------------------" );
}
private static String formatTime( long ms )
{
long secs = ms / MS_PER_SEC;
long min = secs / SEC_PER_MIN;
secs = secs % SEC_PER_MIN;
String msg = "";
if ( min > 1 )
{
msg = min + " minutes ";
}
else if ( min == 1 )
{
msg = "1 minute ";
}
if ( secs > 1 )
{
msg += secs + " seconds";
}
else if ( secs == 1 )
{
msg += "1 second";
}
else if ( min == 0 )
{
msg += "< 1 second";
}
return msg;
}
private static void logReactorSummaryLine( String name,
String status,
MavenEmbedderLogger logger )
{
logReactorSummaryLine( name, status, -1, logger );
}
private static void logReactorSummaryLine( String name,
String status,
long time,
MavenEmbedderLogger logger )
{
StringBuffer messageBuffer = new StringBuffer();
messageBuffer.append( name );
int dotCount = 54;
dotCount -= name.length();
messageBuffer.append( " " );
for ( int i = 0; i < dotCount; i++ )
{
messageBuffer.append( '.' );
}
messageBuffer.append( " " );
messageBuffer.append( status );
if ( time >= 0 )
{
messageBuffer.append( " [" );
messageBuffer.append( getFormattedTime( time ) );
messageBuffer.append( "]" );
}
logger.info( messageBuffer.toString() );
}
private static String getFormattedTime( long time )
{
String pattern = "s.SSS's'";
if ( time / 60000L > 0 )
{
pattern = "m:s" + pattern;
if ( time / 3600000L > 0 )
{
pattern = "H:m" + pattern;
}
}
DateFormat fmt = new SimpleDateFormat( pattern );
fmt.setTimeZone( TimeZone.getTimeZone( "UTC" ) );
return fmt.format( new Date( time ) );
}
}

View File

@ -0,0 +1,281 @@
package org.apache.maven.cli;
import org.apache.commons.cli.CommandLine;
import org.apache.maven.MavenTransferListener;
import org.apache.maven.execution.DefaultMavenExecutionRequest;
import org.apache.maven.execution.MavenExecutionRequest;
import java.io.File;
import java.util.ArrayList;
import java.util.List;
import java.util.Properties;
import java.util.StringTokenizer;
public final class CLIRequestUtils
{
private CLIRequestUtils()
{
}
public static MavenExecutionRequest buildRequest( CommandLine commandLine, boolean debug, boolean quiet, boolean showErrors )
{
// ----------------------------------------------------------------------
// Now that we have everything that we need we will fire up plexus and
// bring the maven component to life for use.
// ----------------------------------------------------------------------
boolean interactive = true;
if ( commandLine.hasOption( CLIManager.BATCH_MODE ) )
{
interactive = false;
}
boolean pluginUpdateOverride = false;
if ( commandLine.hasOption( CLIManager.FORCE_PLUGIN_UPDATES ) ||
commandLine.hasOption( CLIManager.FORCE_PLUGIN_UPDATES2 ) )
{
pluginUpdateOverride = true;
}
else if ( commandLine.hasOption( CLIManager.SUPPRESS_PLUGIN_UPDATES ) )
{
pluginUpdateOverride = false;
}
boolean noSnapshotUpdates = false;
if ( commandLine.hasOption( CLIManager.SUPRESS_SNAPSHOT_UPDATES ) )
{
noSnapshotUpdates = true;
}
// ----------------------------------------------------------------------
//
// ----------------------------------------------------------------------
List goals = commandLine.getArgList();
boolean recursive = true;
// this is the default behavior.
String reactorFailureBehaviour = MavenExecutionRequest.REACTOR_FAIL_FAST;
if ( commandLine.hasOption( CLIManager.NON_RECURSIVE ) )
{
recursive = false;
}
if ( commandLine.hasOption( CLIManager.FAIL_FAST ) )
{
reactorFailureBehaviour = MavenExecutionRequest.REACTOR_FAIL_FAST;
}
else if ( commandLine.hasOption( CLIManager.FAIL_AT_END ) )
{
reactorFailureBehaviour = MavenExecutionRequest.REACTOR_FAIL_AT_END;
}
else if ( commandLine.hasOption( CLIManager.FAIL_NEVER ) )
{
reactorFailureBehaviour = MavenExecutionRequest.REACTOR_FAIL_NEVER;
}
boolean offline = false;
if ( commandLine.hasOption( CLIManager.OFFLINE ) )
{
offline = true;
}
boolean updateSnapshots = false;
if ( commandLine.hasOption( CLIManager.UPDATE_SNAPSHOTS ) )
{
updateSnapshots = true;
}
String globalChecksumPolicy = null;
if ( commandLine.hasOption( CLIManager.CHECKSUM_FAILURE_POLICY ) )
{
// todo; log
System.out.println( "+ Enabling strict checksum verification on all artifact downloads." );
globalChecksumPolicy = MavenExecutionRequest.CHECKSUM_POLICY_FAIL;
}
else if ( commandLine.hasOption( CLIManager.CHECKSUM_WARNING_POLICY ) )
{
// todo: log
System.out.println( "+ Disabling strict checksum verification on all artifact downloads." );
globalChecksumPolicy = MavenExecutionRequest.CHECKSUM_POLICY_WARN;
}
File baseDirectory = new File( System.getProperty( "user.dir" ) );
// ----------------------------------------------------------------------
// Profile Activation
// ----------------------------------------------------------------------
List activeProfiles = new ArrayList();
List inactiveProfiles = new ArrayList();
if ( commandLine.hasOption( CLIManager.ACTIVATE_PROFILES ) )
{
String profilesLine = commandLine.getOptionValue( CLIManager.ACTIVATE_PROFILES );
StringTokenizer profileTokens = new StringTokenizer( profilesLine, "," );
while ( profileTokens.hasMoreTokens() )
{
String profileAction = profileTokens.nextToken().trim();
if ( profileAction.startsWith( "-" ) )
{
activeProfiles.add( profileAction.substring( 1 ) );
}
else if ( profileAction.startsWith( "+" ) )
{
inactiveProfiles.add( profileAction.substring( 1 ) );
}
else
{
// TODO: deprecate this eventually!
activeProfiles.add( profileAction );
}
}
}
MavenTransferListener transferListener;
if ( interactive )
{
transferListener = new ConsoleDownloadMonitor();
}
else
{
transferListener = new BatchModeDownloadMonitor();
}
transferListener.setShowChecksumEvents( false );
// This means to scan a directory structure for POMs and process them.
boolean useReactor = false;
if ( commandLine.hasOption( CLIManager.REACTOR ) )
{
useReactor = true;
}
String alternatePomFile = null;
if ( commandLine.hasOption( CLIManager.ALTERNATE_POM_FILE ) )
{
alternatePomFile = commandLine.getOptionValue( CLIManager.ALTERNATE_POM_FILE );
}
int loggingLevel;
if ( debug )
{
loggingLevel = MavenExecutionRequest.LOGGING_LEVEL_DEBUG;
}
else if ( quiet )
{
// TODO: we need to do some more work here. Some plugins use sys out or log errors at info level.
// Ideally, we could use Warn across the board
loggingLevel = MavenExecutionRequest.LOGGING_LEVEL_ERROR;
// TODO:Additionally, we can't change the mojo level because the component key includes the version and it isn't known ahead of time. This seems worth changing.
}
else
{
loggingLevel = MavenExecutionRequest.LOGGING_LEVEL_INFO;
}
Properties executionProperties = getExecutionProperties( commandLine );
return new DefaultMavenExecutionRequest()
.setBaseDirectory( baseDirectory )
.setGoals( goals )
.setProperties( executionProperties ) // optional
.setReactorFailureBehavior( reactorFailureBehaviour ) // default: fail fast
.setRecursive( recursive ) // default: true
.setUseReactor( useReactor ) // default: false
.setPomFile( alternatePomFile ) // optional
.setShowErrors( showErrors ) // default: false
.setInteractiveMode( interactive ) // default: false
.setOffline( offline ) // default: false
.setUsePluginUpdateOverride( pluginUpdateOverride )
.addActiveProfiles( activeProfiles ) // optional
.addInactiveProfiles( inactiveProfiles ) // optional
.setLoggingLevel( loggingLevel ) // default: info
.setTransferListener( transferListener ) // default: batch mode which goes along with interactive
.setUpdateSnapshots( updateSnapshots ) // default: false
.setNoSnapshotUpdates( noSnapshotUpdates ) // default: false
.setGlobalChecksumPolicy( globalChecksumPolicy ); // default: warn
}
// ----------------------------------------------------------------------
// System properties handling
// ----------------------------------------------------------------------
private static Properties getExecutionProperties( CommandLine commandLine )
{
Properties executionProperties = new Properties();
// ----------------------------------------------------------------------
// Options that are set on the command line become system properties
// and therefore are set in the session properties. System properties
// are most dominant.
// ----------------------------------------------------------------------
if ( commandLine.hasOption( CLIManager.SET_SYSTEM_PROPERTY ) )
{
String[] defStrs = commandLine.getOptionValues( CLIManager.SET_SYSTEM_PROPERTY );
if ( defStrs != null )
{
for ( int i = 0; i < defStrs.length; ++i )
{
setCliProperty( defStrs[i], executionProperties );
}
}
}
executionProperties.putAll( System.getProperties() );
return executionProperties;
}
private static void setCliProperty( String property,
Properties executionProperties )
{
String name;
String value;
int i = property.indexOf( "=" );
if ( i <= 0 )
{
name = property.trim();
value = "true";
}
else
{
name = property.substring( 0, i ).trim();
value = property.substring( i + 1 ).trim();
}
executionProperties.setProperty( name, value );
// ----------------------------------------------------------------------
// I'm leaving the setting of system properties here as not to break
// the SystemPropertyProfileActivator. This won't harm embedding. jvz.
// ----------------------------------------------------------------------
System.setProperty( name, value );
}
}

View File

@ -21,8 +21,6 @@ package org.apache.maven.cli;
import org.apache.commons.cli.CommandLine; import org.apache.commons.cli.CommandLine;
import org.apache.commons.cli.ParseException; import org.apache.commons.cli.ParseException;
import org.apache.maven.BuildFailureException;
import org.apache.maven.MavenTransferListener;
import org.apache.maven.embedder.Configuration; import org.apache.maven.embedder.Configuration;
import org.apache.maven.embedder.ConfigurationValidationResult; import org.apache.maven.embedder.ConfigurationValidationResult;
import org.apache.maven.embedder.DefaultConfiguration; import org.apache.maven.embedder.DefaultConfiguration;
@ -31,28 +29,11 @@ import org.apache.maven.embedder.MavenEmbedderConsoleLogger;
import org.apache.maven.embedder.MavenEmbedderException; import org.apache.maven.embedder.MavenEmbedderException;
import org.apache.maven.embedder.MavenEmbedderFileLogger; import org.apache.maven.embedder.MavenEmbedderFileLogger;
import org.apache.maven.embedder.MavenEmbedderLogger; import org.apache.maven.embedder.MavenEmbedderLogger;
import org.apache.maven.execution.BuildFailure;
import org.apache.maven.execution.DefaultMavenExecutionRequest;
import org.apache.maven.execution.MavenExecutionRequest; import org.apache.maven.execution.MavenExecutionRequest;
import org.apache.maven.execution.MavenExecutionResult; import org.apache.maven.execution.MavenExecutionResult;
import org.apache.maven.execution.ReactorManager;
import org.apache.maven.plugin.AbstractMojoExecutionException;
import org.apache.maven.project.MavenProject;
import org.codehaus.plexus.classworlds.ClassWorld; import org.codehaus.plexus.classworlds.ClassWorld;
import java.io.File; import java.io.File;
import java.io.IOException;
import java.io.InputStream;
import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.Iterator;
import java.util.List;
import java.util.Locale;
import java.util.Properties;
import java.util.StringTokenizer;
import java.util.TimeZone;
/** /**
* @author jason van zyl * @author jason van zyl
@ -63,12 +44,6 @@ public class MavenCli
{ {
public static final String LOCAL_REPO_PROPERTY = "maven.repo.local"; public static final String LOCAL_REPO_PROPERTY = "maven.repo.local";
public static final String OS_NAME = System.getProperty( "os.name" ).toLowerCase( Locale.US );
public static final String OS_ARCH = System.getProperty( "os.arch" ).toLowerCase( Locale.US );
public static final String OS_VERSION = System.getProperty( "os.version" ).toLowerCase( Locale.US );
public static void main( String[] args ) public static void main( String[] args )
{ {
ClassWorld classWorld = new ClassWorld( "plexus.core", Thread.currentThread().getContextClassLoader() ); ClassWorld classWorld = new ClassWorld( "plexus.core", Thread.currentThread().getContextClassLoader() );
@ -148,208 +123,66 @@ public class MavenCli
if ( commandLine.hasOption( CLIManager.VERSION ) ) if ( commandLine.hasOption( CLIManager.VERSION ) )
{ {
showVersion(); CLIReportingUtils.showVersion();
return 0; return 0;
} }
else if ( debug ) else if ( debug )
{ {
showVersion(); CLIReportingUtils.showVersion();
} }
// ---------------------------------------------------------------------- MavenExecutionRequest request = CLIRequestUtils.buildRequest( commandLine, debug, quiet, showErrors );
// Now that we have everything that we need we will fire up plexus and
// bring the maven component to life for use.
// ----------------------------------------------------------------------
boolean interactive = true; Configuration configuration = buildEmbedderConfiguration( request, commandLine, classWorld );
if ( commandLine.hasOption( CLIManager.BATCH_MODE ) ) ConfigurationValidationResult cvr = MavenEmbedder.validateConfiguration( configuration );
if ( cvr.isUserSettingsFilePresent() && !cvr.isUserSettingsFileParses() )
{ {
interactive = false; CLIReportingUtils.showError( "Error reading user settings: ", cvr.getUserSettingsException(), showErrors );
return 1;
} }
boolean pluginUpdateOverride = false; if ( cvr.isGlobalSettingsFilePresent() && !cvr.isGlobalSettingsFileParses() )
{
CLIReportingUtils.showError( "Error reading global settings: ", cvr.getGlobalSettingsException(), showErrors );
if ( commandLine.hasOption( CLIManager.FORCE_PLUGIN_UPDATES ) || return 1;
commandLine.hasOption( CLIManager.FORCE_PLUGIN_UPDATES2 ) )
{
pluginUpdateOverride = true;
}
else if ( commandLine.hasOption( CLIManager.SUPPRESS_PLUGIN_UPDATES ) )
{
pluginUpdateOverride = false;
} }
boolean noSnapshotUpdates = false; MavenEmbedder mavenEmbedder;
if ( commandLine.hasOption( CLIManager.SUPRESS_SNAPSHOT_UPDATES ) ) MavenEmbedderLogger logger;
try
{ {
noSnapshotUpdates = true; mavenEmbedder = new MavenEmbedder( configuration );
logger = mavenEmbedder.getLogger();
}
catch ( MavenEmbedderException e )
{
CLIReportingUtils.showError( "Unable to start the embedder: ", e, showErrors );
return 1;
} }
// ---------------------------------------------------------------------- MavenExecutionResult result = mavenEmbedder.execute( request );
//
// ----------------------------------------------------------------------
List goals = commandLine.getArgList(); CLIReportingUtils.logResult( request, result, logger );
boolean recursive = true; if ( result.hasExceptions() )
// this is the default behavior.
String reactorFailureBehaviour = MavenExecutionRequest.REACTOR_FAIL_FAST;
if ( commandLine.hasOption( CLIManager.NON_RECURSIVE ) )
{ {
recursive = false; return 1;
}
if ( commandLine.hasOption( CLIManager.FAIL_FAST ) )
{
reactorFailureBehaviour = MavenExecutionRequest.REACTOR_FAIL_FAST;
}
else if ( commandLine.hasOption( CLIManager.FAIL_AT_END ) )
{
reactorFailureBehaviour = MavenExecutionRequest.REACTOR_FAIL_AT_END;
}
else if ( commandLine.hasOption( CLIManager.FAIL_NEVER ) )
{
reactorFailureBehaviour = MavenExecutionRequest.REACTOR_FAIL_NEVER;
}
boolean offline = false;
if ( commandLine.hasOption( CLIManager.OFFLINE ) )
{
offline = true;
}
boolean updateSnapshots = false;
if ( commandLine.hasOption( CLIManager.UPDATE_SNAPSHOTS ) )
{
updateSnapshots = true;
}
String globalChecksumPolicy = null;
if ( commandLine.hasOption( CLIManager.CHECKSUM_FAILURE_POLICY ) )
{
// todo; log
System.out.println( "+ Enabling strict checksum verification on all artifact downloads." );
globalChecksumPolicy = MavenExecutionRequest.CHECKSUM_POLICY_FAIL;
}
else if ( commandLine.hasOption( CLIManager.CHECKSUM_WARNING_POLICY ) )
{
// todo: log
System.out.println( "+ Disabling strict checksum verification on all artifact downloads." );
globalChecksumPolicy = MavenExecutionRequest.CHECKSUM_POLICY_WARN;
}
File baseDirectory = new File( System.getProperty( "user.dir" ) );
// ----------------------------------------------------------------------
// Profile Activation
// ----------------------------------------------------------------------
List activeProfiles = new ArrayList();
List inactiveProfiles = new ArrayList();
if ( commandLine.hasOption( CLIManager.ACTIVATE_PROFILES ) )
{
String profilesLine = commandLine.getOptionValue( CLIManager.ACTIVATE_PROFILES );
StringTokenizer profileTokens = new StringTokenizer( profilesLine, "," );
while ( profileTokens.hasMoreTokens() )
{
String profileAction = profileTokens.nextToken().trim();
if ( profileAction.startsWith( "-" ) )
{
activeProfiles.add( profileAction.substring( 1 ) );
}
else if ( profileAction.startsWith( "+" ) )
{
inactiveProfiles.add( profileAction.substring( 1 ) );
}
else
{
// TODO: deprecate this eventually!
activeProfiles.add( profileAction );
}
}
}
MavenTransferListener transferListener;
if ( interactive )
{
transferListener = new ConsoleDownloadMonitor();
} }
else else
{ {
transferListener = new BatchModeDownloadMonitor(); return 0;
} }
}
transferListener.setShowChecksumEvents( false ); private Configuration buildEmbedderConfiguration( MavenExecutionRequest request, CommandLine commandLine, ClassWorld classWorld )
{
// This means to scan a directory structure for POMs and process them.
boolean useReactor = false;
if ( commandLine.hasOption( CLIManager.REACTOR ) )
{
useReactor = true;
}
String alternatePomFile = null;
if ( commandLine.hasOption( CLIManager.ALTERNATE_POM_FILE ) )
{
alternatePomFile = commandLine.getOptionValue( CLIManager.ALTERNATE_POM_FILE );
}
int loggingLevel;
if ( debug )
{
loggingLevel = MavenExecutionRequest.LOGGING_LEVEL_DEBUG;
}
else if ( quiet )
{
// TODO: we need to do some more work here. Some plugins use sys out or log errors at info level.
// Ideally, we could use Warn across the board
loggingLevel = MavenExecutionRequest.LOGGING_LEVEL_ERROR;
// TODO:Additionally, we can't change the mojo level because the component key includes the version and it isn't known ahead of time. This seems worth changing.
}
else
{
loggingLevel = MavenExecutionRequest.LOGGING_LEVEL_INFO;
}
Properties executionProperties = getExecutionProperties( commandLine );
MavenExecutionRequest request = new DefaultMavenExecutionRequest()
.setBaseDirectory( baseDirectory )
.setGoals( goals )
.setProperties( executionProperties ) // optional
.setReactorFailureBehavior( reactorFailureBehaviour ) // default: fail fast
.setRecursive( recursive ) // default: true
.setUseReactor( useReactor ) // default: false
.setPomFile( alternatePomFile ) // optional
.setShowErrors( showErrors ) // default: false
.setInteractiveMode( interactive ) // default: false
.setOffline( offline ) // default: false
.setUsePluginUpdateOverride( pluginUpdateOverride )
.addActiveProfiles( activeProfiles ) // optional
.addInactiveProfiles( inactiveProfiles ) // optional
.setLoggingLevel( loggingLevel ) // default: info
.setTransferListener( transferListener ) // default: batch mode which goes along with interactive
.setUpdateSnapshots( updateSnapshots ) // default: false
.setNoSnapshotUpdates( noSnapshotUpdates ) // default: false
.setGlobalChecksumPolicy( globalChecksumPolicy ); // default: warn
File userSettingsFile; File userSettingsFile;
if ( commandLine.hasOption( CLIManager.ALTERNATE_USER_SETTINGS ) ) if ( commandLine.hasOption( CLIManager.ALTERNATE_USER_SETTINGS ) )
@ -369,7 +202,7 @@ public class MavenCli
if ( commandLine.hasOption( CLIManager.LOG_FILE ) ) if ( commandLine.hasOption( CLIManager.LOG_FILE ) )
{ {
File logFile = new File( File logFile = new File(
baseDirectory, request.getBaseDirectory(),
commandLine.getOptionValue( CLIManager.LOG_FILE ) ); commandLine.getOptionValue( CLIManager.LOG_FILE ) );
configuration.setMavenEmbedderLogger( new MavenEmbedderFileLogger( logFile ) ); configuration.setMavenEmbedderLogger( new MavenEmbedderFileLogger( logFile ) );
@ -379,475 +212,14 @@ public class MavenCli
configuration.setMavenEmbedderLogger( new MavenEmbedderConsoleLogger() ); configuration.setMavenEmbedderLogger( new MavenEmbedderConsoleLogger() );
} }
ConfigurationValidationResult cvr = MavenEmbedder.validateConfiguration( configuration ); String localRepoProperty = request.getProperties().getProperty( LOCAL_REPO_PROPERTY );
if ( cvr.isUserSettingsFilePresent() && !cvr.isUserSettingsFileParses() )
{
showError( "Error reading user settings: ", cvr.getUserSettingsException(), showErrors );
return 1;
}
if ( cvr.isGlobalSettingsFilePresent() && !cvr.isGlobalSettingsFileParses() )
{
showError( "Error reading global settings: ", cvr.getGlobalSettingsException(), showErrors );
return 1;
}
String localRepoProperty = executionProperties.getProperty( LOCAL_REPO_PROPERTY );
if ( localRepoProperty != null ) if ( localRepoProperty != null )
{ {
configuration.setLocalRepository( new File( localRepoProperty ) ); configuration.setLocalRepository( new File( localRepoProperty ) );
} }
MavenEmbedder mavenEmbedder; return configuration;
try
{
mavenEmbedder = new MavenEmbedder( configuration );
logger = mavenEmbedder.getLogger();
}
catch ( MavenEmbedderException e )
{
showError( "Unable to start the embedder: ", e, showErrors );
return 1;
}
MavenExecutionResult result = mavenEmbedder.execute( request );
logResult( request, result );
if ( result.hasExceptions() )
{
return 1;
}
else
{
return 0;
}
} }
private static void showVersion()
{
InputStream resourceAsStream;
try
{
Properties properties = new Properties();
resourceAsStream = MavenCli.class.getClassLoader().getResourceAsStream(
"META-INF/maven/org.apache.maven/maven-core/pom.properties" );
properties.load( resourceAsStream );
if ( properties.getProperty( "builtOn" ) != null )
{
System.out.println( "Maven version: " + properties.getProperty( "version", "unknown" ) + " built on " +
properties.getProperty( "builtOn" ) );
}
else
{
System.out.println( "Maven version: " + properties.getProperty( "version", "unknown" ) );
}
System.out.println( "Java version: " + System.getProperty( "java.version", "<unknown java version>" ) );
//TODO: when plexus can return the family type, add that here because it will make it easier to know what profile activation settings to use.
System.out.println( "OS name: \"" + OS_NAME + "\" version: \"" + OS_VERSION + "\" arch: \"" + OS_ARCH + "\"" );
}
catch ( IOException e )
{
System.err.println( "Unable determine version from JAR file: " + e.getMessage() );
}
}
// ----------------------------------------------------------------------
// System properties handling
// ----------------------------------------------------------------------
private static Properties getExecutionProperties( CommandLine commandLine )
{
Properties executionProperties = new Properties();
// ----------------------------------------------------------------------
// Options that are set on the command line become system properties
// and therefore are set in the session properties. System properties
// are most dominant.
// ----------------------------------------------------------------------
if ( commandLine.hasOption( CLIManager.SET_SYSTEM_PROPERTY ) )
{
String[] defStrs = commandLine.getOptionValues( CLIManager.SET_SYSTEM_PROPERTY );
for ( int i = 0; i < defStrs.length; ++i )
{
setCliProperty( defStrs[i], executionProperties );
}
}
executionProperties.putAll( System.getProperties() );
return executionProperties;
}
private static void setCliProperty( String property,
Properties executionProperties )
{
String name;
String value;
int i = property.indexOf( "=" );
if ( i <= 0 )
{
name = property.trim();
value = "true";
}
else
{
name = property.substring( 0, i ).trim();
value = property.substring( i + 1 ).trim();
}
executionProperties.setProperty( name, value );
// ----------------------------------------------------------------------
// I'm leaving the setting of system properties here as not to break
// the SystemPropertyProfileActivator. This won't harm embedding. jvz.
// ----------------------------------------------------------------------
System.setProperty( name, value );
}
// ----------------------------------------------------------------------
// Reporting / Logging
// ----------------------------------------------------------------------
private static final long MB = 1024 * 1024;
private static final int MS_PER_SEC = 1000;
private static final int SEC_PER_MIN = 60;
private MavenEmbedderLogger logger;
private MavenEmbedderLogger getLogger()
{
return logger;
}
private void logResult( MavenExecutionRequest request, MavenExecutionResult result )
{
ReactorManager reactorManager = result.getReactorManager();
logReactorSummary( reactorManager );
if ( ( reactorManager != null ) && reactorManager.hasBuildFailures() )
{
logErrors(
reactorManager,
request.isShowErrors() );
if ( !ReactorManager.FAIL_NEVER.equals( reactorManager.getFailureBehavior() ) )
{
getLogger().info( "BUILD ERRORS" );
line();
stats( request.getStartTime() );
line();
}
else
{
getLogger().info( " + Ignoring failures" );
}
}
if ( result.hasExceptions() )
{
for ( Iterator i = result.getExceptions().iterator(); i.hasNext(); )
{
Exception e = (Exception) i.next();
if ( e instanceof BuildFailureException )
{
showFailure( e, request.isShowErrors() );
}
else
{
showError( e.getMessage(), e, request.isShowErrors() );
}
}
}
else
{
line();
getLogger().info( "BUILD SUCCESSFUL" );
line();
stats( request.getStartTime() );
line();
}
logger.close();
}
private void logErrors( ReactorManager rm,
boolean showErrors )
{
for ( Iterator it = rm.getSortedProjects().iterator(); it.hasNext(); )
{
MavenProject project = (MavenProject) it.next();
if ( rm.hasBuildFailure( project ) )
{
BuildFailure buildFailure = rm.getBuildFailure( project );
getLogger().info(
"Error for project: " + project.getName() + " (during " + buildFailure.getTask() + ")" );
line();
}
}
if ( !showErrors )
{
getLogger().info( "For more information, run Maven with the -e switch" );
line();
}
}
private static void showFailure( Exception e,
boolean show )
{
String message = e.getMessage();
Throwable cause = e.getCause();
if ( ( cause != null ) && ( cause instanceof AbstractMojoExecutionException ) )
{
message = ((AbstractMojoExecutionException)cause).getLongMessage();
if ( message == null )
{
message = cause.getMessage();
}
}
else
{
cause = e;
}
System.err.println();
System.err.println( message );
System.err.println();
if ( show )
{
System.err.println( "Error stacktrace:" );
cause.printStackTrace();
}
else
{
System.err.println( "For more information, run with the -e flag" );
}
}
private static void showError( String message,
Exception e,
boolean show )
{
System.err.println();
System.err.println( message );
System.err.println();
if ( show )
{
System.err.println( "Error stacktrace:" );
e.printStackTrace();
}
else
{
System.err.println( "For more information, run with the -e flag" );
}
}
private void logReactorSummary( ReactorManager rm )
{
if ( ( rm != null ) && rm.hasMultipleProjects() && rm.executedMultipleProjects() )
{
getLogger().info( "" );
getLogger().info( "" );
// -------------------------
// Reactor Summary:
// -------------------------
// o project-name...........FAILED
// o project2-name..........SKIPPED (dependency build failed or was skipped)
// o project-3-name.........SUCCESS
line();
getLogger().info( "Reactor Summary:" );
line();
for ( Iterator it = rm.getSortedProjects().iterator(); it.hasNext(); )
{
MavenProject project = (MavenProject) it.next();
if ( rm.hasBuildFailure( project ) )
{
logReactorSummaryLine(
project.getName(),
"FAILED",
rm.getBuildFailure( project ).getTime() );
}
else if ( rm.isBlackListed( project ) )
{
logReactorSummaryLine(
project.getName(),
"SKIPPED (dependency build failed or was skipped)" );
}
else if ( rm.hasBuildSuccess( project ) )
{
logReactorSummaryLine(
project.getName(),
"SUCCESS",
rm.getBuildSuccess( project ).getTime() );
}
else
{
logReactorSummaryLine(
project.getName(),
"NOT BUILT" );
}
}
line();
}
}
private void stats( Date start )
{
Date finish = new Date();
long time = finish.getTime() - start.getTime();
getLogger().info( "Total time: " + formatTime( time ) );
getLogger().info( "Finished at: " + finish );
//noinspection CallToSystemGC
System.gc();
Runtime r = Runtime.getRuntime();
getLogger().info(
"Final Memory: " + ( r.totalMemory() - r.freeMemory() ) / MB + "M/" + r.totalMemory() / MB + "M" );
}
private void line()
{
getLogger().info( "------------------------------------------------------------------------" );
}
private static String formatTime( long ms )
{
long secs = ms / MS_PER_SEC;
long min = secs / SEC_PER_MIN;
secs = secs % SEC_PER_MIN;
String msg = "";
if ( min > 1 )
{
msg = min + " minutes ";
}
else if ( min == 1 )
{
msg = "1 minute ";
}
if ( secs > 1 )
{
msg += secs + " seconds";
}
else if ( secs == 1 )
{
msg += "1 second";
}
else if ( min == 0 )
{
msg += "< 1 second";
}
return msg;
}
private void logReactorSummaryLine( String name,
String status )
{
logReactorSummaryLine(
name,
status,
-1 );
}
private void logReactorSummaryLine( String name,
String status,
long time )
{
StringBuffer messageBuffer = new StringBuffer();
messageBuffer.append( name );
int dotCount = 54;
dotCount -= name.length();
messageBuffer.append( " " );
for ( int i = 0; i < dotCount; i++ )
{
messageBuffer.append( '.' );
}
messageBuffer.append( " " );
messageBuffer.append( status );
if ( time >= 0 )
{
messageBuffer.append( " [" );
messageBuffer.append( getFormattedTime( time ) );
messageBuffer.append( "]" );
}
getLogger().info( messageBuffer.toString() );
}
private static String getFormattedTime( long time )
{
String pattern = "s.SSS's'";
if ( time / 60000L > 0 )
{
pattern = "m:s" + pattern;
if ( time / 3600000L > 0 )
{
pattern = "H:m" + pattern;
}
}
DateFormat fmt = new SimpleDateFormat( pattern );
fmt.setTimeZone( TimeZone.getTimeZone( "UTC" ) );
return fmt.format( new Date( time ) );
}
} }

View File

@ -30,7 +30,6 @@ import org.apache.maven.artifact.repository.layout.ArtifactRepositoryLayout;
import org.apache.maven.artifact.resolver.ArtifactNotFoundException; import org.apache.maven.artifact.resolver.ArtifactNotFoundException;
import org.apache.maven.artifact.resolver.ArtifactResolutionException; import org.apache.maven.artifact.resolver.ArtifactResolutionException;
import org.apache.maven.artifact.resolver.ArtifactResolver; import org.apache.maven.artifact.resolver.ArtifactResolver;
import org.apache.maven.artifact.versioning.InvalidVersionSpecificationException;
import org.apache.maven.embedder.execution.MavenExecutionRequestPopulator; import org.apache.maven.embedder.execution.MavenExecutionRequestPopulator;
import org.apache.maven.embedder.writer.WriterUtils; import org.apache.maven.embedder.writer.WriterUtils;
import org.apache.maven.execution.DefaultMavenExecutionRequest; import org.apache.maven.execution.DefaultMavenExecutionRequest;
@ -209,7 +208,7 @@ public class MavenEmbedder
throws XmlPullParserException, IOException throws XmlPullParserException, IOException
{ {
Reader reader = new FileReader( file ); Reader reader = new FileReader( file );
try try
{ {
return readModel( reader ); return readModel( reader );
@ -319,7 +318,7 @@ public class MavenEmbedder
protected void verifyPlugin( Plugin plugin, protected void verifyPlugin( Plugin plugin,
MavenProject project ) MavenProject project )
throws ComponentLookupException, ArtifactResolutionException, PluginVersionResolutionException, throws ComponentLookupException, ArtifactResolutionException, PluginVersionResolutionException,
ArtifactNotFoundException, InvalidVersionSpecificationException, InvalidPluginException, PluginManagerException, ArtifactNotFoundException, InvalidPluginException, PluginManagerException,
PluginNotFoundException, PluginVersionNotFoundException PluginNotFoundException, PluginVersionNotFoundException
{ {
PluginManager pluginManager = (PluginManager) container.lookup( PluginManager.ROLE ); PluginManager pluginManager = (PluginManager) container.lookup( PluginManager.ROLE );
@ -353,7 +352,7 @@ public class MavenEmbedder
* @todo Move this sort of thing to the tail end of the project-building process * @todo Move this sort of thing to the tail end of the project-building process
*/ */
private Map findArtifactTypeHandlers( MavenProject project ) private Map findArtifactTypeHandlers( MavenProject project )
throws Exception throws MavenEmbedderException
{ {
Map map = new HashMap(); Map map = new HashMap();
@ -363,9 +362,51 @@ public class MavenEmbedder
if ( plugin.isExtensions() ) if ( plugin.isExtensions() )
{ {
verifyPlugin( plugin, project ); try
{
verifyPlugin( plugin, project );
}
catch ( ArtifactResolutionException e )
{
throw new PluginLookupException( plugin, "Error resolving plugin.", e );
}
catch ( ArtifactNotFoundException e )
{
throw new PluginLookupException( plugin, "Error resolving plugin.", e );
}
catch ( PluginNotFoundException e )
{
throw new PluginLookupException( plugin, "Error resolving plugin.", e );
}
catch ( ComponentLookupException e )
{
throw new PluginLookupException( plugin, "Error resolving plugin.", e );
}
catch ( PluginVersionResolutionException e )
{
throw new PluginLookupException( plugin, "Error resolving plugin.", e );
}
catch ( InvalidPluginException e )
{
throw new PluginLookupException( plugin, "Error resolving plugin.", e );
}
catch ( PluginManagerException e )
{
throw new PluginLookupException( plugin, "Error resolving plugin.", e );
}
catch ( PluginVersionNotFoundException e )
{
throw new PluginLookupException( plugin, "Error resolving plugin.", e );
}
map.putAll( getPluginExtensionComponents( plugin ) ); try
{
map.putAll( getPluginExtensionComponents( plugin ) );
}
catch ( PluginManagerException e )
{
throw new PluginLookupException( plugin, "Error looking up plugin components.", e );
}
// shudder... // shudder...
for ( Iterator j = map.values().iterator(); j.hasNext(); ) for ( Iterator j = map.values().iterator(); j.hasNext(); )
@ -425,9 +466,13 @@ public class MavenEmbedder
artifactHandlerManager.addHandlers( handlers ); artifactHandlerManager.addHandlers( handlers );
} }
catch ( Exception e ) catch ( MavenEmbedderException e )
{ {
return result.addException( e ); return result.addUnknownException( e );
}
catch ( ProjectBuildingException e )
{
return result.addProjectBuildingException( e );
} }
ReactorManager reactorManager = maven.createReactorManager( request, result ); ReactorManager reactorManager = maven.createReactorManager( request, result );
@ -448,7 +493,7 @@ public class MavenEmbedder
} }
catch ( ProjectBuildingException e ) catch ( ProjectBuildingException e )
{ {
result.addException( e ); return result.addProjectBuildingException( e );
} }
if ( reactorManager.hasMultipleProjects() ) if ( reactorManager.hasMultipleProjects() )
@ -555,15 +600,15 @@ public class MavenEmbedder
// ---------------------------------------------------------------------- // ----------------------------------------------------------------------
// LegacyLifecycle // LegacyLifecycle
// ---------------------------------------------------------------------- // ----------------------------------------------------------------------
private MavenExecutionRequest request; private MavenExecutionRequest request;
private void start( Configuration configuration ) private void start( Configuration configuration )
throws MavenEmbedderException throws MavenEmbedderException
{ {
this.classWorld = configuration.getClassWorld(); classWorld = configuration.getClassWorld();
this.logger = configuration.getMavenEmbedderLogger(); logger = configuration.getMavenEmbedderLogger();
// ---------------------------------------------------------------------------- // ----------------------------------------------------------------------------
// Don't override any existing SecurityManager if one has been installed. Our // Don't override any existing SecurityManager if one has been installed. Our
@ -572,7 +617,7 @@ public class MavenEmbedder
try try
{ {
if ( System.getSecurityManager() == null && activateSystemManager ) if ( ( System.getSecurityManager() == null ) && activateSystemManager )
{ {
System.setSecurityManager( new MavenEmbedderSecurityManager() ); System.setSecurityManager( new MavenEmbedderSecurityManager() );
} }
@ -812,7 +857,7 @@ public class MavenEmbedder
{ {
MavenExecutionResult result = new DefaultMavenExecutionResult(); MavenExecutionResult result = new DefaultMavenExecutionResult();
result.addException( e ); result.addUnknownException( e );
return result; return result;
} }

View File

@ -0,0 +1,23 @@
package org.apache.maven.embedder;
import org.apache.maven.model.Plugin;
public class PluginLookupException
extends MavenEmbedderException
{
private final Plugin plugin;
public PluginLookupException( Plugin plugin, String message,
Throwable cause )
{
super( message, cause );
this.plugin = plugin;
}
public Plugin getPlugin()
{
return plugin;
}
}

View File

@ -0,0 +1,136 @@
package org.apache.maven.cli;
import org.apache.maven.BuildFailureException;
import org.apache.maven.ProjectBuildFailureException;
import org.apache.maven.execution.DefaultMavenExecutionRequest;
import org.apache.maven.execution.DefaultMavenExecutionResult;
import org.apache.maven.execution.MavenExecutionRequest;
import org.apache.maven.execution.MavenExecutionResult;
import org.apache.maven.execution.ReactorManager;
import org.apache.maven.lifecycle.model.MojoBinding;
import org.apache.maven.model.Dependency;
import org.apache.maven.model.Model;
import org.apache.maven.plugin.MojoFailureException;
import org.apache.maven.project.DuplicateProjectException;
import org.apache.maven.project.InvalidProjectModelException;
import org.apache.maven.project.MavenProject;
import org.apache.maven.project.validation.ModelValidationResult;
import org.codehaus.plexus.util.dag.CycleDetectedException;
import java.util.Collections;
import java.util.Date;
import java.util.Iterator;
import java.util.List;
import junit.framework.TestCase;
public class CLIReportingUtilsTest
extends TestCase
{
private TestEmbedderLogger logger = new TestEmbedderLogger();
public void test_logResult_ShowLongMessageForMojoFailureException()
throws CycleDetectedException, DuplicateProjectException
{
String longMessage = "This is a longer message.";
MojoFailureException e = new MojoFailureException( "test-id", "Short Message", longMessage );
MojoBinding binding = new MojoBinding();
binding.setGroupId( "plugin.group" );
binding.setArtifactId( "plugin-artifact" );
binding.setVersion( "10" );
BuildFailureException buildError = new ProjectBuildFailureException( "test:project:1", binding, e );
MavenExecutionRequest request = new DefaultMavenExecutionRequest();
MavenExecutionResult result = new DefaultMavenExecutionResult();
request.setStartTime( new Date() );
MavenProject project = createProject( "test", "project", "1" );
ReactorManager reactorManager = new ReactorManager( Collections.singletonList( project ),
ReactorManager.FAIL_FAST );
reactorManager.registerBuildFailure( project, e, "task", 0 );
result.setReactorManager( reactorManager );
result.addBuildFailureException( buildError );
CLIReportingUtils.logResult( request, result, logger );
assertPresent( longMessage, logger.getErrorMessages() );
}
public void test_logResult_ShowReasonableMessageForInvalidProject()
throws CycleDetectedException, DuplicateProjectException
{
String validationMessage = "dependencies.dependency.version is required";
ModelValidationResult results = new ModelValidationResult();
results.addMessage( validationMessage );
String projectId = "test:project";
String projectPath = "/path/to/somewhere";
String message = "message";
InvalidProjectModelException e = new InvalidProjectModelException( projectId, projectPath, message, results );
MavenExecutionRequest request = new DefaultMavenExecutionRequest();
MavenExecutionResult result = new DefaultMavenExecutionResult();
request.setStartTime( new Date() );
MavenProject project = createProject( "test", "project", "1" );
Dependency dep = new Dependency();
dep.setGroupId( "test" );
dep.setArtifactId( "dep" );
project.getModel().addDependency( dep );
ReactorManager reactorManager = new ReactorManager( Collections.singletonList( project ),
ReactorManager.FAIL_FAST );
reactorManager.registerBuildFailure( project, e, "task", 0 );
result.setReactorManager( reactorManager );
result.addProjectBuildingException( e );
CLIReportingUtils.logResult( request, result, logger );
assertPresent( projectId, logger.getErrorMessages() );
assertPresent( projectPath, logger.getErrorMessages() );
assertPresent( message, logger.getErrorMessages() );
assertPresent( validationMessage, logger.getErrorMessages() );
}
private MavenProject createProject( String groupId,
String artifactId,
String version )
{
Model model = new Model();
model.setGroupId( groupId );
model.setArtifactId( artifactId );
model.setVersion( version );
return new MavenProject( model );
}
private void assertPresent( String message,
List messages )
{
for ( Iterator it = messages.iterator(); it.hasNext(); )
{
String entry = (String) it.next();
if ( entry.indexOf( message ) > -1 )
{
return;
}
}
fail( "Message not found in output: \'" + message + "\'" );
assertTrue( "Message: \'" + message + "\' is missing in output.",
messages.contains( message ) );
}
}

View File

@ -0,0 +1,47 @@
package org.apache.maven.cli;
import org.apache.commons.cli.CommandLine;
import org.apache.commons.cli.ParseException;
import org.apache.maven.execution.MavenExecutionRequest;
import java.util.List;
import java.util.Properties;
import junit.framework.TestCase;
public class CLIRequestUtilsTest
extends TestCase
{
public void test_buildRequest_ParseCommandLineProperty()
throws ParseException
{
String key = "key";
String value = "value";
CLIManager cliManager = new CLIManager();
String[] args = {
"-D" + key + "=" + value
};
CommandLine commandLine = cliManager.parse( args );
assertTrue( commandLine.hasOption( CLIManager.SET_SYSTEM_PROPERTY ) );
System.out.println( commandLine.getOptionValue( CLIManager.SET_SYSTEM_PROPERTY ) );
System.out.println( commandLine.getArgList() );
assertEquals( 1, commandLine.getOptionValues( CLIManager.SET_SYSTEM_PROPERTY ).length );
MavenExecutionRequest request = CLIRequestUtils.buildRequest( commandLine, false, false, false );
Properties execProperties = request.getProperties();
assertEquals( value, execProperties.getProperty( key ) );
List goals = request.getGoals();
assertTrue( ( goals == null ) || goals.isEmpty() );
}
}

View File

@ -0,0 +1,134 @@
package org.apache.maven.cli;
import org.apache.maven.embedder.AbstractMavenEmbedderLogger;
import java.util.ArrayList;
import java.util.List;
public class TestEmbedderLogger
extends AbstractMavenEmbedderLogger
{
private List debugMessages = new ArrayList();
private List errorMessages = new ArrayList();
private List fatalErrorMessages = new ArrayList();
private List infoMessages = new ArrayList();
private List warnMessages = new ArrayList();
private List debugErrors = new ArrayList();
private List errors = new ArrayList();
private List fatalErrors = new ArrayList();
private List infoErrors = new ArrayList();
private List warnErrors = new ArrayList();
public void close()
{
}
public void debug( String message,
Throwable throwable )
{
log( "[debug] ", message, throwable, debugMessages, debugErrors );
}
private void log( String header,
String message, Throwable throwable,
List messages,
List errors )
{
if ( message != null )
{
messages.add( message );
System.out.println( header + message );
}
if ( throwable != null )
{
errors.add( throwable );
throwable.printStackTrace( System.out );
}
}
public void error( String message,
Throwable throwable )
{
log( "[error] ", message, throwable, errorMessages, errors );
}
public void fatalError( String message,
Throwable throwable )
{
log( "[fatal] ", message, throwable, fatalErrorMessages, fatalErrors );
}
public void info( String message,
Throwable throwable )
{
log( "[info] ", message, throwable, infoMessages, infoErrors );
}
public void warn( String message,
Throwable throwable )
{
log( "[warn] ", message, throwable, warnMessages, warnErrors );
}
public List getDebugMessages()
{
return debugMessages;
}
public List getErrorMessages()
{
return errorMessages;
}
public List getFatalErrorMessages()
{
return fatalErrorMessages;
}
public List getInfoMessages()
{
return infoMessages;
}
public List getWarnMessages()
{
return warnMessages;
}
public List getDebugErrors()
{
return debugErrors;
}
public List getErrorErrors()
{
return errors;
}
public List getFatalErrors()
{
return fatalErrors;
}
public List getInfoErrors()
{
return infoErrors;
}
public List getWarnErrors()
{
return warnErrors;
}
}

View File

@ -19,21 +19,13 @@ package org.apache.maven;
* under the License. * under the License.
*/ */
import org.apache.maven.artifact.InvalidRepositoryException; import org.apache.maven.artifact.UnknownRepositoryLayoutException;
import org.apache.maven.artifact.repository.ArtifactRepository; import org.apache.maven.artifact.repository.ArtifactRepository;
import org.apache.maven.artifact.repository.ArtifactRepositoryFactory; import org.apache.maven.artifact.repository.ArtifactRepositoryFactory;
import org.apache.maven.artifact.repository.ArtifactRepositoryPolicy; import org.apache.maven.artifact.repository.ArtifactRepositoryPolicy;
import org.apache.maven.artifact.repository.layout.ArtifactRepositoryLayout;
import org.apache.maven.model.DeploymentRepository; import org.apache.maven.model.DeploymentRepository;
import org.apache.maven.model.Repository; import org.apache.maven.model.Repository;
import org.apache.maven.model.RepositoryBase;
import org.apache.maven.model.RepositoryPolicy; import org.apache.maven.model.RepositoryPolicy;
import org.codehaus.plexus.PlexusConstants;
import org.codehaus.plexus.PlexusContainer;
import org.codehaus.plexus.component.repository.exception.ComponentLookupException;
import org.codehaus.plexus.context.Context;
import org.codehaus.plexus.context.ContextException;
import org.codehaus.plexus.personality.plexus.lifecycle.phase.Contextualizable;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.Iterator; import java.util.Iterator;
@ -41,21 +33,17 @@ import java.util.List;
/** @author Jason van Zyl */ /** @author Jason van Zyl */
public class DefaultMavenTools public class DefaultMavenTools
implements MavenTools, Contextualizable implements MavenTools
{ {
private ArtifactRepositoryLayout repositoryLayout;
private ArtifactRepositoryFactory artifactRepositoryFactory; private ArtifactRepositoryFactory artifactRepositoryFactory;
private PlexusContainer container;
// ---------------------------------------------------------------------------- // ----------------------------------------------------------------------------
// Code snagged from ProjectUtils: this will have to be moved somewhere else // Code snagged from ProjectUtils: this will have to be moved somewhere else
// but just trying to collect it all in one place right now. // but just trying to collect it all in one place right now.
// ---------------------------------------------------------------------------- // ----------------------------------------------------------------------------
public List buildArtifactRepositories( List repositories ) public List buildArtifactRepositories( List repositories )
throws InvalidRepositoryException throws UnknownRepositoryLayoutException
{ {
List repos = new ArrayList(); List repos = new ArrayList();
@ -74,17 +62,14 @@ public class DefaultMavenTools
} }
public ArtifactRepository buildDeploymentArtifactRepository( DeploymentRepository repo ) public ArtifactRepository buildDeploymentArtifactRepository( DeploymentRepository repo )
throws InvalidRepositoryException throws UnknownRepositoryLayoutException
{ {
if ( repo != null ) if ( repo != null )
{ {
String id = repo.getId(); String id = repo.getId();
String url = repo.getUrl(); String url = repo.getUrl();
// TODO: make this a map inside the factory instead, so no lookup needed return artifactRepositoryFactory.createDeploymentArtifactRepository( id, url, repo.getLayout(),
ArtifactRepositoryLayout layout = getRepositoryLayout( repo );
return artifactRepositoryFactory.createDeploymentArtifactRepository( id, url, layout,
repo.isUniqueVersion() ); repo.isUniqueVersion() );
} }
else else
@ -94,21 +79,18 @@ public class DefaultMavenTools
} }
public ArtifactRepository buildArtifactRepository( Repository repo ) public ArtifactRepository buildArtifactRepository( Repository repo )
throws InvalidRepositoryException throws UnknownRepositoryLayoutException
{ {
if ( repo != null ) if ( repo != null )
{ {
String id = repo.getId(); String id = repo.getId();
String url = repo.getUrl(); String url = repo.getUrl();
// TODO: make this a map inside the factory instead, so no lookup needed
ArtifactRepositoryLayout layout = getRepositoryLayout( repo );
ArtifactRepositoryPolicy snapshots = buildArtifactRepositoryPolicy( repo.getSnapshots() ); ArtifactRepositoryPolicy snapshots = buildArtifactRepositoryPolicy( repo.getSnapshots() );
ArtifactRepositoryPolicy releases = buildArtifactRepositoryPolicy( repo.getReleases() ); ArtifactRepositoryPolicy releases = buildArtifactRepositoryPolicy( repo.getReleases() );
return artifactRepositoryFactory.createArtifactRepository( id, url, layout, snapshots, releases ); return artifactRepositoryFactory.createArtifactRepository( id, url, repo.getLayout(), snapshots, releases );
} }
else else
{ {
@ -140,32 +122,4 @@ public class DefaultMavenTools
return new ArtifactRepositoryPolicy( enabled, updatePolicy, checksumPolicy ); return new ArtifactRepositoryPolicy( enabled, updatePolicy, checksumPolicy );
} }
private ArtifactRepositoryLayout getRepositoryLayout( RepositoryBase mavenRepo )
throws InvalidRepositoryException
{
String layout = mavenRepo.getLayout();
ArtifactRepositoryLayout repositoryLayout;
try
{
repositoryLayout = (ArtifactRepositoryLayout) container.lookup( ArtifactRepositoryLayout.ROLE, layout );
}
catch ( ComponentLookupException e )
{
throw new InvalidRepositoryException( "Cannot find layout implementation corresponding to: \'" + layout +
"\' for remote repository with id: \'" + mavenRepo.getId() + "\'.", e );
}
return repositoryLayout;
}
// ----------------------------------------------------------------------------
// Lifecycle
// ----------------------------------------------------------------------------
public void contextualize( Context context )
throws ContextException
{
container = (PlexusContainer) context.get( PlexusConstants.PLEXUS_KEY );
}
} }

View File

@ -19,7 +19,7 @@ package org.apache.maven;
* under the License. * under the License.
*/ */
import org.apache.maven.artifact.InvalidRepositoryException; import org.apache.maven.artifact.UnknownRepositoryLayoutException;
import org.apache.maven.artifact.repository.ArtifactRepository; import org.apache.maven.artifact.repository.ArtifactRepository;
import org.apache.maven.model.DeploymentRepository; import org.apache.maven.model.DeploymentRepository;
import org.apache.maven.model.Repository; import org.apache.maven.model.Repository;
@ -38,11 +38,11 @@ public interface MavenTools
// ---------------------------------------------------------------------------- // ----------------------------------------------------------------------------
List buildArtifactRepositories( List repositories ) List buildArtifactRepositories( List repositories )
throws InvalidRepositoryException; throws UnknownRepositoryLayoutException;
ArtifactRepository buildDeploymentArtifactRepository( DeploymentRepository repo ) ArtifactRepository buildDeploymentArtifactRepository( DeploymentRepository repo )
throws InvalidRepositoryException; throws UnknownRepositoryLayoutException;
ArtifactRepository buildArtifactRepository( Repository repo ) ArtifactRepository buildArtifactRepository( Repository repo )
throws InvalidRepositoryException; throws UnknownRepositoryLayoutException;
} }

View File

@ -62,12 +62,12 @@ public class DefaultProfileAdvisor
private PlexusContainer container; private PlexusContainer container;
public List applyActivatedProfiles( Model model, File projectDir, List explicitlyActiveIds, List explicitlyInactiveIds ) public List applyActivatedProfiles( Model model, File pomFile, List explicitlyActiveIds, List explicitlyInactiveIds )
throws ProjectBuildingException throws ProjectBuildingException
{ {
ProfileManager profileManager = buildProfileManager( model, projectDir, explicitlyActiveIds, explicitlyInactiveIds ); ProfileManager profileManager = buildProfileManager( model, pomFile, explicitlyActiveIds, explicitlyInactiveIds );
return applyActivatedProfiles( model, projectDir, profileManager ); return applyActivatedProfiles( model, pomFile, profileManager );
} }
public List applyActivatedExternalProfiles( Model model, File projectDir, ProfileManager externalProfileManager ) public List applyActivatedExternalProfiles( Model model, File projectDir, ProfileManager externalProfileManager )
@ -76,7 +76,7 @@ public class DefaultProfileAdvisor
return applyActivatedProfiles( model, projectDir, externalProfileManager ); return applyActivatedProfiles( model, projectDir, externalProfileManager );
} }
private List applyActivatedProfiles( Model model, File projectDir, ProfileManager profileManager ) private List applyActivatedProfiles( Model model, File pomFile, ProfileManager profileManager )
throws ProjectBuildingException throws ProjectBuildingException
{ {
List activeProfiles; List activeProfiles;
@ -103,7 +103,7 @@ public class DefaultProfileAdvisor
String projectId = ArtifactUtils.versionlessKey( groupId, artifactId ); String projectId = ArtifactUtils.versionlessKey( groupId, artifactId );
throw new ProjectBuildingException( projectId, e.getMessage(), e ); throw new ProjectBuildingException( projectId, e.getMessage(), pomFile.getAbsolutePath(), e );
} }
for ( Iterator it = activeProfiles.iterator(); it.hasNext(); ) for ( Iterator it = activeProfiles.iterator(); it.hasNext(); )
@ -121,7 +121,7 @@ public class DefaultProfileAdvisor
return activeProfiles; return activeProfiles;
} }
private ProfileManager buildProfileManager( Model model, File projectDir, List explicitlyActiveIds, List explicitlyInactiveIds ) private ProfileManager buildProfileManager( Model model, File pomFile, List explicitlyActiveIds, List explicitlyInactiveIds )
throws ProjectBuildingException throws ProjectBuildingException
{ {
ProfileManager profileManager = new DefaultProfileManager( container ); ProfileManager profileManager = new DefaultProfileManager( container );
@ -132,15 +132,20 @@ public class DefaultProfileAdvisor
profileManager.addProfiles( model.getProfiles() ); profileManager.addProfiles( model.getProfiles() );
if ( projectDir != null ) if ( pomFile != null )
{ {
loadExternalProjectProfiles( profileManager, model, projectDir ); File projectDir = pomFile.getParentFile();
if ( projectDir != null )
{
loadExternalProjectProfiles( profileManager, model, projectDir );
}
} }
return profileManager; return profileManager;
} }
public LinkedHashSet getArtifactRepositoriesFromActiveProfiles( ProfileManager profileManager, public LinkedHashSet getArtifactRepositoriesFromActiveProfiles( ProfileManager profileManager,
File pomFile,
String modelId ) String modelId )
throws ProjectBuildingException throws ProjectBuildingException
{ {
@ -159,7 +164,7 @@ public class DefaultProfileAdvisor
catch ( ProfileActivationException e ) catch ( ProfileActivationException e )
{ {
throw new ProjectBuildingException( modelId, throw new ProjectBuildingException( modelId,
"Failed to compute active profiles for repository aggregation.", e ); "Failed to compute active profiles for repository aggregation.", pomFile.getAbsolutePath(), e );
} }
LinkedHashSet remoteRepositories = new LinkedHashSet(); LinkedHashSet remoteRepositories = new LinkedHashSet();
@ -190,20 +195,21 @@ public class DefaultProfileAdvisor
} }
} }
public LinkedHashSet getArtifactRepositoriesFromActiveProfiles( Model model, File projectDir, public LinkedHashSet getArtifactRepositoriesFromActiveProfiles( Model model, File pomFile,
List explicitlyActiveIds, List explicitlyInactiveIds ) List explicitlyActiveIds, List explicitlyInactiveIds )
throws ProjectBuildingException throws ProjectBuildingException
{ {
ProfileManager profileManager = buildProfileManager( model, projectDir, explicitlyActiveIds, explicitlyInactiveIds ); ProfileManager profileManager = buildProfileManager( model, pomFile, explicitlyActiveIds, explicitlyInactiveIds );
return getArtifactRepositoriesFromActiveProfiles( profileManager, model.getId() ); return getArtifactRepositoriesFromActiveProfiles( profileManager, pomFile, model.getId() );
} }
private void loadExternalProjectProfiles( ProfileManager profileManager, Model model, File projectDir ) private void loadExternalProjectProfiles( ProfileManager profileManager, Model model, File pomFile )
throws ProjectBuildingException throws ProjectBuildingException
{ {
if ( projectDir != null ) if ( pomFile != null )
{ {
File projectDir = pomFile.getParentFile();
try try
{ {
ProfilesRoot root = profilesBuilder.buildProfiles( projectDir ); ProfilesRoot root = profilesBuilder.buildProfiles( projectDir );
@ -230,13 +236,13 @@ public class DefaultProfileAdvisor
catch ( IOException e ) catch ( IOException e )
{ {
throw new ProjectBuildingException( model.getId(), "Cannot read profiles.xml resource from directory: " throw new ProjectBuildingException( model.getId(), "Cannot read profiles.xml resource from directory: "
+ projectDir, e ); + projectDir, pomFile.getAbsolutePath(), e );
} }
catch ( XmlPullParserException e ) catch ( XmlPullParserException e )
{ {
throw new ProjectBuildingException( model.getId(), throw new ProjectBuildingException( model.getId(),
"Cannot parse profiles.xml resource from directory: " + projectDir, "Cannot parse profiles.xml resource from directory: " + projectDir,
e ); pomFile.getAbsolutePath(), e );
} }
} }
} }

View File

@ -37,16 +37,16 @@ public interface ProfileAdvisor
String ROLE = ProfileAdvisor.class.getName(); String ROLE = ProfileAdvisor.class.getName();
LinkedHashSet getArtifactRepositoriesFromActiveProfiles( ProfileManager profileManager, String modelId ) LinkedHashSet getArtifactRepositoriesFromActiveProfiles( ProfileManager profileManager, File pomFile, String modelId )
throws ProjectBuildingException; throws ProjectBuildingException;
LinkedHashSet getArtifactRepositoriesFromActiveProfiles( Model model, File projectDir, List explicitlyActiveIds, List explicitlyInactiveIds ) LinkedHashSet getArtifactRepositoriesFromActiveProfiles( Model model, File pomFile, List explicitlyActiveIds, List explicitlyInactiveIds )
throws ProjectBuildingException; throws ProjectBuildingException;
List applyActivatedProfiles( Model model, File projectDir, List explicitlyActiveIds, List explicitlyInactiveIds ) List applyActivatedProfiles( Model model, File pomFile, List explicitlyActiveIds, List explicitlyInactiveIds )
throws ProjectBuildingException; throws ProjectBuildingException;
List applyActivatedExternalProfiles( Model model, File projectDir, ProfileManager externalProfileManager ) List applyActivatedExternalProfiles( Model model, File pomFile, ProfileManager externalProfileManager )
throws ProjectBuildingException; throws ProjectBuildingException;
} }

View File

@ -66,13 +66,7 @@ import org.apache.maven.project.interpolation.ModelInterpolator;
import org.apache.maven.project.path.PathTranslator; import org.apache.maven.project.path.PathTranslator;
import org.apache.maven.project.validation.ModelValidationResult; import org.apache.maven.project.validation.ModelValidationResult;
import org.apache.maven.project.validation.ModelValidator; import org.apache.maven.project.validation.ModelValidator;
import org.codehaus.plexus.PlexusConstants;
import org.codehaus.plexus.PlexusContainer;
import org.codehaus.plexus.component.repository.exception.ComponentLookupException;
import org.codehaus.plexus.context.Context;
import org.codehaus.plexus.context.ContextException;
import org.codehaus.plexus.logging.AbstractLogEnabled; import org.codehaus.plexus.logging.AbstractLogEnabled;
import org.codehaus.plexus.personality.plexus.lifecycle.phase.Contextualizable;
import org.codehaus.plexus.personality.plexus.lifecycle.phase.Initializable; import org.codehaus.plexus.personality.plexus.lifecycle.phase.Initializable;
import org.codehaus.plexus.util.IOUtil; import org.codehaus.plexus.util.IOUtil;
import org.codehaus.plexus.util.StringUtils; import org.codehaus.plexus.util.StringUtils;
@ -140,11 +134,8 @@ Notes
public class DefaultMavenProjectBuilder public class DefaultMavenProjectBuilder
extends AbstractLogEnabled extends AbstractLogEnabled
implements MavenProjectBuilder, implements MavenProjectBuilder,
Initializable, Initializable
Contextualizable
{ {
protected PlexusContainer container;
protected MavenProfilesBuilder profilesBuilder; protected MavenProfilesBuilder profilesBuilder;
protected ArtifactResolver artifactResolver; protected ArtifactResolver artifactResolver;
@ -229,9 +220,9 @@ public class DefaultMavenProjectBuilder
public MavenProject buildStandaloneSuperProject() public MavenProject buildStandaloneSuperProject()
throws ProjectBuildingException throws ProjectBuildingException
{ {
if ( this.superProject != null ) if ( superProject != null )
{ {
return this.superProject; return superProject;
} }
Model superModel = getSuperModel(); Model superModel = getSuperModel();
@ -252,7 +243,12 @@ public class DefaultMavenProjectBuilder
} }
catch ( InvalidRepositoryException e ) catch ( InvalidRepositoryException e )
{ {
// This will never happen with the repositories in the SuperPOM // we shouldn't be swallowing exceptions, no matter how unlikely.
// or, if we do, we should pay attention to the one coming from getSuperModel()...
throw new ProjectBuildingException( STANDALONE_SUPERPOM_GROUPID + ":"
+ STANDALONE_SUPERPOM_ARTIFACTID,
"Maven super-POM contains an invalid repository!",
e );
} }
superProject.setOriginalModel( superModel ); superProject.setOriginalModel( superModel );
@ -288,8 +284,6 @@ public class DefaultMavenProjectBuilder
Map managedVersions = project.getManagedVersionMap(); Map managedVersions = project.getManagedVersionMap();
ensureMetadataSourceIsInitialized();
try try
{ {
project.setDependencyArtifacts( project.createArtifacts( artifactFactory, null, null ) ); project.setDependencyArtifacts( project.createArtifacts( artifactFactory, null, null ) );
@ -298,7 +292,7 @@ public class DefaultMavenProjectBuilder
{ {
throw new ProjectBuildingException( projectId, throw new ProjectBuildingException( projectId,
"Unable to build project due to an invalid dependency version: " + "Unable to build project due to an invalid dependency version: " +
e.getMessage(), e ); e.getMessage(), projectDescriptor.getAbsolutePath(), e );
} }
ArtifactResolutionRequest request = new ArtifactResolutionRequest() ArtifactResolutionRequest request = new ArtifactResolutionRequest()
@ -320,25 +314,8 @@ public class DefaultMavenProjectBuilder
// //
// ---------------------------------------------------------------------- // ----------------------------------------------------------------------
private void ensureMetadataSourceIsInitialized()
throws ProjectBuildingException
{
if ( artifactMetadataSource == null )
{
try
{
artifactMetadataSource = (ArtifactMetadataSource) container.lookup( ArtifactMetadataSource.ROLE );
}
catch ( ComponentLookupException e )
{
throw new ProjectBuildingException( "all", "Cannot lookup metadata source for building the project.",
e );
}
}
}
private Map createManagedVersionMap( String projectId, private Map createManagedVersionMap( String projectId,
DependencyManagement dependencyManagement ) DependencyManagement dependencyManagement, File pomFile )
throws ProjectBuildingException throws ProjectBuildingException
{ {
Map map = null; Map map = null;
@ -397,7 +374,7 @@ public class DefaultMavenProjectBuilder
catch ( InvalidVersionSpecificationException e ) catch ( InvalidVersionSpecificationException e )
{ {
throw new ProjectBuildingException( projectId, "Unable to parse version '" + d.getVersion() + throw new ProjectBuildingException( projectId, "Unable to parse version '" + d.getVersion() +
"' for dependency '" + d.getManagementKey() + "': " + e.getMessage(), e ); "' for dependency '" + d.getManagementKey() + "': " + e.getMessage(), pomFile.getAbsolutePath(), e );
} }
} }
} }
@ -560,13 +537,6 @@ public class DefaultMavenProjectBuilder
boolean strict ) boolean strict )
throws ProjectBuildingException throws ProjectBuildingException
{ {
File projectDir = null;
if ( projectDescriptor != null )
{
projectDir = projectDescriptor.getAbsoluteFile().getParentFile();
}
Model superModel = getSuperModel(); Model superModel = getSuperModel();
MavenProject superProject = new MavenProject( superModel ); MavenProject superProject = new MavenProject( superModel );
@ -586,7 +556,7 @@ public class DefaultMavenProjectBuilder
} }
catch ( ProfileActivationException e ) catch ( ProfileActivationException e )
{ {
throw new ProjectBuildingException( projectId, "Failed to activate external profiles.", e ); throw new ProjectBuildingException( projectId, "Failed to activate external profiles.", projectDescriptor.getAbsolutePath(), e );
} }
explicitlyActive = externalProfileManager.getExplicitlyActivatedIds(); explicitlyActive = externalProfileManager.getExplicitlyActivatedIds();
@ -600,14 +570,14 @@ public class DefaultMavenProjectBuilder
explicitlyInactive = Collections.EMPTY_LIST; explicitlyInactive = Collections.EMPTY_LIST;
} }
superProject.setActiveProfiles( profileAdvisor.applyActivatedProfiles( superModel, null, explicitlyActive, explicitlyInactive ) ); superProject.setActiveProfiles( profileAdvisor.applyActivatedProfiles( superModel, projectDescriptor, explicitlyActive, explicitlyInactive ) );
//noinspection CollectionDeclaredAsConcreteClass //noinspection CollectionDeclaredAsConcreteClass
LinkedList lineage = new LinkedList(); LinkedList lineage = new LinkedList();
LinkedHashSet aggregatedRemoteWagonRepositories = collectInitialRepositories( model, superModel, LinkedHashSet aggregatedRemoteWagonRepositories = collectInitialRepositories( model, superModel,
parentSearchRepositories, parentSearchRepositories,
projectDir, explicitlyActive, projectDescriptor, explicitlyActive,
explicitlyInactive ); explicitlyInactive );
Model originalModel = ModelUtils.cloneModel( model ); Model originalModel = ModelUtils.cloneModel( model );
@ -616,7 +586,7 @@ public class DefaultMavenProjectBuilder
try try
{ {
project = assembleLineage( model, lineage, localRepository, projectDir, aggregatedRemoteWagonRepositories, externalProfileManager, strict ); project = assembleLineage( model, lineage, localRepository, projectDescriptor, aggregatedRemoteWagonRepositories, externalProfileManager, strict );
} }
catch ( InvalidRepositoryException e ) catch ( InvalidRepositoryException e )
{ {
@ -672,7 +642,7 @@ public class DefaultMavenProjectBuilder
try try
{ {
project = processProjectLogic( pomLocation, project, projectDir, strict ); project = processProjectLogic( pomLocation, project, projectDescriptor, strict );
} }
catch ( ModelInterpolationException e ) catch ( ModelInterpolationException e )
{ {
@ -718,7 +688,7 @@ public class DefaultMavenProjectBuilder
} }
} }
project.setManagedVersionMap( createManagedVersionMap( projectId, project.getDependencyManagement() ) ); project.setManagedVersionMap( createManagedVersionMap( projectId, project.getDependencyManagement(), projectDescriptor ) );
return project; return project;
} }
@ -735,16 +705,16 @@ public class DefaultMavenProjectBuilder
private LinkedHashSet collectInitialRepositories( Model model, private LinkedHashSet collectInitialRepositories( Model model,
Model superModel, Model superModel,
List parentSearchRepositories, List parentSearchRepositories,
File projectDir, File pomFile,
List explicitlyActive, List explicitlyActive,
List explicitlyInactive ) List explicitlyInactive )
throws ProjectBuildingException throws ProjectBuildingException
{ {
LinkedHashSet collected = new LinkedHashSet(); LinkedHashSet collected = new LinkedHashSet();
collectInitialRepositoriesFromModel( collected, model, projectDir, explicitlyActive, explicitlyInactive ); collectInitialRepositoriesFromModel( collected, model, pomFile, explicitlyActive, explicitlyInactive );
collectInitialRepositoriesFromModel( collected, superModel, projectDir, explicitlyActive, explicitlyInactive ); collectInitialRepositoriesFromModel( collected, superModel, null, explicitlyActive, explicitlyInactive );
if ( ( parentSearchRepositories != null ) && !parentSearchRepositories.isEmpty() ) if ( ( parentSearchRepositories != null ) && !parentSearchRepositories.isEmpty() )
{ {
@ -756,12 +726,12 @@ public class DefaultMavenProjectBuilder
private void collectInitialRepositoriesFromModel( LinkedHashSet collected, private void collectInitialRepositoriesFromModel( LinkedHashSet collected,
Model model, Model model,
File projectDir, File pomFile,
List explicitlyActive, List explicitlyActive,
List explicitlyInactive ) List explicitlyInactive )
throws ProjectBuildingException throws ProjectBuildingException
{ {
Set reposFromProfiles = profileAdvisor.getArtifactRepositoriesFromActiveProfiles( model, projectDir, explicitlyActive, explicitlyInactive ); Set reposFromProfiles = profileAdvisor.getArtifactRepositoriesFromActiveProfiles( model, pomFile, explicitlyActive, explicitlyInactive );
if ( ( reposFromProfiles != null ) && !reposFromProfiles.isEmpty() ) if ( ( reposFromProfiles != null ) && !reposFromProfiles.isEmpty() )
{ {
@ -829,7 +799,7 @@ public class DefaultMavenProjectBuilder
*/ */
private MavenProject processProjectLogic( String pomLocation, private MavenProject processProjectLogic( String pomLocation,
MavenProject project, MavenProject project,
File projectDir, File pomFile,
boolean strict ) boolean strict )
throws ProjectBuildingException, ModelInterpolationException, InvalidRepositoryException throws ProjectBuildingException, ModelInterpolationException, InvalidRepositoryException
{ {
@ -843,9 +813,9 @@ public class DefaultMavenProjectBuilder
// mkleint - using System.getProperties() is almost definitely bad for embedding. // mkleint - using System.getProperties() is almost definitely bad for embedding.
Map context = new HashMap( System.getProperties() ); Map context = new HashMap( System.getProperties() );
if ( projectDir != null ) if ( pomFile != null )
{ {
context.put( "basedir", projectDir.getAbsolutePath() ); context.put( "basedir", pomFile.getParentFile().getAbsolutePath() );
} }
// TODO: this is a hack to ensure MNG-2124 can be satisfied without triggering MNG-1927 // TODO: this is a hack to ensure MNG-2124 can be satisfied without triggering MNG-1927
@ -919,11 +889,11 @@ public class DefaultMavenProjectBuilder
mavenTools.buildArtifactRepositories( model.getRepositories() ) ); mavenTools.buildArtifactRepositories( model.getRepositories() ) );
// TODO: these aren't taking active project artifacts into consideration in the reactor // TODO: these aren't taking active project artifacts into consideration in the reactor
project.setPluginArtifacts( createPluginArtifacts( projectId, project.getBuildPlugins() ) ); project.setPluginArtifacts( createPluginArtifacts( projectId, project.getBuildPlugins(), pomLocation ) );
project.setReportArtifacts( createReportArtifacts( projectId, project.getReportPlugins() ) ); project.setReportArtifacts( createReportArtifacts( projectId, project.getReportPlugins(), pomLocation ) );
project.setExtensionArtifacts( createExtensionArtifacts( projectId, project.getBuildExtensions() ) ); project.setExtensionArtifacts( createExtensionArtifacts( projectId, project.getBuildExtensions(), pomLocation ) );
return project; return project;
} }
@ -936,7 +906,7 @@ public class DefaultMavenProjectBuilder
private MavenProject assembleLineage( Model model, private MavenProject assembleLineage( Model model,
LinkedList lineage, LinkedList lineage,
ArtifactRepository localRepository, ArtifactRepository localRepository,
File projectDir, File pomFile,
Set aggregatedRemoteWagonRepositories, Set aggregatedRemoteWagonRepositories,
ProfileManager externalProfileManager, ProfileManager externalProfileManager,
boolean strict ) boolean strict )
@ -944,7 +914,7 @@ public class DefaultMavenProjectBuilder
{ {
ModelLineage modelLineage = new DefaultModelLineage(); ModelLineage modelLineage = new DefaultModelLineage();
modelLineage.setOrigin( model, new File( projectDir, "pom.xml" ), new ArrayList( aggregatedRemoteWagonRepositories ) ); modelLineage.setOrigin( model, pomFile, new ArrayList( aggregatedRemoteWagonRepositories ) );
modelLineageBuilder.resumeBuildingModelLineage( modelLineage, localRepository, externalProfileManager, !strict ); modelLineageBuilder.resumeBuildingModelLineage( modelLineage, localRepository, externalProfileManager, !strict );
@ -983,7 +953,7 @@ public class DefaultMavenProjectBuilder
projectContext.setCurrentProject( project ); projectContext.setCurrentProject( project );
projectContext.store( buildContextManager ); projectContext.store( buildContextManager );
project.setActiveProfiles( profileAdvisor.applyActivatedProfiles( currentModel, projectDir, explicitlyActive, project.setActiveProfiles( profileAdvisor.applyActivatedProfiles( currentModel, currentPom, explicitlyActive,
explicitlyInactive ) ); explicitlyInactive ) );
if ( lastProject != null ) if ( lastProject != null )
@ -1011,7 +981,7 @@ public class DefaultMavenProjectBuilder
active.addAll( existingActiveProfiles ); active.addAll( existingActiveProfiles );
} }
profileAdvisor.applyActivatedExternalProfiles( result.getModel(), projectDir, externalProfileManager ); profileAdvisor.applyActivatedExternalProfiles( result.getModel(), pomFile, externalProfileManager );
} }
return result; return result;
@ -1031,12 +1001,12 @@ public class DefaultMavenProjectBuilder
catch ( FileNotFoundException e ) catch ( FileNotFoundException e )
{ {
throw new ProjectBuildingException( projectId, throw new ProjectBuildingException( projectId,
"Could not find the model file '" + file.getAbsolutePath() + "'.", e ); "Could not find the model file '" + file.getAbsolutePath() + "'.", file.getAbsolutePath(), e );
} }
catch ( IOException e ) catch ( IOException e )
{ {
throw new ProjectBuildingException( projectId, "Failed to build model from file '" + throw new ProjectBuildingException( projectId, "Failed to build model from file '" +
file.getAbsolutePath() + "'.\nError: \'" + e.getLocalizedMessage() + "\'", e ); file.getAbsolutePath() + "'.\nError: \'" + e.getLocalizedMessage() + "\'", file.getAbsolutePath(), e );
} }
finally finally
{ {
@ -1088,7 +1058,7 @@ public class DefaultMavenProjectBuilder
catch ( IOException e ) catch ( IOException e )
{ {
throw new ProjectBuildingException( projectId, "Failed build model from URL \'" + url.toExternalForm() + throw new ProjectBuildingException( projectId, "Failed build model from URL \'" + url.toExternalForm() +
"\'\nError: \'" + e.getLocalizedMessage() + "\'", e ); "\'\nError: \'" + e.getLocalizedMessage() + "\'", url.toExternalForm(), e );
} }
finally finally
{ {
@ -1096,15 +1066,8 @@ public class DefaultMavenProjectBuilder
} }
} }
private static String createCacheKey( String groupId,
String artifactId,
String version )
{
return groupId + ":" + artifactId + ":" + version;
}
protected Set createPluginArtifacts( String projectId, protected Set createPluginArtifacts( String projectId,
List plugins ) List plugins, String pomLocation )
throws ProjectBuildingException throws ProjectBuildingException
{ {
Set pluginArtifacts = new HashSet(); Set pluginArtifacts = new HashSet();
@ -1133,7 +1096,7 @@ public class DefaultMavenProjectBuilder
{ {
throw new ProjectBuildingException( projectId, "Unable to parse version '" + version + throw new ProjectBuildingException( projectId, "Unable to parse version '" + version +
"' for plugin '" + ArtifactUtils.versionlessKey( p.getGroupId(), p.getArtifactId() ) + "': " + "' for plugin '" + ArtifactUtils.versionlessKey( p.getGroupId(), p.getArtifactId() ) + "': " +
e.getMessage(), e ); e.getMessage(), pomLocation, e );
} }
if ( artifact != null ) if ( artifact != null )
@ -1147,7 +1110,7 @@ public class DefaultMavenProjectBuilder
// TODO: share with createPluginArtifacts? // TODO: share with createPluginArtifacts?
protected Set createReportArtifacts( String projectId, protected Set createReportArtifacts( String projectId,
List reports ) List reports, String pomLocation )
throws ProjectBuildingException throws ProjectBuildingException
{ {
Set pluginArtifacts = new HashSet(); Set pluginArtifacts = new HashSet();
@ -1178,7 +1141,7 @@ public class DefaultMavenProjectBuilder
{ {
throw new ProjectBuildingException( projectId, "Unable to parse version '" + version + throw new ProjectBuildingException( projectId, "Unable to parse version '" + version +
"' for report '" + ArtifactUtils.versionlessKey( p.getGroupId(), p.getArtifactId() ) + "': " + "' for report '" + ArtifactUtils.versionlessKey( p.getGroupId(), p.getArtifactId() ) + "': " +
e.getMessage(), e ); e.getMessage(), pomLocation, e );
} }
if ( artifact != null ) if ( artifact != null )
@ -1193,7 +1156,7 @@ public class DefaultMavenProjectBuilder
// TODO: share with createPluginArtifacts? // TODO: share with createPluginArtifacts?
protected Set createExtensionArtifacts( String projectId, protected Set createExtensionArtifacts( String projectId,
List extensions ) List extensions, String pomLocation )
throws ProjectBuildingException throws ProjectBuildingException
{ {
Set extensionArtifacts = new HashSet(); Set extensionArtifacts = new HashSet();
@ -1225,7 +1188,7 @@ public class DefaultMavenProjectBuilder
{ {
throw new ProjectBuildingException( projectId, "Unable to parse version '" + version + throw new ProjectBuildingException( projectId, "Unable to parse version '" + version +
"' for extension '" + ArtifactUtils.versionlessKey( ext.getGroupId(), ext.getArtifactId() ) + "' for extension '" + ArtifactUtils.versionlessKey( ext.getGroupId(), ext.getArtifactId() ) +
"': " + e.getMessage(), e ); "': " + e.getMessage(), pomLocation, e );
} }
if ( artifact != null ) if ( artifact != null )
@ -1251,10 +1214,4 @@ public class DefaultMavenProjectBuilder
return readModel( projectId, url, STRICT_MODEL_PARSING ); return readModel( projectId, url, STRICT_MODEL_PARSING );
} }
public void contextualize( Context context )
throws ContextException
{
container = (PlexusContainer) context.get( PlexusConstants.PLEXUS_KEY );
}
} }

View File

@ -1,5 +1,6 @@
package org.apache.maven.project; package org.apache.maven.project;
import java.io.File;
/* /*
* Licensed to the Apache Software Foundation (ASF) under one * Licensed to the Apache Software Foundation (ASF) under one
@ -22,20 +23,42 @@ package org.apache.maven.project;
/** /**
* Exception that occurs when the project list contains duplicate projects instead of ignoring one. * Exception that occurs when the project list contains duplicate projects instead of ignoring one.
* *
* @author <a href="mailto:brett@apache.org">Brett Porter</a> * @author <a href="mailto:brett@apache.org">Brett Porter</a>
* @version $Id$ * @version $Id$
*/ */
public class DuplicateProjectException public class DuplicateProjectException
extends Exception extends Exception
{ {
public DuplicateProjectException( String message ) private final String projectId;
private final File existingProjectFile;
private final File conflictingProjectFile;
public DuplicateProjectException( String projectId,
File existingProjectFile,
File conflictingProjectFile,
String message )
{ {
super( message ); super( message );
this.projectId = projectId;
this.existingProjectFile = existingProjectFile;
this.conflictingProjectFile = conflictingProjectFile;
} }
public DuplicateProjectException( String message, Exception e ) public String getProjectId()
{ {
super( message, e ); return projectId;
}
public File getExistingProjectFile()
{
return existingProjectFile;
}
public File getConflictingProjectFile()
{
return conflictingProjectFile;
} }
} }

View File

@ -19,40 +19,55 @@ package org.apache.maven.project;
* under the License. * under the License.
*/ */
import org.apache.maven.artifact.InvalidRepositoryException;
import org.apache.maven.project.interpolation.ModelInterpolationException;
import org.apache.maven.project.validation.ModelValidationResult; import org.apache.maven.project.validation.ModelValidationResult;
import org.codehaus.plexus.util.xml.pull.XmlPullParserException;
public class InvalidProjectModelException public class InvalidProjectModelException
extends ProjectBuildingException extends ProjectBuildingException
{ {
private final String pomLocation;
private ModelValidationResult validationResult; private ModelValidationResult validationResult;
public InvalidProjectModelException( String projectId, String pomLocation, String message, Throwable cause ) public InvalidProjectModelException( String projectId,
String pomLocation,
String message,
ModelInterpolationException cause )
{ {
super( projectId, message, cause ); super( projectId, message, pomLocation, cause );
this.pomLocation = pomLocation;
} }
public InvalidProjectModelException( String projectId, String pomLocation, String message, public InvalidProjectModelException( String projectId,
String pomLocation,
String message,
InvalidRepositoryException cause )
{
super( projectId, message, pomLocation, cause );
}
public InvalidProjectModelException( String projectId,
String pomLocation,
String message,
ModelValidationResult validationResult ) ModelValidationResult validationResult )
{ {
super( projectId, message ); super( projectId, message, pomLocation );
this.pomLocation = pomLocation;
this.validationResult = validationResult; this.validationResult = validationResult;
} }
public InvalidProjectModelException( String projectId, String pomLocation, String message ) public InvalidProjectModelException( String projectId,
String pomLocation,
String message )
{ {
super( projectId, message ); super( projectId, message, pomLocation );
this.pomLocation = pomLocation;
} }
public final String getPomLocation() public InvalidProjectModelException( String projectId,
String pomLocation,
String message,
XmlPullParserException cause )
{ {
return pomLocation; super( projectId, message, pomLocation, cause );
} }
public final ModelValidationResult getValidationResult() public final ModelValidationResult getValidationResult()
@ -60,9 +75,4 @@ public class InvalidProjectModelException
return validationResult; return validationResult;
} }
public String getMessage()
{
return super.getMessage() + " at " + this.pomLocation;
}
} }

View File

@ -41,7 +41,6 @@ package org.apache.maven.project;
import org.apache.maven.artifact.Artifact; import org.apache.maven.artifact.Artifact;
import org.apache.maven.artifact.repository.ArtifactRepository; import org.apache.maven.artifact.repository.ArtifactRepository;
import org.apache.maven.profiles.ProfileManager; import org.apache.maven.profiles.ProfileManager;
import org.apache.maven.wagon.events.TransferListener;
import java.io.File; import java.io.File;
import java.util.List; import java.util.List;
@ -82,7 +81,7 @@ public interface MavenProjectBuilder
throws ProjectBuildingException; throws ProjectBuildingException;
/** /**
* *
* @return * @return
* @throws ProjectBuildingException * @throws ProjectBuildingException
*/ */

View File

@ -20,7 +20,6 @@ package org.apache.maven.project;
*/ */
import org.apache.maven.artifact.resolver.ArtifactResolutionResult; import org.apache.maven.artifact.resolver.ArtifactResolutionResult;
import org.apache.maven.project.validation.ModelValidationResult;
/** /**
* @author Jason van Zyl * @author Jason van Zyl

View File

@ -1,5 +1,16 @@
package org.apache.maven.project; package org.apache.maven.project;
import org.apache.maven.artifact.InvalidRepositoryException;
import org.apache.maven.artifact.resolver.ArtifactNotFoundException;
import org.apache.maven.artifact.resolver.ArtifactResolutionException;
import org.apache.maven.artifact.versioning.InvalidVersionSpecificationException;
import org.apache.maven.profiles.activation.ProfileActivationException;
import org.apache.maven.project.artifact.InvalidDependencyVersionException;
import org.apache.maven.project.interpolation.ModelInterpolationException;
import org.codehaus.plexus.util.xml.pull.XmlPullParserException;
import java.io.IOException;
/* /*
* Licensed to the Apache Software Foundation (ASF) under one * Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file * or more contributor license agreements. See the NOTICE file
@ -28,25 +39,160 @@ public class ProjectBuildingException
{ {
private final String projectId; private final String projectId;
public ProjectBuildingException( String projectId, String message ) private String pomLocation;
public ProjectBuildingException( String projectId,
String message )
{ {
super( message ); super( message );
this.projectId = projectId; this.projectId = projectId;
} }
public ProjectBuildingException( String projectId, String message, Throwable cause ) protected ProjectBuildingException( String projectId,
String message,
String pomLocation )
{
super( message );
this.projectId = projectId;
this.pomLocation = pomLocation;
}
public ProjectBuildingException( String projectId,
String message,
String pomLocation,
ProfileActivationException cause )
{
super( message, cause );
this.projectId = projectId;
this.pomLocation = pomLocation;
}
public ProjectBuildingException( String projectId,
String message,
String pomLocation,
IOException cause )
{
super( message, cause );
this.projectId = projectId;
this.pomLocation = pomLocation;
}
public ProjectBuildingException( String projectId,
String message,
String pomLocation,
XmlPullParserException cause )
{
super( message, cause );
this.projectId = projectId;
this.pomLocation = pomLocation;
}
protected ProjectBuildingException( String projectId,
String message,
XmlPullParserException cause )
{ {
super( message, cause ); super( message, cause );
this.projectId = projectId; this.projectId = projectId;
} }
public ProjectBuildingException( String projectId,
String message,
String pomLocation,
InvalidRepositoryException cause )
{
super( message, cause );
this.projectId = projectId;
this.pomLocation = pomLocation;
}
public ProjectBuildingException( String projectId,
String message,
InvalidRepositoryException cause )
{
super( message, cause );
this.projectId = projectId;
}
public ProjectBuildingException( String projectId,
String message,
ArtifactResolutionException cause )
{
super( message, cause );
this.projectId = projectId;
}
public ProjectBuildingException( String projectId,
String message,
ArtifactNotFoundException cause )
{
super( message, cause );
this.projectId = projectId;
}
public ProjectBuildingException( String projectId,
String message,
String pomLocation,
ArtifactResolutionException cause )
{
super( message, cause );
this.projectId = projectId;
this.pomLocation = pomLocation;
}
public ProjectBuildingException( String projectId,
String message,
String pomLocation,
ArtifactNotFoundException cause )
{
super( message, cause );
this.projectId = projectId;
this.pomLocation = pomLocation;
}
public ProjectBuildingException( String projectId,
String message,
String pomLocation,
InvalidVersionSpecificationException cause )
{
super( message, cause );
this.projectId = projectId;
this.pomLocation = pomLocation;
}
public ProjectBuildingException( String projectId,
String message,
String pomLocation,
InvalidDependencyVersionException cause )
{
super( message, cause );
this.projectId = projectId;
this.pomLocation = pomLocation;
}
protected ProjectBuildingException( String projectId,
String message,
String pomLocation,
ModelInterpolationException cause )
{
super( message, cause );
this.projectId = projectId;
this.pomLocation = pomLocation;
}
public String getPomLocation()
{
return pomLocation;
}
public String getProjectId() public String getProjectId()
{ {
return projectId; return projectId;
} }
public String getMessage() public String getMessage()
{ {
return super.getMessage() + " for project " + this.projectId; return super.getMessage() + " for project " + projectId
+ ( ( pomLocation == null ? "" : " at " + pomLocation ) );
} }
} }

View File

@ -87,7 +87,14 @@ public class ProjectSorter
if ( dag.getVertex( id ) != null ) if ( dag.getVertex( id ) != null )
{ {
throw new DuplicateProjectException( "Project '" + id + "' is duplicated in the reactor" ); MavenProject conflictingProject = (MavenProject) projectMap.get( id );
throw new DuplicateProjectException( id,
conflictingProject.getFile(),
project.getFile(),
"Project '"
+ id
+ "' is duplicated in the reactor" );
} }
dag.addVertex( id ); dag.addVertex( id );
@ -138,7 +145,7 @@ public class ProjectSorter
{ {
Plugin plugin = (Plugin) j.next(); Plugin plugin = (Plugin) j.next();
String pluginId = ArtifactUtils.versionlessKey( plugin.getGroupId(), plugin.getArtifactId() ); String pluginId = ArtifactUtils.versionlessKey( plugin.getGroupId(), plugin.getArtifactId() );
if ( dag.getVertex( pluginId ) != null && !pluginId.equals( id ) ) if ( ( dag.getVertex( pluginId ) != null ) && !pluginId.equals( id ) )
{ {
addEdgeWithParentCheck( projectMap, pluginId, project, id ); addEdgeWithParentCheck( projectMap, pluginId, project, id );
} }
@ -152,7 +159,7 @@ public class ProjectSorter
{ {
ReportPlugin plugin = (ReportPlugin) j.next(); ReportPlugin plugin = (ReportPlugin) j.next();
String pluginId = ArtifactUtils.versionlessKey( plugin.getGroupId(), plugin.getArtifactId() ); String pluginId = ArtifactUtils.versionlessKey( plugin.getGroupId(), plugin.getArtifactId() );
if ( dag.getVertex( pluginId ) != null && !pluginId.equals( id ) ) if ( ( dag.getVertex( pluginId ) != null ) && !pluginId.equals( id ) )
{ {
addEdgeWithParentCheck( projectMap, pluginId, project, id ); addEdgeWithParentCheck( projectMap, pluginId, project, id );
} }
@ -186,7 +193,7 @@ public class ProjectSorter
throws CycleDetectedException throws CycleDetectedException
{ {
MavenProject extProject = (MavenProject) projectMap.get( projectRefId ); MavenProject extProject = (MavenProject) projectMap.get( projectRefId );
if ( extProject == null ) if ( extProject == null )
{ {
return; return;
@ -211,7 +218,7 @@ public class ProjectSorter
{ {
if ( topLevelProject == null ) if ( topLevelProject == null )
{ {
for ( Iterator i = sortedProjects.iterator(); i.hasNext() && topLevelProject == null; ) for ( Iterator i = sortedProjects.iterator(); i.hasNext() && ( topLevelProject == null ); )
{ {
MavenProject project = (MavenProject) i.next(); MavenProject project = (MavenProject) i.next();
if ( project.isExecutionRoot() ) if ( project.isExecutionRoot() )

View File

@ -19,17 +19,14 @@ package org.apache.maven.project;
* under the License. * under the License.
*/ */
import org.apache.maven.artifact.InvalidRepositoryException; import org.apache.maven.artifact.UnknownRepositoryLayoutException;
import org.apache.maven.artifact.repository.ArtifactRepository; import org.apache.maven.artifact.repository.ArtifactRepository;
import org.apache.maven.artifact.repository.ArtifactRepositoryFactory; import org.apache.maven.artifact.repository.ArtifactRepositoryFactory;
import org.apache.maven.artifact.repository.ArtifactRepositoryPolicy; import org.apache.maven.artifact.repository.ArtifactRepositoryPolicy;
import org.apache.maven.artifact.repository.layout.ArtifactRepositoryLayout;
import org.apache.maven.model.DeploymentRepository; import org.apache.maven.model.DeploymentRepository;
import org.apache.maven.model.Repository; import org.apache.maven.model.Repository;
import org.apache.maven.model.RepositoryBase;
import org.apache.maven.model.RepositoryPolicy; import org.apache.maven.model.RepositoryPolicy;
import org.codehaus.plexus.PlexusContainer; import org.codehaus.plexus.PlexusContainer;
import org.codehaus.plexus.component.repository.exception.ComponentLookupException;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.Iterator; import java.util.Iterator;
@ -44,7 +41,7 @@ public final class ProjectUtils
public static List buildArtifactRepositories( List repositories, public static List buildArtifactRepositories( List repositories,
ArtifactRepositoryFactory artifactRepositoryFactory, ArtifactRepositoryFactory artifactRepositoryFactory,
PlexusContainer container ) PlexusContainer container )
throws InvalidRepositoryException throws UnknownRepositoryLayoutException
{ {
List repos = new ArrayList(); List repos = new ArrayList();
@ -67,17 +64,14 @@ public final class ProjectUtils
public static ArtifactRepository buildDeploymentArtifactRepository( DeploymentRepository repo, public static ArtifactRepository buildDeploymentArtifactRepository( DeploymentRepository repo,
ArtifactRepositoryFactory artifactRepositoryFactory, ArtifactRepositoryFactory artifactRepositoryFactory,
PlexusContainer container ) PlexusContainer container )
throws InvalidRepositoryException throws UnknownRepositoryLayoutException
{ {
if ( repo != null ) if ( repo != null )
{ {
String id = repo.getId(); String id = repo.getId();
String url = repo.getUrl(); String url = repo.getUrl();
// TODO: make this a map inside the factory instead, so no lookup needed return artifactRepositoryFactory.createDeploymentArtifactRepository( id, url, repo.getLayout(),
ArtifactRepositoryLayout layout = getRepositoryLayout( repo, container );
return artifactRepositoryFactory.createDeploymentArtifactRepository( id, url, layout,
repo.isUniqueVersion() ); repo.isUniqueVersion() );
} }
else else
@ -89,20 +83,17 @@ public final class ProjectUtils
public static ArtifactRepository buildArtifactRepository( Repository repo, public static ArtifactRepository buildArtifactRepository( Repository repo,
ArtifactRepositoryFactory artifactRepositoryFactory, ArtifactRepositoryFactory artifactRepositoryFactory,
PlexusContainer container ) PlexusContainer container )
throws InvalidRepositoryException throws UnknownRepositoryLayoutException
{ {
if ( repo != null ) if ( repo != null )
{ {
String id = repo.getId(); String id = repo.getId();
String url = repo.getUrl(); String url = repo.getUrl();
// TODO: make this a map inside the factory instead, so no lookup needed
ArtifactRepositoryLayout layout = getRepositoryLayout( repo, container );
ArtifactRepositoryPolicy snapshots = buildArtifactRepositoryPolicy( repo.getSnapshots() ); ArtifactRepositoryPolicy snapshots = buildArtifactRepositoryPolicy( repo.getSnapshots() );
ArtifactRepositoryPolicy releases = buildArtifactRepositoryPolicy( repo.getReleases() ); ArtifactRepositoryPolicy releases = buildArtifactRepositoryPolicy( repo.getReleases() );
return artifactRepositoryFactory.createArtifactRepository( id, url, layout, snapshots, releases ); return artifactRepositoryFactory.createArtifactRepository( id, url, repo.getLayout(), snapshots, releases );
} }
else else
{ {
@ -132,22 +123,4 @@ public final class ProjectUtils
return new ArtifactRepositoryPolicy( enabled, updatePolicy, checksumPolicy ); return new ArtifactRepositoryPolicy( enabled, updatePolicy, checksumPolicy );
} }
private static ArtifactRepositoryLayout getRepositoryLayout( RepositoryBase mavenRepo, PlexusContainer container )
throws InvalidRepositoryException
{
String layout = mavenRepo.getLayout();
ArtifactRepositoryLayout repositoryLayout;
try
{
repositoryLayout = (ArtifactRepositoryLayout) container.lookup( ArtifactRepositoryLayout.ROLE, layout );
}
catch ( ComponentLookupException e )
{
throw new InvalidRepositoryException( "Cannot find layout implementation corresponding to: \'" + layout +
"\' for remote repository with id: \'" + mavenRepo.getId() + "\'.", e );
}
return repositoryLayout;
}
} }

View File

@ -1,5 +1,7 @@
package org.apache.maven.project.artifact; package org.apache.maven.project.artifact;
import org.apache.maven.artifact.versioning.InvalidVersionSpecificationException;
/* /*
* Licensed to the Apache Software Foundation (ASF) under one * Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file * or more contributor license agreements. See the NOTICE file
@ -28,7 +30,7 @@ package org.apache.maven.project.artifact;
public class InvalidDependencyVersionException public class InvalidDependencyVersionException
extends Exception extends Exception
{ {
public InvalidDependencyVersionException( String message, Exception cause ) public InvalidDependencyVersionException( String message, InvalidVersionSpecificationException cause )
{ {
super( message, cause ); super( message, cause );
} }

View File

@ -47,7 +47,13 @@ import org.apache.maven.project.MavenProjectBuilder;
import org.apache.maven.project.ProjectBuildingException; import org.apache.maven.project.ProjectBuildingException;
import org.apache.maven.project.build.ProjectBuildCache; import org.apache.maven.project.build.ProjectBuildCache;
import org.apache.maven.project.validation.ModelValidationResult; import org.apache.maven.project.validation.ModelValidationResult;
import org.codehaus.plexus.PlexusConstants;
import org.codehaus.plexus.PlexusContainer;
import org.codehaus.plexus.component.repository.exception.ComponentLookupException;
import org.codehaus.plexus.context.Context;
import org.codehaus.plexus.context.ContextException;
import org.codehaus.plexus.logging.AbstractLogEnabled; import org.codehaus.plexus.logging.AbstractLogEnabled;
import org.codehaus.plexus.personality.plexus.lifecycle.phase.Contextualizable;
import org.codehaus.plexus.util.StringUtils; import org.codehaus.plexus.util.StringUtils;
import java.io.File; import java.io.File;
@ -65,7 +71,7 @@ import java.util.Set;
*/ */
public class MavenMetadataSource public class MavenMetadataSource
extends AbstractLogEnabled extends AbstractLogEnabled
implements ArtifactMetadataSource implements ArtifactMetadataSource, Contextualizable
{ {
public static final String ROLE_HINT = "default"; public static final String ROLE_HINT = "default";
@ -74,12 +80,14 @@ public class MavenMetadataSource
private ArtifactFactory artifactFactory; private ArtifactFactory artifactFactory;
private RepositoryMetadataManager repositoryMetadataManager; private RepositoryMetadataManager repositoryMetadataManager;
private BuildContextManager buildContextManager; private BuildContextManager buildContextManager;
// lazily instantiated and cached. // lazily instantiated and cached.
private MavenProject superProject; private MavenProject superProject;
private PlexusContainer container;
/** /**
* Retrieve the metadata for the project from the repository. * Retrieve the metadata for the project from the repository.
* Uses the ProjectBuilder, to enable post-processing and inheritance calculation before retrieving the * Uses the ProjectBuilder, to enable post-processing and inheritance calculation before retrieving the
@ -88,8 +96,17 @@ public class MavenMetadataSource
public ResolutionGroup retrieve( Artifact artifact, ArtifactRepository localRepository, List remoteRepositories ) public ResolutionGroup retrieve( Artifact artifact, ArtifactRepository localRepository, List remoteRepositories )
throws ArtifactMetadataRetrievalException throws ArtifactMetadataRetrievalException
{ {
try
{
loadProjectBuilder();
}
catch ( ComponentLookupException e )
{
throw new ArtifactMetadataRetrievalException( "Cannot lookup MavenProjectBuilder component instance: " + e.getMessage(), e );
}
ProjectBuildCache cache = ProjectBuildCache.read( buildContextManager ); ProjectBuildCache cache = ProjectBuildCache.read( buildContextManager );
MavenProject project = null; MavenProject project = null;
Artifact pomArtifact; Artifact pomArtifact;
@ -107,7 +124,7 @@ public class MavenMetadataSource
else else
{ {
project = cache.getCachedProject( artifact ); project = cache.getCachedProject( artifact );
if ( project == null ) if ( project == null )
{ {
try try
@ -122,7 +139,7 @@ public class MavenMetadataSource
if ( getLogger().isDebugEnabled() ) if ( getLogger().isDebugEnabled() )
{ {
getLogger().debug( "Reason: " + e.getMessage() ); getLogger().debug( "Reason: " + e.getMessage() );
ModelValidationResult validationResult = e.getValidationResult(); ModelValidationResult validationResult = e.getValidationResult();
if ( validationResult != null ) if ( validationResult != null )
@ -144,7 +161,7 @@ public class MavenMetadataSource
artifact.getDependencyConflictId() + "': " + e.getMessage(), e ); artifact.getDependencyConflictId() + "': " + e.getMessage(), e );
} }
} }
if ( project != null ) if ( project != null )
{ {
@ -154,7 +171,7 @@ public class MavenMetadataSource
if ( distMgmt != null ) if ( distMgmt != null )
{ {
relocation = distMgmt.getRelocation(); relocation = distMgmt.getRelocation();
artifact.setDownloadUrl( distMgmt.getDownloadUrl() ); artifact.setDownloadUrl( distMgmt.getDownloadUrl() );
pomArtifact.setDownloadUrl( distMgmt.getDownloadUrl() ); pomArtifact.setDownloadUrl( distMgmt.getDownloadUrl() );
} }
@ -174,7 +191,7 @@ public class MavenMetadataSource
artifact.setVersionRange( VersionRange.createFromVersion( relocation.getVersion() ) ); artifact.setVersionRange( VersionRange.createFromVersion( relocation.getVersion() ) );
} }
if ( artifact.getDependencyFilter() != null && if ( ( artifact.getDependencyFilter() != null ) &&
!artifact.getDependencyFilter().include( artifact ) ) !artifact.getDependencyFilter().include( artifact ) )
{ {
return null; return null;
@ -188,7 +205,7 @@ public class MavenMetadataSource
message += " " + relocation.getMessage() + "\n"; message += " " + relocation.getMessage() + "\n";
} }
if ( artifact.getDependencyTrail() != null && artifact.getDependencyTrail().size() == 1 ) if ( ( artifact.getDependencyTrail() != null ) && ( artifact.getDependencyTrail().size() == 1 ) )
{ {
getLogger().warn( "While downloading " + artifact.getGroupId() + ":" + getLogger().warn( "While downloading " + artifact.getGroupId() + ":" +
artifact.getArtifactId() + ":" + artifact.getVersion() + message + "\n" ); artifact.getArtifactId() + ":" + artifact.getVersion() + message + "\n" );
@ -217,8 +234,8 @@ public class MavenMetadataSource
{ {
// TODO: this could come straight from the project, negating the need to set it in the project itself? // TODO: this could come straight from the project, negating the need to set it in the project itself?
artifact.setDownloadUrl( pomArtifact.getDownloadUrl() ); artifact.setDownloadUrl( pomArtifact.getDownloadUrl() );
} }
ResolutionGroup result; ResolutionGroup result;
if ( project == null ) if ( project == null )
@ -255,6 +272,15 @@ public class MavenMetadataSource
return result; return result;
} }
private void loadProjectBuilder()
throws ComponentLookupException
{
if ( mavenProjectBuilder == null )
{
mavenProjectBuilder = (MavenProjectBuilder) container.lookup( MavenProjectBuilder.class );
}
}
private List aggregateRepositoryLists( List remoteRepositories, List remoteArtifactRepositories ) private List aggregateRepositoryLists( List remoteRepositories, List remoteArtifactRepositories )
throws ArtifactMetadataRetrievalException throws ArtifactMetadataRetrievalException
{ {
@ -284,7 +310,7 @@ public class MavenMetadataSource
{ {
ArtifactRepository repo = (ArtifactRepository) aggregatedIterator.next(); ArtifactRepository repo = (ArtifactRepository) aggregatedIterator.next();
// if the repository exists in the list and was introduced by another POM's super-pom, // if the repository exists in the list and was introduced by another POM's super-pom,
// remove it...the repository definitions from the super-POM should only be at the end of // remove it...the repository definitions from the super-POM should only be at the end of
// the list. // the list.
// if the repository has been redefined, leave it. // if the repository has been redefined, leave it.
@ -352,10 +378,10 @@ public class MavenMetadataSource
} }
ArtifactFilter artifactFilter = dependencyFilter; ArtifactFilter artifactFilter = dependencyFilter;
if ( artifact != null && ( artifactFilter == null || artifactFilter.include( artifact ) ) ) if ( ( artifact != null ) && ( ( artifactFilter == null ) || artifactFilter.include( artifact ) ) )
{ {
if ( d.getExclusions() != null && !d.getExclusions().isEmpty() ) if ( ( d.getExclusions() != null ) && !d.getExclusions().isEmpty() )
{ {
List exclusions = new ArrayList(); List exclusions = new ArrayList();
for ( Iterator j = d.getExclusions().iterator(); j.hasNext(); ) for ( Iterator j = d.getExclusions().iterator(); j.hasNext(); )
@ -409,7 +435,7 @@ public class MavenMetadataSource
List versions; List versions;
Metadata repoMetadata = metadata.getMetadata(); Metadata repoMetadata = metadata.getMetadata();
if ( repoMetadata != null && repoMetadata.getVersioning() != null ) if ( ( repoMetadata != null ) && ( repoMetadata.getVersioning() != null ) )
{ {
List metadataVersions = repoMetadata.getVersioning().getVersions(); List metadataVersions = repoMetadata.getVersioning().getVersions();
versions = new ArrayList( metadataVersions.size() ); versions = new ArrayList( metadataVersions.size() );
@ -426,4 +452,10 @@ public class MavenMetadataSource
return versions; return versions;
} }
public void contextualize( Context context )
throws ContextException
{
container = (PlexusContainer) context.get( PlexusConstants.PLEXUS_KEY );
}
} }

View File

@ -197,11 +197,11 @@ public class DefaultModelLineageBuilder
} }
catch ( IOException e ) catch ( IOException e )
{ {
throw new ProjectBuildingException( "unknown", "Failed to read model from: " + pomFile, e ); throw new ProjectBuildingException( "unknown", "Failed to read model from: " + pomFile, pomFile.getAbsolutePath(), e );
} }
catch ( XmlPullParserException e ) catch ( XmlPullParserException e )
{ {
throw new ProjectBuildingException( "unknown", "Failed to parse model from: " + pomFile, e ); throw new ProjectBuildingException( "unknown", "Failed to parse model from: " + pomFile, pomFile.getAbsolutePath(), e );
} }
finally finally
{ {
@ -250,7 +250,7 @@ public class DefaultModelLineageBuilder
catch ( InvalidRepositoryException e ) catch ( InvalidRepositoryException e )
{ {
throw new ProjectBuildingException( model.getId(), "Failed to create ArtifactRepository list for: " throw new ProjectBuildingException( model.getId(), "Failed to create ArtifactRepository list for: "
+ pomFile, e ); + pomFile, pomFile.getAbsolutePath(), e );
} }
} }
@ -258,7 +258,7 @@ public class DefaultModelLineageBuilder
} }
private void loadActiveProfileRepositories( List repositories, Model model, ProfileManager profileManager, private void loadActiveProfileRepositories( List repositories, Model model, ProfileManager profileManager,
File projectDir ) File pomFile )
throws ProjectBuildingException throws ProjectBuildingException
{ {
List explicitlyActive; List explicitlyActive;
@ -275,9 +275,9 @@ public class DefaultModelLineageBuilder
explicitlyInactive = Collections.EMPTY_LIST; explicitlyInactive = Collections.EMPTY_LIST;
} }
LinkedHashSet profileRepos = profileAdvisor.getArtifactRepositoriesFromActiveProfiles( profileManager, model.getId() ); LinkedHashSet profileRepos = profileAdvisor.getArtifactRepositoriesFromActiveProfiles( profileManager, pomFile, model.getId() );
profileRepos.addAll( profileAdvisor.getArtifactRepositoriesFromActiveProfiles( model, projectDir, profileRepos.addAll( profileAdvisor.getArtifactRepositoriesFromActiveProfiles( model, pomFile,
explicitlyActive, explicitlyActive,
explicitlyInactive ) ); explicitlyInactive ) );
@ -310,7 +310,7 @@ public class DefaultModelLineageBuilder
File parentPomFile = projectBuildCache.getCachedModelFile( modelParent ); File parentPomFile = projectBuildCache.getCachedModelFile( modelParent );
if ( parentPomFile == null ) if ( ( parentPomFile == null ) && ( modelPomFile != null ) )
{ {
parentPomFile = resolveParentWithRelativePath( modelParent, modelPomFile ); parentPomFile = resolveParentWithRelativePath( modelParent, modelPomFile );
} }
@ -319,7 +319,7 @@ public class DefaultModelLineageBuilder
{ {
try try
{ {
parentPomFile = resolveParentFromRepositories( modelParent, localRepository, remoteRepositories, modelPomFile ); parentPomFile = resolveParentFromRepositories( modelParent, localRepository, remoteRepositories, model.getId() );
} }
catch( ProjectBuildingException e ) catch( ProjectBuildingException e )
{ {
@ -388,7 +388,7 @@ public class DefaultModelLineageBuilder
} }
private File resolveParentFromRepositories( Parent modelParent, ArtifactRepository localRepository, private File resolveParentFromRepositories( Parent modelParent, ArtifactRepository localRepository,
List remoteRepositories, File pomFile ) List remoteRepositories, String childId )
throws ProjectBuildingException throws ProjectBuildingException
{ {
Artifact parentPomArtifact = artifactFactory.createBuildArtifact( modelParent.getGroupId(), modelParent Artifact parentPomArtifact = artifactFactory.createBuildArtifact( modelParent.getGroupId(), modelParent
@ -405,12 +405,12 @@ public class DefaultModelLineageBuilder
catch ( ArtifactResolutionException e ) catch ( ArtifactResolutionException e )
{ {
throw new ProjectBuildingException( "Parent: " + modelParent.getId(), throw new ProjectBuildingException( "Parent: " + modelParent.getId(),
"Failed to resolve POM for parent of: " + pomFile, e ); "Failed to resolve POM for parent of: " + childId, e );
} }
catch ( ArtifactNotFoundException e ) catch ( ArtifactNotFoundException e )
{ {
throw new ProjectBuildingException( "Parent: " + modelParent.getId(), "Cannot find parent: " throw new ProjectBuildingException( "Parent: " + modelParent.getId(), "Cannot find parent: "
+ parentPomArtifact.getId() + " of: " + pomFile, e ); + parentPomArtifact.getId() + " of: " + childId, e );
} }
if ( parentPomArtifact.isResolved() ) if ( parentPomArtifact.isResolved() )

View File

@ -147,6 +147,10 @@ under the License.
<role>org.apache.maven.project.MavenProjectBuilder</role> <role>org.apache.maven.project.MavenProjectBuilder</role>
<implementation>org.apache.maven.project.DefaultMavenProjectBuilder</implementation> <implementation>org.apache.maven.project.DefaultMavenProjectBuilder</implementation>
<requirements> <requirements>
<requirement>
<role>org.apache.maven.artifact.metadata.ArtifactMetadataSource</role>
<role-hint>default</role-hint>
</requirement>
<requirement> <requirement>
<role>org.apache.maven.project.build.model.ModelLineageBuilder</role> <role>org.apache.maven.project.build.model.ModelLineageBuilder</role>
<role-hint>default</role-hint> <role-hint>default</role-hint>
@ -311,9 +315,6 @@ under the License.
<role-hint>maven</role-hint> <role-hint>maven</role-hint>
<implementation>org.apache.maven.project.artifact.MavenMetadataSource</implementation> <implementation>org.apache.maven.project.artifact.MavenMetadataSource</implementation>
<requirements> <requirements>
<requirement>
<role>org.apache.maven.project.MavenProjectBuilder</role>
</requirement>
<requirement> <requirement>
<role>org.apache.maven.artifact.factory.ArtifactFactory</role> <role>org.apache.maven.artifact.factory.ArtifactFactory</role>
</requirement> </requirement>
@ -332,9 +333,6 @@ under the License.
<role-hint>default</role-hint> <role-hint>default</role-hint>
<implementation>org.apache.maven.project.artifact.MavenMetadataSource</implementation> <implementation>org.apache.maven.project.artifact.MavenMetadataSource</implementation>
<requirements> <requirements>
<requirement>
<role>org.apache.maven.project.MavenProjectBuilder</role>
</requirement>
<requirement> <requirement>
<role>org.apache.maven.artifact.factory.ArtifactFactory</role> <role>org.apache.maven.artifact.factory.ArtifactFactory</role>
</requirement> </requirement>
@ -352,10 +350,6 @@ under the License.
<role>org.apache.maven.MavenTools</role> <role>org.apache.maven.MavenTools</role>
<implementation>org.apache.maven.DefaultMavenTools</implementation> <implementation>org.apache.maven.DefaultMavenTools</implementation>
<requirements> <requirements>
<requirement>
<role>org.apache.maven.artifact.repository.layout.ArtifactRepositoryLayout</role>
<role-hint>default</role-hint>
</requirement>
<requirement> <requirement>
<role>org.apache.maven.artifact.repository.ArtifactRepositoryFactory</role> <role>org.apache.maven.artifact.repository.ArtifactRepositoryFactory</role>
</requirement> </requirement>

View File

@ -121,7 +121,7 @@ under the License.
<module>maven-embedder</module> <module>maven-embedder</module>
</modules> </modules>
<properties> <properties>
<plexusVersion>1.0-alpha-30</plexusVersion> <plexusVersion>1.0-alpha-33-SNAPSHOT</plexusVersion>
<wagonVersion>1.0-beta-2</wagonVersion> <wagonVersion>1.0-beta-2</wagonVersion>
</properties> </properties>
<dependencies> <dependencies>
@ -267,4 +267,4 @@ under the License.
</profile> </profile>
</profiles> </profiles>
</project> </project>