You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@maven.apache.org by rf...@apache.org on 2020/06/19 15:29:01 UTC

[maven] 02/02: [MNG-6562] WARN if plugins injected by default lifecycle bindings don't have their version locked in pom.xml or parent

This is an automated email from the ASF dual-hosted git repository.

rfscholte pushed a commit to branch MNG-6562
in repository https://gitbox.apache.org/repos/asf/maven.git

commit a7771a1234d7b5dc7be5d1c16a2f29d9d5d416a8
Author: rfscholte <rf...@apache.org>
AuthorDate: Fri Jun 19 17:28:46 2020 +0200

    [MNG-6562] WARN if plugins injected by default lifecycle bindings don't have their version locked in pom.xml or parent
---
 .../internal/DefaultLifecyclePluginAnalyzer.java   |  6 +--
 .../lifecycle/internal/builder/BuilderCommon.java  | 21 +++++++++++
 .../lifecycle/internal/BuilderCommonTest.java      | 44 ++++++++++++++++++----
 .../stub/LifecycleExecutionPlanCalculatorStub.java | 11 +++++-
 .../test/projects/project-builder/MNG-6723/pom.xml | 38 -------------------
 5 files changed, 69 insertions(+), 51 deletions(-)

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 1201742..ed8ee7f 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 @@ import org.codehaus.plexus.util.xml.Xpp3Dom;
 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<String, LifecycleMapping> lifecycleMappings;
@@ -143,10 +145,8 @@ public class DefaultLifecyclePluginAnalyzer
 
     private void parseLifecyclePhaseDefinitions( Map<Plugin, Plugin> 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 6941c37..8ad2650 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 @@ package org.apache.maven.lifecycle.internal.builder;
  * 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.LifecycleExecutionException;
 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.ReactorContext;
 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 class BuilderCommon
                 logger.warn( "*****************************************************************" );
             }
         }
+        
+        final String defaulModelId = DefaultLifecyclePluginAnalyzer.DEFAULTLIFECYCLEBINDINGS_MODELID;
+        
+        List<String> 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 f924f52..a0a4430 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 @@ package org.apache.maven.lifecycle.internal;
  * 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 @@ import java.util.HashSet;
  * @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 class BuilderCommonTest
             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 class BuilderCommonTest
     {
     }
 
-    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 90de4d8..13873be 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.execution.MavenSession;
 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 @@ public class LifecycleExecutionPlanCalculatorStub
 
     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 class LifecycleExecutionPlanCalculatorStub
         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 3aae158..e21f824 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 @@
   <modules>
     <module>child</module>
   </modules>
-  <build>
-    <pluginManagement>
-      <plugins>
-        <plugin>
-          <artifactId>maven-clean-plugin</artifactId>
-          <version>1.0</version>
-        </plugin>
-        <plugin>
-          <artifactId>maven-install-plugin</artifactId>
-          <version>1.0</version>
-        </plugin>
-        <plugin>
-          <artifactId>maven-deploy-plugin</artifactId>
-          <version>1.0</version>
-        </plugin>
-        <plugin>
-          <artifactId>maven-site-plugin</artifactId>
-          <version>1.0</version>
-        </plugin>
-        <plugin>
-          <artifactId>maven-resources-plugin</artifactId>
-          <version>1.0</version>
-        </plugin>
-        <plugin>
-          <artifactId>maven-jar-plugin</artifactId>
-          <version>1.0</version>
-        </plugin>
-        <plugin>
-          <artifactId>maven-compiler-plugin</artifactId>
-          <version>1.0</version>
-        </plugin>
-        <plugin>
-          <artifactId>maven-surefire-plugin</artifactId>
-          <version>1.0</version>
-        </plugin>
-      </plugins>
-    </pluginManagement>
-  </build>
 </project>