You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@maven.apache.org by ma...@apache.org on 2022/09/16 12:46:12 UTC

[maven] branch master updated: [MNG-7310] Using the plexusContainer to prevent loading lifecycles from defined by extensions from other submodules.

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

martinkanters pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/maven.git


The following commit(s) were added to refs/heads/master by this push:
     new 7e0e9f9fb [MNG-7310] Using the plexusContainer to prevent loading lifecycles from defined by extensions from other submodules.
7e0e9f9fb is described below

commit 7e0e9f9fbece8f416807c14fc6b582e501f3a414
Author: Martin Kanters <ma...@apache.org>
AuthorDate: Fri Nov 19 16:59:38 2021 +0100

    [MNG-7310] Using the plexusContainer to prevent loading lifecycles from defined by extensions from other submodules.
    
    This resolves #639.
---
 .../apache/maven/lifecycle/DefaultLifecycles.java  | 35 +++++++++++++++++-----
 .../maven/lifecycle/DefaultLifecyclesTest.java     | 14 +++++++--
 .../LifecycleExecutionPlanCalculatorTest.java      |  2 ++
 .../internal/stub/DefaultLifecyclesStub.java       | 11 ++++++-
 .../stub/LifecycleExecutionPlanCalculatorStub.java | 17 ++++++++++-
 5 files changed, 68 insertions(+), 11 deletions(-)

diff --git a/maven-core/src/main/java/org/apache/maven/lifecycle/DefaultLifecycles.java b/maven-core/src/main/java/org/apache/maven/lifecycle/DefaultLifecycles.java
index 9849fffea..c29791119 100644
--- a/maven-core/src/main/java/org/apache/maven/lifecycle/DefaultLifecycles.java
+++ b/maven-core/src/main/java/org/apache/maven/lifecycle/DefaultLifecycles.java
@@ -31,6 +31,8 @@ import javax.inject.Inject;
 import javax.inject.Named;
 import javax.inject.Singleton;
 
+import org.codehaus.plexus.PlexusContainer;
+import org.codehaus.plexus.component.repository.exception.ComponentLookupException;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
@@ -51,20 +53,17 @@ public class DefaultLifecycles
 
     // @Configuration(source="org/apache/maven/lifecycle/lifecycles.xml")
 
-    private final Map<String, Lifecycle> lifecyclesMap;
+    private final PlexusContainer plexusContainer;
 
     public DefaultLifecycles()
     {
-        this.lifecyclesMap = null;
+        this.plexusContainer = null;
     }
 
     @Inject
