Skip to content
Original file line number Diff line number Diff line change
Expand Up @@ -90,6 +90,12 @@ public abstract class AbstractDependencyMojo
@Parameter( defaultValue = "${project.remoteArtifactRepositories}", readonly = true, required = true )
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.
*/
Expand Down Expand Up @@ -345,11 +351,25 @@ private void silenceUnarchiver( UnArchiver unArchiver )
* repositories, used to resolve artifacts.
*/
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;
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -20,11 +20,11 @@
*/

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;
Expand All @@ -49,7 +49,6 @@
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.
Expand Down Expand Up @@ -101,25 +100,32 @@ protected Set<Artifact> resolveDependencyArtifacts()
{
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(
Expand Down Expand Up @@ -164,15 +170,14 @@ protected Set<Artifact> resolvePluginArtifacts()
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 )
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -21,17 +21,13 @@

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;
Expand All @@ -51,12 +47,6 @@ public class ResolvePluginsMojo
extends AbstractResolveMojo
{

/**
* 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.
*
Expand Down Expand Up @@ -194,10 +184,7 @@ protected Set<Artifact> resolvePluginArtifacts()
// 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() );
Expand Down
Original file line number Diff line number Diff line change
@@ -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() );
}
}