This is an automated email from the ASF dual-hosted git repository. stephenc pushed a commit to branch mng-5668-poc in repository https://gitbox.apache.org/repos/asf/maven.git
The following commit(s) were added to refs/heads/mng-5668-poc by this push: new f4df738 [MNG-5668] Add error reporting if the user tries to invoke a dynamic phase directly f4df738 is described below commit f4df7383ed53b0634999387d8cd4989c0daad59c Author: Stephen Connolly <stephen.alan.conno...@gmail.com> AuthorDate: Thu Nov 21 20:25:07 2019 +0000 [MNG-5668] Add error reporting if the user tries to invoke a dynamic phase directly --- .../DefaultLifecycleTaskSegmentCalculator.java | 48 ++++++++++++++++------ .../internal/LifecycleTaskSegmentCalculator.java | 2 +- .../maven/lifecycle/internal/MojoExecutor.java | 3 +- .../apache/maven/lifecycle/internal/PhaseId.java | 6 +-- maven-plugin-api/src/main/mdo/lifecycle.mdo | 2 +- 5 files changed, 43 insertions(+), 18 deletions(-) diff --git a/maven-core/src/main/java/org/apache/maven/lifecycle/internal/DefaultLifecycleTaskSegmentCalculator.java b/maven-core/src/main/java/org/apache/maven/lifecycle/internal/DefaultLifecycleTaskSegmentCalculator.java index cb49050..c10cbf0 100644 --- a/maven-core/src/main/java/org/apache/maven/lifecycle/internal/DefaultLifecycleTaskSegmentCalculator.java +++ b/maven-core/src/main/java/org/apache/maven/lifecycle/internal/DefaultLifecycleTaskSegmentCalculator.java @@ -86,7 +86,7 @@ public class DefaultLifecycleTaskSegmentCalculator public List<TaskSegment> calculateTaskSegments( MavenSession session, List<String> tasks ) throws PluginNotFoundException, PluginResolutionException, PluginDescriptorParsingException, MojoNotFoundException, NoPluginFoundForPrefixException, InvalidPluginDescriptorException, - PluginVersionResolutionException + PluginVersionResolutionException, LifecyclePhaseNotFoundException, LifecycleNotFoundException { List<TaskSegment> taskSegments = new ArrayList<>( tasks.size() ); @@ -94,24 +94,48 @@ public class DefaultLifecycleTaskSegmentCalculator for ( String task : tasks ) { + PhaseId phaseId = PhaseId.of( task ); + // if the priority is non-zero then you specified the priority on the CLI + if ( phaseId.priority() != 0 ) + { + throw new LifecyclePhaseNotFoundException( + "Dynamic phases such as \"" + task + "\" are only permitted as execution targets specified " + + "inside the pom.xml. Try invoking the whole phase, i.e. \"" + phaseId.phase() + "\".", task ); + } if ( isGoalSpecification( task ) ) { - // "pluginPrefix:goal" or "groupId:artifactId[:version]:goal" + try + { + // "pluginPrefix:goal" or "groupId:artifactId[:version]:goal" - lifecyclePluginResolver.resolveMissingPluginVersions( session.getTopLevelProject(), session ); + lifecyclePluginResolver.resolveMissingPluginVersions( session.getTopLevelProject(), session ); - MojoDescriptor mojoDescriptor = - mojoDescriptorCreator.getMojoDescriptor( task, session, session.getTopLevelProject() ); + MojoDescriptor mojoDescriptor = + mojoDescriptorCreator.getMojoDescriptor( task, session, session.getTopLevelProject() ); - boolean aggregating = mojoDescriptor.isAggregator() || !mojoDescriptor.isProjectRequired(); + boolean aggregating = mojoDescriptor.isAggregator() || !mojoDescriptor.isProjectRequired(); - if ( currentSegment == null || currentSegment.isAggregating() != aggregating ) + if ( currentSegment == null || currentSegment.isAggregating() != aggregating ) + { + currentSegment = new TaskSegment( aggregating ); + taskSegments.add( currentSegment ); + } + + currentSegment.getTasks().add( new GoalTask( task ) ); + } + catch ( NoPluginFoundForPrefixException e ) { - currentSegment = new TaskSegment( aggregating ); - taskSegments.add( currentSegment ); + if ( phaseId.executionPoint() != PhaseExecutionPoint.AS && phaseId.phase().indexOf( ':' ) == -1 ) + { + LifecyclePhaseNotFoundException lpnfe = new LifecyclePhaseNotFoundException( + "Dynamic phases such as \"" + task + "\" are only permitted as execution targets specified " + + "inside the pom.xml. Try invoking the whole phase, i.e. \"" + phaseId.phase() + "\".", + task ); + lpnfe.addSuppressed( e ); + throw lpnfe; + } + throw e; } - - currentSegment.getTasks().add( new GoalTask( task ) ); } else { @@ -152,4 +176,4 @@ public class DefaultLifecycleTaskSegmentCalculator return task.indexOf( ':' ) >= 0; } -} \ No newline at end of file +} diff --git a/maven-core/src/main/java/org/apache/maven/lifecycle/internal/LifecycleTaskSegmentCalculator.java b/maven-core/src/main/java/org/apache/maven/lifecycle/internal/LifecycleTaskSegmentCalculator.java index 7dd84d8..7c7db5a 100644 --- a/maven-core/src/main/java/org/apache/maven/lifecycle/internal/LifecycleTaskSegmentCalculator.java +++ b/maven-core/src/main/java/org/apache/maven/lifecycle/internal/LifecycleTaskSegmentCalculator.java @@ -54,7 +54,7 @@ public interface LifecycleTaskSegmentCalculator List<TaskSegment> calculateTaskSegments( MavenSession session, List<String> tasks ) throws PluginNotFoundException, PluginResolutionException, PluginDescriptorParsingException, MojoNotFoundException, NoPluginFoundForPrefixException, InvalidPluginDescriptorException, - PluginVersionResolutionException; + PluginVersionResolutionException, LifecyclePhaseNotFoundException, LifecycleNotFoundException; boolean requiresProject( MavenSession session ); diff --git a/maven-core/src/main/java/org/apache/maven/lifecycle/internal/MojoExecutor.java b/maven-core/src/main/java/org/apache/maven/lifecycle/internal/MojoExecutor.java index df3f34c..ae5b03f 100644 --- a/maven-core/src/main/java/org/apache/maven/lifecycle/internal/MojoExecutor.java +++ b/maven-core/src/main/java/org/apache/maven/lifecycle/internal/MojoExecutor.java @@ -251,7 +251,8 @@ public class MojoExecutor { pluginManager.executeMojo( session, mojoExecution ); } - catch ( MojoFailureException | PluginManagerException | PluginConfigurationException | MojoExecutionException e ) + catch ( MojoFailureException | PluginManagerException | PluginConfigurationException + | MojoExecutionException e ) { throw new LifecycleExecutionException( mojoExecution, session.getCurrentProject(), e ); } diff --git a/maven-core/src/main/java/org/apache/maven/lifecycle/internal/PhaseId.java b/maven-core/src/main/java/org/apache/maven/lifecycle/internal/PhaseId.java index a225541..da5bece 100644 --- a/maven-core/src/main/java/org/apache/maven/lifecycle/internal/PhaseId.java +++ b/maven-core/src/main/java/org/apache/maven/lifecycle/internal/PhaseId.java @@ -30,7 +30,7 @@ public class PhaseId /** * Interned {@link PhaseId} instances. */ - private static final Map<String, PhaseId> instances = new WeakHashMap<>(); + private static final Map<String, PhaseId> INSTANCES = new WeakHashMap<>(); /** * The execution point of this {@link PhaseId}. @@ -55,11 +55,11 @@ public class PhaseId */ public static synchronized PhaseId of( String phase ) { - PhaseId result = instances.get( phase ); + PhaseId result = INSTANCES.get( phase ); if ( result == null ) { result = new PhaseId( phase ); - instances.put( phase, result ); + INSTANCES.put( phase, result ); } return result; } diff --git a/maven-plugin-api/src/main/mdo/lifecycle.mdo b/maven-plugin-api/src/main/mdo/lifecycle.mdo index 8c6922f..9418758 100644 --- a/maven-plugin-api/src/main/mdo/lifecycle.mdo +++ b/maven-plugin-api/src/main/mdo/lifecycle.mdo @@ -137,7 +137,7 @@ under the License. * Get the effective ID of this phase, e.g., * <code>generate-sources</code> or <code>after:integration-test[1000]</code>. * - * @return String + * @return the effective ID of this phase */ public String getId() {