You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@maven.apache.org by mi...@apache.org on 2020/05/30 14:24:55 UTC

[maven-dependency-plugin] 01/01: [MDEP-680] dependency:go-offline does not use repositories from parent pom in reactor build

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

michaelo pushed a commit to branch MDEP-680
in repository https://gitbox.apache.org/repos/asf/maven-dependency-plugin.git

commit 02d0b28601e0410952b5b4301375cf4ba564f908
Author: Piotrek Żygieło <pz...@users.noreply.github.com>
AuthorDate: Fri May 1 21:29:31 2020 +0200

    [MDEP-680] dependency:go-offline does not use repositories from parent pom in reactor build
    
    This closes #46
---
 .../plugins/dependency/AbstractDependencyMojo.java |  22 ++-
 .../dependency/resolvers/GoOfflineMojo.java        |  23 ++--
 .../dependency/resolvers/ResolvePluginsMojo.java   |  15 +--
 .../dependency/AbstractDependencyMojoTest.java     | 148 +++++++++++++++++++++
 4 files changed, 184 insertions(+), 24 deletions(-)

diff --git a/src/main/java/org/apache/maven/plugins/dependency/AbstractDependencyMojo.java b/src/main/java/org/apache/maven/plugins/dependency/AbstractDependencyMojo.java
index 2f7a2ce..07df9f6 100644
--- a/src/main/java/org/apache/maven/plugins/dependency/AbstractDependencyMojo.java
+++ b/src/main/java/org/apache/maven/plugins/dependency/AbstractDependencyMojo.java
@@ -91,6 +91,12 @@ public abstract class AbstractDependencyMojo
     private List<ArtifactRepository> remoteRepositories;
 
     /**
+     * Remote repositories which will be searched for plugins.
+     */
+    @Parameter( defaultValue = "${project.pluginArtifactRepositories}", readonly = true, required = true )
+    private List<ArtifactRepository> remotePluginRepositories;
+
+    /**
      * Contains the full list of projects in the reactor.
      */
     @Parameter( defaultValue = "${reactorProjects}", readonly = true )
@@ -346,10 +352,24 @@ public abstract class AbstractDependencyMojo
      */
     public ProjectBuildingRequest newResolveArtifactProjectBuildingRequest()
     {
+        return newProjectBuildingRequest( remoteRepositories );
+    }
+
+    /**
+     * @return Returns a new ProjectBuildingRequest populated from the current session and the current project remote
+     *         repositories, used to resolve plugins.
+     */
+    protected ProjectBuildingRequest newResolvePluginProjectBuildingRequest()
+    {
+        return newProjectBuildingRequest( remotePluginRepositories );
+    }
+
+    private ProjectBuildingRequest newProjectBuildingRequest( List<ArtifactRepository> repositories )
+    {
         ProjectBuildingRequest buildingRequest =
             new DefaultProjectBuildingRequest( session.getProjectBuildingRequest() );
 
-        buildingRequest.setRemoteRepositories( remoteRepositories );
+        buildingRequest.setRemoteRepositories( repositories );
 
         return buildingRequest;
     }
diff --git a/src/main/java/org/apache/maven/plugins/dependency/resolvers/GoOfflineMojo.java b/src/main/java/org/apache/maven/plugins/dependency/resolvers/GoOfflineMojo.java
index b12dd6f..e0e8b1f 100644
--- a/src/main/java/org/apache/maven/plugins/dependency/resolvers/GoOfflineMojo.java
+++ b/src/main/java/org/apache/maven/plugins/dependency/resolvers/GoOfflineMojo.java
@@ -20,11 +20,11 @@ package org.apache.maven.plugins.dependency.resolvers;
  */
 
 import org.apache.maven.artifact.Artifact;
+import org.apache.maven.artifact.repository.ArtifactRepository;
 import org.apache.maven.model.Dependency;
 import org.apache.maven.plugin.MojoExecutionException;
 import org.apache.maven.plugins.dependency.utils.DependencyUtil;
 import org.apache.maven.plugins.annotations.Mojo;