-    public DefaultLifecycles( Map<String, Lifecycle> lifecyclesMap )
+    public DefaultLifecycles( PlexusContainer plexusContainer )
     {
-        // Must keep the lifecyclesMap as is.
-        // During initialization it only contains the default lifecycles.
-        // However, extensions might add custom lifecycles later on.
-        this.lifecyclesMap = lifecyclesMap;
+        this.plexusContainer = plexusContainer;
     }
 
     /**
@@ -139,6 +138,8 @@ public class DefaultLifecycles
             }
         };
 
+        Map<String, Lifecycle> lifecyclesMap = lookupLifecycles();
+
         // ensure canonical order of standard lifecycles
         return lifecyclesMap.values().stream()
                                 .peek( l -> Objects.requireNonNull( l.getId(), "A lifecycle must have an id." ) )
@@ -146,6 +147,26 @@ public class DefaultLifecycles
                                 .collect( Collectors.toList() );
     }
 
+    private Map<String, Lifecycle> lookupLifecycles()
+    {
+        // TODO: Remove the following code when maven-compat is gone
+        // This code is here to ensure maven-compat's EmptyLifecycleExecutor keeps on working.
+        if ( plexusContainer == null )
+        {
+            return new HashMap<>();
+        }
+
+        // Lifecycles cannot be cached as extensions might add custom lifecycles later in the execution.
+        try
+        {
+            return plexusContainer.lookupMap( Lifecycle.class );
+        }
+        catch ( ComponentLookupException e )
+        {
+            throw new IllegalStateException( "Unable to lookup lifecycles from the plexus container", e );
+        }
+    }
+
     public String getLifecyclePhaseList()
     {
         return getLifeCycles().stream()
diff --git a/maven-core/src/test/java/org/apache/maven/lifecycle/DefaultLifecyclesTest.java b/maven-core/src/test/java/org/apache/maven/lifecycle/DefaultLifecyclesTest.java
index 046227a60..8ad2785ae 100644
--- a/maven-core/src/test/java/org/apache/maven/lifecycle/DefaultLifecyclesTest.java
+++ b/maven-core/src/test/java/org/apache/maven/lifecycle/DefaultLifecyclesTest.java
@@ -19,10 +19,13 @@ import java.util.ArrayList;
 import java.util.Arrays;
 import java.util.Collections;
 import java.util.List;
+import java.util.Map;
 import java.util.stream.Collectors;
 
 import javax.inject.Inject;
 
+import org.codehaus.plexus.PlexusContainer;
+import org.codehaus.plexus.component.repository.exception.ComponentLookupException;
 import org.codehaus.plexus.testing.PlexusTest;
 import org.junit.jupiter.api.Test;
 
@@ -30,6 +33,8 @@ import static org.hamcrest.MatcherAssert.assertThat;
 import static org.hamcrest.Matchers.arrayWithSize;
 import static org.hamcrest.Matchers.hasSize;
 import static org.hamcrest.Matchers.is;
+import static org.mockito.Mockito.mock;
+import static org.mockito.Mockito.when;
 
 /**
  * @author Kristian Rosenvold
@@ -82,6 +87,7 @@ public class DefaultLifecyclesTest
 
     @Test
     public void testCustomLifecycle()
+        throws ComponentLookupException
     {
         List<Lifecycle> myLifecycles = new ArrayList<>();
         Lifecycle myLifecycle = new Lifecycle( "etl",
@@ -90,8 +96,12 @@ public class DefaultLifecyclesTest
         myLifecycles.add( myLifecycle );
         myLifecycles.addAll( defaultLifeCycles.getLifeCycles() );
 
-        DefaultLifecycles dl = new DefaultLifecycles( myLifecycles.stream()
-                                                            .collect( Collectors.toMap( l -> l.getId(), l -> l ) ) );
+        Map<String, Lifecycle> lifeCycles = myLifecycles.stream()
+                .collect( Collectors.toMap( Lifecycle::getId, l -> l ) );
+        PlexusContainer mockedPlexusContainer = mock( PlexusContainer.class );
+        when( mockedPlexusContainer.lookupMap( Lifecycle.class ) ).thenReturn( lifeCycles );
+
+        DefaultLifecycles dl = new DefaultLifecycles( mockedPlexusContainer );
 
         assertThat( dl.getLifeCycles().get( 0 ).getId(), is( "clean" ) );
         assertThat( dl.getLifeCycles().get( 1 ).getId(), is( "default" ) );
diff --git a/maven-core/src/test/java/org/apache/maven/lifecycle/internal/LifecycleExecutionPlanCalculatorTest.java b/maven-core/src/test/java/org/apache/maven/lifecycle/internal/LifecycleExecutionPlanCalculatorTest.java
index 28d552afe..dc5f922d1 100644
--- a/maven-core/src/test/java/org/apache/maven/lifecycle/internal/LifecycleExecutionPlanCalculatorTest.java
+++ b/maven-core/src/test/java/org/apache/maven/lifecycle/internal/LifecycleExecutionPlanCalculatorTest.java
@@ -23,6 +23,7 @@ import org.apache.maven.lifecycle.internal.stub.DefaultLifecyclesStub;
 import org.apache.maven.lifecycle.internal.stub.PluginPrefixResolverStub;
 import org.apache.maven.lifecycle.internal.stub.PluginVersionResolverStub;
 import org.apache.maven.lifecycle.internal.stub.ProjectDependencyGraphStub;
+import org.codehaus.plexus.component.repository.exception.ComponentLookupException;
 import org.junit.jupiter.api.Test;
 
 import static org.junit.jupiter.api.Assertions.assertEquals;
@@ -63,6 +64,7 @@ public class LifecycleExecutionPlanCalculatorTest
     // Maybe also make one with LifeCycleTasks
 
     public static LifecycleExecutionPlanCalculator createExecutionPlaceCalculator( MojoDescriptorCreator mojoDescriptorCreator )
+            throws ComponentLookupException
     {
         LifecyclePluginResolver lifecyclePluginResolver = new LifecyclePluginResolver( new PluginVersionResolverStub() );
         return new DefaultLifecycleExecutionPlanCalculator( new BuildPluginManagerStub(),
diff --git a/maven-core/src/test/java/org/apache/maven/lifecycle/internal/stub/DefaultLifecyclesStub.java b/maven-core/src/test/java/org/apache/maven/lifecycle/internal/stub/DefaultLifecyclesStub.java
index 1d3f8fd5d..5d78a6bfa 100644
--- a/maven-core/src/test/java/org/apache/maven/lifecycle/internal/stub/DefaultLifecyclesStub.java
+++ b/maven-core/src/test/java/org/apache/maven/lifecycle/internal/stub/DefaultLifecyclesStub.java
@@ -17,6 +17,8 @@ package org.apache.maven.lifecycle.internal.stub;
 
 import org.apache.maven.lifecycle.DefaultLifecycles;
 import org.apache.maven.lifecycle.Lifecycle;
+import org.codehaus.plexus.PlexusContainer;
+import org.codehaus.plexus.component.repository.exception.ComponentLookupException;
 
 import java.util.Arrays;
 import java.util.HashMap;
@@ -25,6 +27,8 @@ import java.util.List;
 import java.util.Map;
 
 import static org.apache.maven.lifecycle.internal.stub.LifecycleExecutionPlanCalculatorStub.*;
+import static org.mockito.Mockito.mock;
+import static org.mockito.Mockito.when;
 
 /**
  * @author Kristian Rosenvold
@@ -33,6 +37,7 @@ import static org.apache.maven.lifecycle.internal.stub.LifecycleExecutionPlanCal
 public class DefaultLifecyclesStub
 {
     public static DefaultLifecycles createDefaultLifecycles()
+        throws ComponentLookupException
     {
 
         List<String> stubDefaultCycle =
@@ -58,7 +63,11 @@ public class DefaultLifecyclesStub
             lifeCycles.put( s, lifecycle );
 
         }
-        return new DefaultLifecycles( lifeCycles );
+
+        PlexusContainer mockedContainer = mock( PlexusContainer.class );
+        when( mockedContainer.lookupMap( Lifecycle.class ) ).thenReturn( lifeCycles );
+
+        return new DefaultLifecycles( mockedContainer );
     }
 
 }
\ No newline at end of file
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 f7514b788..80770d592 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
@@ -16,6 +16,7 @@
 package org.apache.maven.lifecycle.internal.stub;
 
 import org.apache.maven.execution.MavenSession;
+import org.apache.maven.lifecycle.DefaultLifecycles;
 import org.apache.maven.lifecycle.LifecycleNotFoundException;
 import org.apache.maven.lifecycle.LifecyclePhaseNotFoundException;
 import org.apache.maven.lifecycle.MavenExecutionPlan;
@@ -38,6 +39,7 @@ import org.apache.maven.plugin.descriptor.PluginDescriptor;
 import org.apache.maven.plugin.prefix.NoPluginFoundForPrefixException;
 import org.apache.maven.plugin.version.PluginVersionResolutionException;
 import org.apache.maven.project.MavenProject;
+import org.codehaus.plexus.component.repository.exception.ComponentLookupException;
 import org.codehaus.plexus.util.xml.Xpp3Dom;
 
 import java.util.ArrayList;
@@ -205,7 +207,20 @@ public class LifecycleExecutionPlanCalculatorStub
     {
         final List<ExecutionPlanItem> planItemList =
             ExecutionPlanItem.createExecutionPlanItems( project, mojoExecutions );
-        return new MavenExecutionPlan( planItemList, DefaultLifecyclesStub.createDefaultLifecycles() );
+        return new MavenExecutionPlan( planItemList, getDefaultLifecycles());
+    }
+
+    private static DefaultLifecycles getDefaultLifecycles()
+    {
+        try
+        {
+            return DefaultLifecyclesStub.createDefaultLifecycles();
+        }
+        catch ( ComponentLookupException e )
+        {
+            // ignore
+            return null;
+        }
     }
 
     private static MojoExecution createMojoExecution( String goal, String executionId, MojoDescriptor mojoDescriptor )