diff --git a/maven-core/src/main/java/org/apache/maven/lifecycle/internal/DefaultLifecyclePluginAnalyzer.java b/maven-core/src/main/java/org/apache/maven/lifecycle/internal/DefaultLifecyclePluginAnalyzer.java index 1201742ffc..ed8ee7f900 100644 --- a/maven-core/src/main/java/org/apache/maven/lifecycle/internal/DefaultLifecyclePluginAnalyzer.java +++ b/maven-core/src/main/java/org/apache/maven/lifecycle/internal/DefaultLifecyclePluginAnalyzer.java @@ -56,6 +56,8 @@ public class DefaultLifecyclePluginAnalyzer implements LifeCyclePluginAnalyzer { + public static final String DEFAULTLIFECYCLEBINDINGS_MODELID = "org.apache.maven:maven-core:" + + DefaultLifecyclePluginAnalyzer.class.getPackage().getImplementationVersion() + ":default-lifecycle-bindings"; @Requirement( role = LifecycleMapping.class ) private Map lifecycleMappings; @@ -143,10 +145,8 @@ private List getOrderedLifecycles() private void parseLifecyclePhaseDefinitions( Map plugins, String phase, LifecyclePhase goals ) { - String modelId = "org.apache.maven:maven-core:" + this.getClass().getPackage().getImplementationVersion() - + ":default-lifecycle-bindings"; InputSource inputSource = new InputSource(); - inputSource.setModelId( modelId ); + inputSource.setModelId( DEFAULTLIFECYCLEBINDINGS_MODELID ); InputLocation location = new InputLocation( -1, -1, inputSource ); location.setLocation( 0, location ); diff --git a/maven-core/src/main/java/org/apache/maven/lifecycle/internal/builder/BuilderCommon.java b/maven-core/src/main/java/org/apache/maven/lifecycle/internal/builder/BuilderCommon.java index 6941c37490..8ad2650ceb 100644 --- a/maven-core/src/main/java/org/apache/maven/lifecycle/internal/builder/BuilderCommon.java +++ b/maven-core/src/main/java/org/apache/maven/lifecycle/internal/builder/BuilderCommon.java @@ -19,7 +19,9 @@ * under the License. */ +import java.util.List; import java.util.Set; +import java.util.stream.Collectors; import javax.inject.Inject; import javax.inject.Named; @@ -34,6 +36,7 @@ import org.apache.maven.lifecycle.LifecycleNotFoundException; import org.apache.maven.lifecycle.LifecyclePhaseNotFoundException; import org.apache.maven.lifecycle.MavenExecutionPlan; +import org.apache.maven.lifecycle.internal.DefaultLifecyclePluginAnalyzer; import org.apache.maven.lifecycle.internal.ExecutionEventCatapult; import org.apache.maven.lifecycle.internal.LifecycleDebugLogger; import org.apache.maven.lifecycle.internal.LifecycleExecutionPlanCalculator; @@ -41,6 +44,7 @@ import org.apache.maven.lifecycle.internal.TaskSegment; import org.apache.maven.model.Plugin; import org.apache.maven.plugin.InvalidPluginDescriptorException; +import org.apache.maven.plugin.MojoExecution; import org.apache.maven.plugin.MojoNotFoundException; import org.apache.maven.plugin.PluginDescriptorParsingException; import org.apache.maven.plugin.PluginNotFoundException; @@ -136,6 +140,23 @@ public MavenExecutionPlan resolveBuildPlan( MavenSession session, MavenProject p logger.warn( "*****************************************************************" ); } } + + final String defaulModelId = DefaultLifecyclePluginAnalyzer.DEFAULTLIFECYCLEBINDINGS_MODELID; + + List unversionedPlugins = executionPlan.getMojoExecutions().stream() + .map( MojoExecution::getPlugin ) + .filter( p -> p.getLocation( "version" ) != null ) // versionless cli goal (?) + .filter( p -> p.getLocation( "version" ).getSource() != null ) // versionless in pom (?) + .filter( p -> defaulModelId.equals( p.getLocation( "version" ).getSource().getModelId() ) ) + .distinct() + .map( Plugin::getArtifactId ) // managed by us, groupId is always o.a.m.plugins + .collect( Collectors.toList() ); + + if ( !unversionedPlugins.isEmpty() ) + { + logger.warn( "Version not locked for default bindings plugins " + unversionedPlugins + + ", you should define versions in pluginManagement section of your " + "pom.xml or parent" ); + } return executionPlan; } diff --git a/maven-core/src/test/java/org/apache/maven/lifecycle/internal/BuilderCommonTest.java b/maven-core/src/test/java/org/apache/maven/lifecycle/internal/BuilderCommonTest.java index f924f52389..a0a4430352 100644 --- a/maven-core/src/test/java/org/apache/maven/lifecycle/internal/BuilderCommonTest.java +++ b/maven-core/src/test/java/org/apache/maven/lifecycle/internal/BuilderCommonTest.java @@ -15,14 +15,18 @@ * the License. */ -import junit.framework.TestCase; +import static org.junit.Assert.assertEquals; +import static org.mockito.Mockito.mock; +import static org.mockito.Mockito.verify; import org.apache.maven.execution.MavenSession; import org.apache.maven.lifecycle.MavenExecutionPlan; import org.apache.maven.lifecycle.internal.builder.BuilderCommon; import org.apache.maven.lifecycle.internal.stub.LifecycleExecutionPlanCalculatorStub; -import org.apache.maven.lifecycle.internal.stub.LoggerStub; import org.apache.maven.lifecycle.internal.stub.ProjectDependencyGraphStub; +import org.codehaus.plexus.logging.Logger; +import org.junit.Test; + import java.util.HashSet; @@ -30,8 +34,10 @@ * @author Kristian Rosenvold */ public class BuilderCommonTest - extends TestCase { + private Logger logger = mock( Logger.class ); + + @Test public void testResolveBuildPlan() throws Exception { @@ -46,10 +52,32 @@ public void testResolveBuildPlan() builderCommon.resolveBuildPlan( session1, ProjectDependencyGraphStub.A, taskSegment1, new HashSet<>() ); assertEquals( LifecycleExecutionPlanCalculatorStub.getProjectAExceutionPlan().size(), plan.size() ); - } + + @Test + public void testDefaultBindingPluginsWarning() + throws Exception + { + MavenSession original = ProjectDependencyGraphStub.getMavenSession(); + final TaskSegment taskSegment1 = new TaskSegment( false ); + final MavenSession session1 = original.clone(); + session1.setCurrentProject( ProjectDependencyGraphStub.A ); + getBuilderCommon().resolveBuildPlan( session1, ProjectDependencyGraphStub.A, taskSegment1, new HashSet<>() ); + + verify( logger ).warn("Version not locked for default bindings plugins [" + + "stub-plugin-initialize, " + + "stub-plugin-process-resources, " + + "stub-plugin-compile, " + + "stub-plugin-process-test-resources, " + + "stub-plugin-test-compile, " + + "stub-plugin-test, " + + "stub-plugin-package, " + + "stub-plugin-install], " + + "you should define versions in pluginManagement section of your pom.xml or parent"); + } + public void testHandleBuildError() throws Exception { @@ -65,11 +93,11 @@ public void testGetKey() { } - public static BuilderCommon getBuilderCommon() + public BuilderCommon getBuilderCommon() { - final LifecycleDebugLogger logger = new LifecycleDebugLogger( new LoggerStub() ); - return new BuilderCommon( logger, new LifecycleExecutionPlanCalculatorStub(), - new LoggerStub() ); + final LifecycleDebugLogger debugLogger = new LifecycleDebugLogger( logger ); + return new BuilderCommon( debugLogger, new LifecycleExecutionPlanCalculatorStub(), + logger ); } } diff --git a/maven-core/src/test/java/org/apache/maven/lifecycle/internal/stub/LifecycleExecutionPlanCalculatorStub.java b/maven-core/src/test/java/org/apache/maven/lifecycle/internal/stub/LifecycleExecutionPlanCalculatorStub.java index 90de4d8967..13873be578 100644 --- a/maven-core/src/test/java/org/apache/maven/lifecycle/internal/stub/LifecycleExecutionPlanCalculatorStub.java +++ b/maven-core/src/test/java/org/apache/maven/lifecycle/internal/stub/LifecycleExecutionPlanCalculatorStub.java @@ -19,10 +19,13 @@ import org.apache.maven.lifecycle.LifecycleNotFoundException; import org.apache.maven.lifecycle.LifecyclePhaseNotFoundException; import org.apache.maven.lifecycle.MavenExecutionPlan; +import org.apache.maven.lifecycle.internal.DefaultLifecyclePluginAnalyzer; import org.apache.maven.lifecycle.internal.ExecutionPlanItem; import org.apache.maven.lifecycle.internal.LifecycleExecutionPlanCalculator; import org.apache.maven.lifecycle.internal.ProjectBuildList; import org.apache.maven.lifecycle.internal.ProjectSegment; +import org.apache.maven.model.InputLocation; +import org.apache.maven.model.InputSource; import org.apache.maven.model.Plugin; import org.apache.maven.plugin.InvalidPluginDescriptorException; import org.apache.maven.plugin.MojoExecution; @@ -203,7 +206,11 @@ private static MavenExecutionPlan createExecutionPlan( MavenProject project, Lis private static MojoExecution createMojoExecution( String goal, String executionId, MojoDescriptor mojoDescriptor ) { + InputSource defaultBindings = new InputSource(); + defaultBindings.setModelId( DefaultLifecyclePluginAnalyzer.DEFAULTLIFECYCLEBINDINGS_MODELID ); + final Plugin plugin = mojoDescriptor.getPluginDescriptor().getPlugin(); + plugin.setLocation( "version", new InputLocation( 12, 34, defaultBindings ) ); MojoExecution result = new MojoExecution( plugin, goal, executionId ); result.setConfiguration( new Xpp3Dom( executionId + "-" + goal ) ); result.setMojoDescriptor( mojoDescriptor ); @@ -224,8 +231,8 @@ public static MojoDescriptor createMojoDescriptor( String phaseName, boolean thr mojoDescriptor.setPhase( phaseName ); final PluginDescriptor descriptor = new PluginDescriptor(); Plugin plugin = new Plugin(); - plugin.setArtifactId( "org.apache.maven.test.MavenExecutionPlan" ); - plugin.setGroupId( "stub-plugin-" + phaseName ); + plugin.setGroupId( "org.apache.maven.test.MavenExecutionPlan" ); + plugin.setArtifactId( "stub-plugin-" + phaseName ); descriptor.setPlugin( plugin ); descriptor.setArtifactId( "artifact." + phaseName ); mojoDescriptor.setPluginDescriptor( descriptor ); diff --git a/maven-core/src/test/projects/project-builder/MNG-6723/pom.xml b/maven-core/src/test/projects/project-builder/MNG-6723/pom.xml index 3aae158291..e21f824c52 100644 --- a/maven-core/src/test/projects/project-builder/MNG-6723/pom.xml +++ b/maven-core/src/test/projects/project-builder/MNG-6723/pom.xml @@ -8,42 +8,4 @@ child - - - - - maven-clean-plugin - 1.0 - - - maven-install-plugin - 1.0 - - - maven-deploy-plugin - 1.0 - - - maven-site-plugin - 1.0 - - - maven-resources-plugin - 1.0 - - - maven-jar-plugin - 1.0 - - - maven-compiler-plugin - 1.0 - - - maven-surefire-plugin - 1.0 - - - -