-import org.apache.maven.project.DefaultProjectBuildingRequest;
 import org.apache.maven.project.ProjectBuildingRequest;
 import org.apache.maven.shared.artifact.filter.collection.ArtifactsFilter;
 import org.apache.maven.shared.artifact.filter.resolve.TransformableFilter;
@@ -49,7 +49,6 @@ import java.util.Set;
 public class GoOfflineMojo
     extends AbstractResolveMojo
 {
-
     /**
      * Main entry into mojo. Gets the list of dependencies, resolves all that are not in the Reactor, and iterates
      * through displaying the resolved versions.
@@ -101,25 +100,32 @@ public class GoOfflineMojo
     {
         final Collection<Dependency> dependencies = getProject().getDependencies();
         final Set<DependableCoordinate> dependableCoordinates = new HashSet<>();
-        final ProjectBuildingRequest buildingRequest =
-                new DefaultProjectBuildingRequest( session.getProjectBuildingRequest() );
+
+        final ProjectBuildingRequest buildingRequest = newResolveArtifactProjectBuildingRequest();
 
         for ( Dependency dependency : dependencies )
         {
             dependableCoordinates.add( createDependendableCoordinateFromDependency( dependency ) );
         }
 
-        return resolveDependableCoordinate( buildingRequest, dependableCoordinates );
+        return resolveDependableCoordinate( buildingRequest, dependableCoordinates, "dependencies" );
     }
 
     private Set<Artifact> resolveDependableCoordinate( final ProjectBuildingRequest buildingRequest,
-                                                        final Collection<DependableCoordinate> dependableCoordinates )
+                                                        final Collection<DependableCoordinate> dependableCoordinates,
+                                                       final String type )
             throws DependencyResolverException
     {
         final TransformableFilter filter = getTransformableFilter();
 
         final Set<Artifact> results = new HashSet<>();
 
+        this.getLog().debug( "Resolving '" + type + "' with following repositories:" );
+        for ( ArtifactRepository repo : buildingRequest.getRemoteRepositories() )
+        {
+            getLog().debug( repo.getId() + " (" + repo.getUrl() + ")" );
+        }
+
         for ( DependableCoordinate dependableCoordinate : dependableCoordinates )
         {
             final Iterable<ArtifactResult> artifactResults = getDependencyResolver().resolveDependencies(
@@ -164,15 +170,14 @@ public class GoOfflineMojo
         artifacts.addAll( reports );
         artifacts.addAll( plugins );
 
-        final ProjectBuildingRequest buildingRequest =
-                new DefaultProjectBuildingRequest( session.getProjectBuildingRequest() );
+        final ProjectBuildingRequest buildingRequest = newResolvePluginProjectBuildingRequest();
 
         for ( Artifact artifact : artifacts )
         {
             dependableCoordinates.add( createDependendableCoordinateFromArtifact( artifact ) );
         }
 
-        return resolveDependableCoordinate( buildingRequest, dependableCoordinates );
+        return resolveDependableCoordinate( buildingRequest, dependableCoordinates, "plugins" );
     }
 
     private DependableCoordinate createDependendableCoordinateFromArtifact( final Artifact artifact )
diff --git a/src/main/java/org/apache/maven/plugins/dependency/resolvers/ResolvePluginsMojo.java b/src/main/java/org/apache/maven/plugins/dependency/resolvers/ResolvePluginsMojo.java
index 33f774b..0f45e90 100644
--- a/src/main/java/org/apache/maven/plugins/dependency/resolvers/ResolvePluginsMojo.java
+++ b/src/main/java/org/apache/maven/plugins/dependency/resolvers/ResolvePluginsMojo.java
@@ -21,17 +21,13 @@ package org.apache.maven.plugins.dependency.resolvers;
 
 import java.io.IOException;
 import java.util.LinkedHashSet;
-import java.util.List;
 import java.util.Set;
 
 import org.apache.maven.artifact.Artifact;
-import org.apache.maven.artifact.repository.ArtifactRepository;
 import org.apache.maven.plugin.MojoExecutionException;
 import org.apache.maven.plugins.annotations.LifecyclePhase;
 import org.apache.maven.plugins.annotations.Mojo;
-import org.apache.maven.plugins.annotations.Parameter;
 import org.apache.maven.plugins.dependency.utils.DependencyUtil;
-import org.apache.maven.project.DefaultProjectBuildingRequest;
 import org.apache.maven.project.ProjectBuildingRequest;
 import org.apache.maven.shared.artifact.filter.collection.ArtifactFilterException;
 import org.apache.maven.shared.artifact.filter.collection.ArtifactsFilter;
@@ -52,12 +48,6 @@ public class ResolvePluginsMojo
 {
 
     /**
-     * Remote repositories which will be searched for plugins.
-     */
-    @Parameter( defaultValue = "${project.pluginArtifactRepositories}", readonly = true, required = true )
-    private List<ArtifactRepository> remotePluginRepositories;
-
-    /**
      * Main entry into mojo. Gets the list of dependencies and iterates through displaying the resolved version.
      *
      * @throws MojoExecutionException with a message if an error occurs.
@@ -194,10 +184,7 @@ public class ResolvePluginsMojo
             // continue;
             // }
 
-            ProjectBuildingRequest buildingRequest =
-                new DefaultProjectBuildingRequest( session.getProjectBuildingRequest() );
-
-            buildingRequest.setRemoteRepositories( this.remotePluginRepositories );
+            ProjectBuildingRequest buildingRequest = newResolvePluginProjectBuildingRequest();
 
             // resolve the new artifact
             resolvedArtifacts.add( getArtifactResolver().resolveArtifact( buildingRequest, artifact ).getArtifact() );
diff --git a/src/test/java/org/apache/maven/plugins/dependency/AbstractDependencyMojoTest.java b/src/test/java/org/apache/maven/plugins/dependency/AbstractDependencyMojoTest.java
new file mode 100644
index 0000000..861ca47
--- /dev/null
+++ b/src/test/java/org/apache/maven/plugins/dependency/AbstractDependencyMojoTest.java
@@ -0,0 +1,148 @@
+package org.apache.maven.plugins.dependency;
+
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *  http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+import junit.framework.TestCase;
+import org.apache.maven.artifact.repository.ArtifactRepository;
+import org.apache.maven.execution.MavenSession;
+import org.apache.maven.project.ProjectBuildingRequest;
+
+import java.lang.reflect.Field;
+import java.util.ArrayList;
+import java.util.List;
+
+import static org.apache.maven.plugins.dependency.AbstractDependencyMojoTest.ConcreteDependencyMojo.createConcreteDependencyMojoWithArtifactRepositories;
+import static org.apache.maven.plugins.dependency.AbstractDependencyMojoTest.ConcreteDependencyMojo.createConcreteDependencyMojoWithPluginRepositories;
+import static org.mockito.Mockito.mock;
+import static org.mockito.Mockito.when;
+
+public class AbstractDependencyMojoTest extends TestCase
+{
+    private MavenSession session = mock( MavenSession.class );
+
+    private ProjectBuildingRequest buildingRequest = mock( ProjectBuildingRequest.class );
+
+    private ArrayList<ArtifactRepository> artifactRepos = new ArrayList<>();
+
+    private ArrayList<ArtifactRepository> pluginRepos = new ArrayList<>();
+
+    static class ConcreteDependencyMojo extends AbstractDependencyMojo
+    {
+        static ConcreteDependencyMojo createConcreteDependencyMojoWithArtifactRepositories(
+                MavenSession mavenSession, List<ArtifactRepository> artifactRepos )
+                throws NoSuchFieldException, IllegalAccessException
+        {
+            ConcreteDependencyMojo cdm = new ConcreteDependencyMojo();
+            cdm.session = mavenSession;
+
+            Field par = AbstractDependencyMojo.class.getDeclaredField( "remoteRepositories" );
+            par.setAccessible( true );
+            par.set( cdm, artifactRepos );
+
+            return cdm;
+        }
+
+        static ConcreteDependencyMojo createConcreteDependencyMojoWithPluginRepositories(
+                MavenSession mavenSession, List<ArtifactRepository> pluginRepos )
+                throws NoSuchFieldException, IllegalAccessException
+        {
+            ConcreteDependencyMojo cdm = new ConcreteDependencyMojo();
+            cdm.session = mavenSession;
+
+            Field par = AbstractDependencyMojo.class.getDeclaredField( "remotePluginRepositories" );
+            par.setAccessible( true );
+            par.set( cdm, pluginRepos );
+
+            return cdm;
+        }
+
+        @Override
+        protected void doExecute()
+        {
+        }
+    }
+
+    @Override
+    protected void setUp() throws Exception
+    {
+        pluginRepos.add( newRepositoryWithId( "pr-central" ) );
+        pluginRepos.add( newRepositoryWithId( "pr-plugins" ) );
+
+        artifactRepos.add( newRepositoryWithId( "ar-central" ) );
+        artifactRepos.add( newRepositoryWithId( "ar-snapshots" ) );
+        artifactRepos.add( newRepositoryWithId( "ar-staging" ) );
+
+        when( session.getProjectBuildingRequest() ).thenReturn( buildingRequest );
+    }
+
+    private static ArtifactRepository newRepositoryWithId( String id )
+    {
+        ArtifactRepository repo = mock( ArtifactRepository.class );
+        when( repo.getId() ).thenReturn( id );
+        return repo;
+    }
+
+    public void testNewResolveArtifactProjectBuildingRequestRemoteRepositoriesSize()
+            throws NoSuchFieldException, IllegalAccessException
+    {
+        AbstractDependencyMojo mojo = createConcreteDependencyMojoWithArtifactRepositories( session, artifactRepos );
+
+        ProjectBuildingRequest pbr = mojo.newResolveArtifactProjectBuildingRequest();
+        List<ArtifactRepository> rrepos = pbr.getRemoteRepositories();
+
+        assertEquals( 3, rrepos.size() );
+    }
+
+    public void testNewResolveArtifactProjectBuildingRequestRemoteRepositoriesContents()
+            throws NoSuchFieldException, IllegalAccessException
+    {
+        AbstractDependencyMojo mojo = createConcreteDependencyMojoWithArtifactRepositories( session, artifactRepos );
+
+        ProjectBuildingRequest pbr = mojo.newResolveArtifactProjectBuildingRequest();
+        List<ArtifactRepository> rrepos = pbr.getRemoteRepositories();
+
+        assertEquals( "ar-central", rrepos.get( 0 ).getId() );
+        assertEquals( "ar-snapshots", rrepos.get( 1 ).getId() );
+        assertEquals( "ar-staging", rrepos.get( 2 ).getId() );
+    }
+
+    public void testNewResolvePluginProjectBuildingRequestRemoteRepositoriesSize()
+            throws NoSuchFieldException, IllegalAccessException
+    {
+        AbstractDependencyMojo mojo = createConcreteDependencyMojoWithPluginRepositories( session, pluginRepos );
+
+        ProjectBuildingRequest pbr = mojo.newResolvePluginProjectBuildingRequest();
+        List<ArtifactRepository> rrepos = pbr.getRemoteRepositories();
+
+        assertEquals( 2, rrepos.size() );
+    }
+
+    public void testNewResolvePluginProjectBuildingRequestRemoteRepositoriesContents()
+            throws NoSuchFieldException, IllegalAccessException
+    {
+        AbstractDependencyMojo mojo = createConcreteDependencyMojoWithPluginRepositories( session, pluginRepos );
+
+        ProjectBuildingRequest pbr = mojo.newResolvePluginProjectBuildingRequest();
+        List<ArtifactRepository> rrepos = pbr.getRemoteRepositories();
+
+        assertEquals( "pr-central", rrepos.get( 0 ).getId() );
+        assertEquals( "pr-plugins", rrepos.get( 1 ).getId() );
+    }
+}
\ No newline at end of file