Using Resolver in Maven Plugins

Apache Maven 3.x uses Resolver (formerly Aether) for repository tasks, and Maven plugins that target Maven 3.x can do so as well. To start, add the following dependencies to the plugin POM:

<project>
  ...
  <prerequisites>
    <!-- Maven 3.1.0 is the earliest version using Eclipse Aether, Maven 3.0.x uses the incompatible predecessor Sonatype Aether -->
    <maven>3.1</maven>
  </prerequisites>

  <dependencies>
    <dependency>
      <!-- required in all cases -->
      <groupId>org.apache.maven.resolver</groupId>
      <artifactId>maven-resolver-api</artifactId>
      <version>1.9.22</version>
      <scope>provided</scope>
    </dependency>
    <dependency>
      <!-- optional helpers, might be superfluous depending on your use case -->
      <groupId>org.apache.maven.resolver</groupId>
      <artifactId>maven-resolver-util</artifactId>
      <version>1.9.22</version>
      <!-- Scope: use compile to make plugin work in Maven 3.8 and earlier -->
      <scope>compile</scope>
    </dependency>
    ...
  </dependencies>
  ...
</project>

Note: At runtime, the actual version of maven-resolver-api added to the classpath is set by the Maven core so be sure to compile/test your plugin against the version of maven-resolver-api that is used by the minimum version of Maven that your plugin wants to support.

Next, in your mojo source, you need to inject the repository related components and parameters:

import org.eclipse.aether.RepositorySystem;
import org.eclipse.aether.RepositorySystemSession;
import org.eclipse.aether.repository.RemoteRepository;
...

public class MyMojo extends AbstractMojo
{

    /**
     * The current repository/network configuration of Maven.
     */
    @Parameter(defaultValue="${repositorySystemSession}", readonly = true)
    private RepositorySystemSession repositorySystemSession;

    /**
     * The project's remote repositories to use for the resolution of project dependencies.
     */
    @Parameter(defaultValue = "${project.remoteProjectRepositories}", readonly = true)
    private List<RemoteRepository> remoteProjectRepositories;

    /**
     * The project's remote repositories to use for the resolution of plugins and their dependencies.
     */
    @Parameter(defaultValue = "${project.remotePluginRepositories}", readonly = true)
    private List<RemoteRepository> remotePluginRepositories;


    /**
     * The entry point to the resolver (a.k.a. Aether); that is, the component doing all the work.
     */
    private final RepositorySystem repositorySystem;
    
    @Inject
    public MyMojo(RepositorySystem repositorySystem) {
        this.repositorySystem = repositorySystem;
    }
    
    // Your other mojo parameters and code here
    ...
}

Usually you only need one of remoteProjectRepositories or remotePluginRepositories, depending on the nature of the artifacts your plugin is dealing with. The other plugin parameter is superfluous. In general, the code shown above should give you all the handles that you need to use the resolver from within a Maven plugin.