You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@maven.apache.org by cs...@apache.org on 2022/07/12 13:11:29 UTC

[maven-deploy-plugin] branch master updated: [MDEPLOY-296] Streamline plugin (#26)

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

cstamas pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/maven-deploy-plugin.git


The following commit(s) were added to refs/heads/master by this push:
     new 16541da  [MDEPLOY-296] Streamline plugin (#26)
16541da is described below

commit 16541da43c51237cf7183c4500a576108ad946b8
Author: Tamas Cservenak <ta...@cservenak.net>
AuthorDate: Tue Jul 12 15:11:25 2022 +0200

    [MDEPLOY-296] Streamline plugin (#26)
    
    Original plugin made hoops and loops, instead to perform what it needed to perform. Partly to blame this was unfinished state of MAT API (it was able to install project only).
    
    Deploying project is needed in DeployMojo, but DeployFileMojo was forced to make hoops and loops due this, as it was passed one file (and maybe pomFile), and it was forced to create "fake" project, decorate and fake setup it with all whistle and bells, only to get it via MAT to resolver that would "decompose" it back into set of artifacts needing a deploy. So it went this file-artifact-project-artifact route, that made all the logic fragile and overly complicated.
    
    This PR completely reworks m-deploy-p making it (almost trivially) simple: it does what it needs to do, without any fuss, and does it in streamlined way: No fuss, no magic, no fake project building etc.
---
 pom.xml                                            |  14 +-
 .../maven/plugins/deploy/AbstractDeployMojo.java   | 111 ++++++--
 .../maven/plugins/deploy/DeployFileMojo.java       | 302 ++++++++++-----------
 .../apache/maven/plugins/deploy/DeployMojo.java    | 158 ++++++-----
 .../maven/plugins/deploy/DeployFileMojoTest.java   |   5 +-
 .../plugins/deploy/DeployFileMojoUnitTest.java     |  33 ++-
 .../maven/plugins/deploy/DeployMojoTest.java       | 145 +++++-----
 .../plugins/deploy/stubs/ArtifactDeployerStub.java |  47 ----
 8 files changed, 407 insertions(+), 408 deletions(-)

diff --git a/pom.xml b/pom.xml
index 1284f13..385b4d9 100644
--- a/pom.xml
+++ b/pom.xml
@@ -63,10 +63,10 @@ under the License.
   </distributionManagement>
 
   <properties>
+    <javaVersion>7</javaVersion>
     <mavenVersion>3.2.5</mavenVersion>
     <slf4jVersion>1.7.5</slf4jVersion> <!-- Keep in sync with resolver used in maven above -->
     <resolverVersion>1.0.0.v20140518</resolverVersion> <!-- Keep in sync with resolver used in maven above -->
-    <javaVersion>7</javaVersion>
     <project.build.outputTimestamp>2021-12-27T14:11:19Z</project.build.outputTimestamp>
   </properties>
 
@@ -102,16 +102,6 @@ under the License.
       <version>${slf4jVersion}</version>
       <scope>provided</scope>
     </dependency>
-    <dependency>
-      <groupId>org.apache.maven.shared</groupId>
-      <artifactId>maven-artifact-transfer</artifactId>
-      <version>0.13.1</version>
-    </dependency>
-    <dependency>
-      <groupId>commons-io</groupId>
-      <artifactId>commons-io</artifactId>
-      <version>2.6</version>
-    </dependency>
     <dependency>
       <groupId>org.codehaus.plexus</groupId>
       <artifactId>plexus-utils</artifactId>
@@ -121,11 +111,13 @@ under the License.
       <groupId>org.eclipse.aether</groupId>
       <artifactId>aether-api</artifactId>
       <version>${resolverVersion}</version>
+      <scope>provided</scope>
     </dependency>
     <dependency>
       <groupId>org.eclipse.aether</groupId>
       <artifactId>aether-util</artifactId>
       <version>${resolverVersion}</version>
+      <scope>compile</scope> <!-- To work in Maven versions older than 3.9.0 -->
     </dependency>
 
     <!-- dependencies to annotations -->
diff --git a/src/main/java/org/apache/maven/plugins/deploy/AbstractDeployMojo.java b/src/main/java/org/apache/maven/plugins/deploy/AbstractDeployMojo.java
index 3939a8e..4a66ecd 100644
--- a/src/main/java/org/apache/maven/plugins/deploy/AbstractDeployMojo.java
+++ b/src/main/java/org/apache/maven/plugins/deploy/AbstractDeployMojo.java
@@ -19,16 +19,18 @@ package org.apache.maven.plugins.deploy;
  * under the License.
  */
 
-import org.apache.maven.artifact.repository.ArtifactRepository;
-import org.apache.maven.artifact.repository.ArtifactRepositoryPolicy;
-import org.apache.maven.artifact.repository.MavenArtifactRepository;
-import org.apache.maven.artifact.repository.layout.DefaultRepositoryLayout;
 import org.apache.maven.execution.MavenSession;
 import org.apache.maven.plugin.AbstractMojo;
+import org.apache.maven.plugin.MojoExecutionException;
 import org.apache.maven.plugin.MojoFailureException;
 import org.apache.maven.plugins.annotations.Component;
 import org.apache.maven.plugins.annotations.Parameter;
 import org.apache.maven.rtinfo.RuntimeInformation;
+import org.eclipse.aether.RepositorySystem;
+import org.eclipse.aether.RepositorySystemSession;
+import org.eclipse.aether.deployment.DeployRequest;
+import org.eclipse.aether.deployment.DeploymentException;
+import org.eclipse.aether.repository.RemoteRepository;
 import org.eclipse.aether.util.version.GenericVersionScheme;
 import org.eclipse.aether.version.InvalidVersionSpecificationException;
 import org.eclipse.aether.version.Version;
@@ -37,9 +39,8 @@ import org.eclipse.aether.version.Version;
  * Abstract class for Deploy mojo's.
  */
 public abstract class AbstractDeployMojo
-    extends AbstractMojo
+        extends AbstractMojo
 {
-
     /**
      * Flag whether Maven is currently in online/offline mode.
      */
@@ -49,17 +50,20 @@ public abstract class AbstractDeployMojo
     /**
      * Parameter used to control how many times a failed deployment will be retried before giving up and failing. If a
      * value outside the range 1-10 is specified it will be pulled to the nearest value within the range 1-10.
-     * 
+     *
      * @since 2.7
      */
     @Parameter( property = "retryFailedDeploymentCount", defaultValue = "1" )
     private int retryFailedDeploymentCount;
 
+    @Component
+    private RuntimeInformation runtimeInformation;
+
     @Parameter( defaultValue = "${session}", readonly = true, required = true )
-    private MavenSession session;
+    protected MavenSession session;
 
     @Component
-    private RuntimeInformation runtimeInformation;
+    protected RepositorySystem repositorySystem;
 
     private static final String AFFECTED_MAVEN_PACKAGING = "maven-plugin";
 
@@ -68,7 +72,7 @@ public abstract class AbstractDeployMojo
     /* Setters and Getters */
 
     void failIfOffline()
-        throws MojoFailureException
+            throws MojoFailureException
     {
         if ( offline )
         {
@@ -76,22 +80,9 @@ public abstract class AbstractDeployMojo
         }
     }
 
-    int getRetryFailedDeploymentCount()
-    {
-        return retryFailedDeploymentCount;
-    }
-
-    protected ArtifactRepository createDeploymentArtifactRepository( String id, String url )
-    {
-        return new MavenArtifactRepository( id, url, new DefaultRepositoryLayout(), new ArtifactRepositoryPolicy(),
-                                            new ArtifactRepositoryPolicy() );
-    }
-    
-    protected final MavenSession getSession()
-    {
-        return session;
-    }
-
+    /**
+     * If this plugin used in pre-3.9.0 Maven, the packaging {@code maven-plugin} will not deploy G level metadata.
+     */
     protected void warnIfAffectedPackagingAndMaven( final String packaging )
     {
         if ( AFFECTED_MAVEN_PACKAGING.equals( packaging ) )
@@ -116,4 +107,72 @@ public abstract class AbstractDeployMojo
             }
         }
     }
+
+    /**
+     * Creates resolver {@link RemoteRepository} equipped with needed whistles and bells.
+     */
+    protected RemoteRepository getRemoteRepository( final String repositoryId, final String url )
+    {
+        RemoteRepository result = new RemoteRepository.Builder( repositoryId, "default", url ).build();
+
+        if ( result.getAuthentication() == null || result.getProxy() == null )
+        {
+            RemoteRepository.Builder builder = new RemoteRepository.Builder( result );
+
+            if ( result.getAuthentication() == null )
+            {
+                builder.setAuthentication( session.getRepositorySession().getAuthenticationSelector()
+                        .getAuthentication( result ) );
+            }
+
+            if ( result.getProxy() == null )
+            {
+                builder.setProxy( session.getRepositorySession().getProxySelector().getProxy( result ) );
+            }
+
+            result = builder.build();
+        }
+
+        return result;
+    }
+
+    /**
+     * Handles high level retries (this was buried into MAT).
+     */
+    protected void deploy( RepositorySystemSession session, DeployRequest deployRequest ) throws MojoExecutionException
+    {
+        int retryFailedDeploymentCounter = Math.max( 1, Math.min( 10, retryFailedDeploymentCount ) );
+        DeploymentException exception = null;
+        for ( int count = 0; count < retryFailedDeploymentCounter; count++ )
+        {
+            try
+            {
+                if ( count > 0 )
+                {
+                    getLog().info( "Retrying deployment attempt " + ( count + 1 ) + " of "
+                            + retryFailedDeploymentCounter );
+                }
+
+                repositorySystem.deploy( session, deployRequest );
+                exception = null;
+                break;
+            }
+            catch ( DeploymentException e )
+            {
+                if ( count + 1 < retryFailedDeploymentCounter )
+                {
+                    getLog().warn( "Encountered issue during deployment: " + e.getLocalizedMessage() );
+                    getLog().debug( e );
+                }
+                if ( exception == null )
+                {
+                    exception = e;
+                }
+            }
+        }
+        if ( exception != null )
+        {
+            throw new MojoExecutionException( exception.getMessage(), exception );
+        }
+    }
 }
diff --git a/src/main/java/org/apache/maven/plugins/deploy/DeployFileMojo.java b/src/main/java/org/apache/maven/plugins/deploy/DeployFileMojo.java
index 12267e7..5d95043 100644
--- a/src/main/java/org/apache/maven/plugins/deploy/DeployFileMojo.java
+++ b/src/main/java/org/apache/maven/plugins/deploy/DeployFileMojo.java
@@ -27,44 +27,34 @@ import java.io.InputStream;
 import java.io.OutputStream;
 import java.io.Reader;
 import java.io.Writer;
-import java.util.ArrayList;
 import java.util.Enumeration;
-import java.util.List;
+import java.util.Objects;
 import java.util.jar.JarEntry;
 import java.util.jar.JarFile;
 import java.util.regex.Pattern;
 
-import org.apache.maven.artifact.Artifact;
-import org.apache.maven.artifact.repository.ArtifactRepository;
 import org.apache.maven.model.Model;
 import org.apache.maven.model.Parent;
-import org.apache.maven.model.building.ModelBuildingException;
-import org.apache.maven.model.building.ModelSource;
-import org.apache.maven.model.building.StringModelSource;
 import org.apache.maven.model.io.xpp3.MavenXpp3Reader;
 import org.apache.maven.model.io.xpp3.MavenXpp3Writer;
 import org.apache.maven.plugin.MojoExecutionException;
 import org.apache.maven.plugin.MojoFailureException;
-import org.apache.maven.plugins.annotations.Component;
 import org.apache.maven.plugins.annotations.Mojo;
 import org.apache.maven.plugins.annotations.Parameter;
-import org.apache.maven.project.DefaultProjectBuildingRequest;
-import org.apache.maven.project.MavenProject;
-import org.apache.maven.project.MavenProjectHelper;
-import org.apache.maven.project.ProjectBuilder;
-import org.apache.maven.project.ProjectBuildingException;
-import org.apache.maven.project.artifact.ProjectArtifactMetadata;
-import org.apache.maven.shared.transfer.artifact.DefaultArtifactCoordinate;
-import org.apache.maven.shared.transfer.artifact.deploy.ArtifactDeployer;
-import org.apache.maven.shared.transfer.artifact.deploy.ArtifactDeployerException;
-import org.apache.maven.shared.transfer.repository.RepositoryManager;
-import org.apache.maven.shared.utils.Os;
 import org.codehaus.plexus.util.FileUtils;
 import org.codehaus.plexus.util.IOUtil;
 import org.codehaus.plexus.util.ReaderFactory;
 import org.codehaus.plexus.util.StringUtils;
 import org.codehaus.plexus.util.WriterFactory;
 import org.codehaus.plexus.util.xml.pull.XmlPullParserException;
+import org.eclipse.aether.RepositorySystemSession;
+import org.eclipse.aether.artifact.Artifact;
+import org.eclipse.aether.artifact.ArtifactType;
+import org.eclipse.aether.artifact.DefaultArtifact;
+import org.eclipse.aether.deployment.DeployRequest;
+import org.eclipse.aether.deployment.DeploymentException;
+import org.eclipse.aether.repository.RemoteRepository;
+import org.eclipse.aether.util.artifact.SubArtifact;
 
 /**
  * Installs the artifact in the remote repository.
@@ -75,21 +65,6 @@ import org.codehaus.plexus.util.xml.pull.XmlPullParserException;
 public class DeployFileMojo
     extends AbstractDeployMojo
 {
-    @Component
-    private ArtifactDeployer artifactDeployer;
-
-    /**
-     * Used for attaching the artifacts to deploy to the project.
-     */
-    @Component
-    private MavenProjectHelper projectHelper;
-
-    /**
-     * Used for creating the project to which the artifacts to deploy will be attached.
-     */
-    @Component
-    private ProjectBuilder projectBuilder;
-
     /**
      * GroupId of the artifact to be deployed. Retrieved from POM file if specified.
      */
@@ -177,16 +152,6 @@ public class DeployFileMojo
     @Parameter( property = "classifier" )
     private String classifier;
 
-    /**
-     * Whether to deploy snapshots with a unique version or not.
-     * 
-     * @deprecated As of Maven 3, this isn't supported anymore and this parameter is only present to break the build if
-     *             you use it!
-     */
-    @Parameter( property = "uniqueVersion" )
-    @Deprecated
-    private Boolean uniqueVersion;
-
     /**
      * A comma separated list of types for each of the extra side artifacts to deploy. If there is a mis-match in the
      * number of entries in {@link #files} or {@link #classifiers}, then an error will be raised.
@@ -208,9 +173,6 @@ public class DeployFileMojo
     @Parameter( property = "files" )
     private String files;
 
-    @Component
-    private RepositoryManager repoManager;
-
     void initProperties()
         throws MojoExecutionException
     {
@@ -303,22 +265,13 @@ public class DeployFileMojo
 
         if ( packaging == null && file != null )
         {
-            packaging = FileUtils.getExtension( file.getName() );
+            packaging = getExtension( file );
         }
     }
 
     public void execute()
         throws MojoExecutionException, MojoFailureException
     {
-        if ( uniqueVersion != null )
-        {
-            throw new MojoExecutionException( "You are using 'uniqueVersion' which has been removed"
-                + " from the maven-deploy-plugin. "
-                + "Please see the >>Major Version Upgrade to version 3.0.0<< on the plugin site." );
-        }
-
-        failIfOffline();
-
         if ( !file.exists() )
         {
             throw new MojoExecutionException( file.getPath() + " not found." );
@@ -326,68 +279,86 @@ public class DeployFileMojo
 
         initProperties();
 
-        ArtifactRepository deploymentRepository = createDeploymentArtifactRepository( repositoryId, url );
-
-        String protocol = deploymentRepository.getProtocol();
+        RemoteRepository remoteRepository = getRemoteRepository( repositoryId, url );
 
-        if ( StringUtils.isEmpty( protocol ) )
+        if ( StringUtils.isEmpty( remoteRepository.getProtocol() ) )
         {
             throw new MojoExecutionException( "No transfer protocol found." );
         }
 
-        MavenProject project = createMavenProject();
-        Artifact artifact = project.getArtifact();
+        if ( groupId == null || artifactId == null || version == null || packaging == null )
+        {
+            throw new MojoExecutionException( "The artifact information is incomplete: 'groupId', 'artifactId', "
+                    + "'version' and 'packaging' are required." );
+        }
 
-        if ( file.equals( getLocalRepoFile() ) )
+        if ( !isValidId( groupId )
+                || !isValidId( artifactId )
+                || !isValidVersion( version ) )
         {
-            throw new MojoFailureException( "Cannot deploy artifact from the local repository: " + file );
+            throw new MojoExecutionException( "The artifact information is not valid: uses invalid characters." );
         }
 
-        List<Artifact> deployableArtifacts = new ArrayList<Artifact>();
+        failIfOffline();
+        warnIfAffectedPackagingAndMaven( packaging );
 
-        if ( classifier == null )
+        DeployRequest deployRequest = new DeployRequest();
+        deployRequest.setRepository( remoteRepository );
+
+        boolean isFilePom = classifier == null && "pom".equals( packaging );
+        if ( !isFilePom )
         {
-            artifact.setFile( file );
-            deployableArtifacts.add( artifact );
+            ArtifactType artifactType = session.getRepositorySession().getArtifactTypeRegistry().get( packaging );
+            if ( artifactType != null
+                    && StringUtils.isEmpty( classifier )
+                    && !StringUtils.isEmpty( artifactType.getClassifier() ) )
+            {
+                classifier = artifactType.getClassifier();
+            }
         }
-        else
+        Artifact mainArtifact = new DefaultArtifact(
+                groupId,
+                artifactId,
+                classifier,
+                isFilePom ? "pom" : getExtension( file ),
+                version
+        ).setFile( file );
+        deployRequest.addArtifact( mainArtifact );
+
+        File artifactLocalFile = getLocalRepositoryFile( session.getRepositorySession(), mainArtifact );
+
+        if ( file.equals( artifactLocalFile ) )
         {
-            projectHelper.attachArtifact( project, packaging, classifier, file );
+            throw new MojoFailureException( "Cannot deploy artifact from the local repository: " + file );
         }
 
-        // Upload the POM if requested, generating one if need be
+        File temporaryPom = null;
         if ( !"pom".equals( packaging ) )
         {
-            File pom = pomFile;
-            if ( pom == null && generatePom )
+            if ( pomFile != null )
             {
-                pom = generatePomFile();
+                deployRequest.addArtifact( new SubArtifact( mainArtifact, "", "pom", pomFile ) );
             }
-            if ( pom != null )
+            else if ( generatePom )
             {
-                if ( classifier == null )
-                {
-                    ProjectArtifactMetadata metadata = new ProjectArtifactMetadata( artifact, pom );
-                    artifact.addMetadata( metadata );
-                }
-                else
-                {
-                    artifact.setFile( pom );
-                    deployableArtifacts.add( artifact );
-                }
+                temporaryPom = generatePomFile();
+                getLog().debug( "Deploying generated POM" );
+                deployRequest.addArtifact( new SubArtifact( mainArtifact, "", "pom", temporaryPom ) );
+            }
+            else
+            {
+                getLog().debug( "Skipping deploying POM" );
             }
         }
 
-        artifact.setRepository( deploymentRepository );
-
         if ( sources != null )
         {
-            projectHelper.attachArtifact( project, "jar", "sources", sources );
+            deployRequest.addArtifact( new SubArtifact( mainArtifact, "sources", "jar", sources ) );
         }
 
         if ( javadoc != null )
         {
-            projectHelper.attachArtifact( project, "jar", "javadoc", javadoc );
+            deployRequest.addArtifact( new SubArtifact( mainArtifact, "javadoc", "jar", javadoc ) );
         }
 
         if ( files != null )
@@ -406,12 +377,12 @@ public class DeployFileMojo
             if ( typesLength != filesLength )
             {
                 throw new MojoExecutionException( "You must specify the same number of entries in 'files' and "
-                    + "'types' (respectively " + filesLength + " and " + typesLength + " entries )" );
+                        + "'types' (respectively " + filesLength + " and " + typesLength + " entries )" );
             }
             if ( classifiersLength != filesLength )
             {
                 throw new MojoExecutionException( "You must specify the same number of entries in 'files' and "
-                    + "'classifiers' (respectively " + filesLength + " and " + classifiersLength + " entries )" );
+                        + "'classifiers' (respectively " + filesLength + " and " + classifiersLength + " entries )" );
             }
             int fi = 0;
             int ti = 0;
@@ -437,19 +408,21 @@ public class DeployFileMojo
                 if ( !file.isFile() )
                 {
                     // try relative to the project basedir just in case
-                    file = new File( project.getBasedir(), files.substring( fi, nfi ) );
+                    file = new File( files.substring( fi, nfi ) );
                 }
                 if ( file.isFile() )
                 {
-                    if ( StringUtils.isWhitespace( classifiers.substring( ci, nci ) ) )
+                    String extension = getExtension( file );
+                    ArtifactType artifactType = session.getRepositorySession().getArtifactTypeRegistry()
+                            .get( types.substring( ti, nti ).trim() );
+                    if ( artifactType != null && !Objects.equals( extension, artifactType.getExtension() ) )
                     {
-                        projectHelper.attachArtifact( project, types.substring( ti, nti ).trim(), file );
-                    }
-                    else
-                    {
-                        projectHelper.attachArtifact( project, types.substring( ti, nti ).trim(),
-                                                      classifiers.substring( ci, nci ).trim(), file );
+                        extension = artifactType.getExtension();
                     }
+
+                    deployRequest.addArtifact(
+                            new SubArtifact( mainArtifact, classifiers.substring( ci, nci ).trim(), extension, file )
+                    );
                 }
                 else
                 {
@@ -472,80 +445,32 @@ public class DeployFileMojo
             }
         }
 
-        List<Artifact> attachedArtifacts = project.getAttachedArtifacts();
-
-        for ( Artifact attached : attachedArtifacts )
-        {
-            deployableArtifacts.add( attached );
-        }
-
         try
         {
-            warnIfAffectedPackagingAndMaven( packaging );
-            artifactDeployer.deploy( getSession().getProjectBuildingRequest(), deploymentRepository,
-                                     deployableArtifacts );
+            repositorySystem.deploy( session.getRepositorySession(), deployRequest );
         }
-        catch ( ArtifactDeployerException e )
+        catch ( DeploymentException e )
         {
             throw new MojoExecutionException( e.getMessage(), e );
         }
-    }
-
-    /**
-     * Creates a Maven project in-memory from the user-supplied groupId, artifactId and version. When a classifier is
-     * supplied, the packaging must be POM because the project with only have attachments. This project serves as basis
-     * to attach the artifacts to deploy to.
-     * 
-     * @return The created Maven project, never <code>null</code>.
-     * @throws MojoExecutionException When the model of the project could not be built.
-     * @throws MojoFailureException When building the project failed.
-     */
-    private MavenProject createMavenProject()
-        throws MojoExecutionException, MojoFailureException
-    {
-        if ( groupId == null || artifactId == null || version == null || packaging == null )
-        {
-            throw new MojoExecutionException( "The artifact information is incomplete: 'groupId', 'artifactId', "
-                + "'version' and 'packaging' are required." );
-        }
-        ModelSource modelSource =
-            new StringModelSource( "<project>" + "<modelVersion>4.0.0</modelVersion>" + "<groupId>" + groupId
-                + "</groupId>" + "<artifactId>" + artifactId + "</artifactId>" + "<version>" + version + "</version>"
-                + "<packaging>" + ( classifier == null ? packaging : "pom" ) + "</packaging>" + "</project>" );
-        DefaultProjectBuildingRequest buildingRequest =
-            new DefaultProjectBuildingRequest( getSession().getProjectBuildingRequest() );
-        buildingRequest.setProcessPlugins( false );
-        try
-        {
-            return projectBuilder.build( modelSource, buildingRequest ).getProject();
-        }
-        catch ( ProjectBuildingException e )
+        finally
         {
-            if ( e.getCause() instanceof ModelBuildingException )
+            if ( temporaryPom != null )
             {
-                throw new MojoExecutionException( "The artifact information is not valid:" + Os.LINE_SEP
-                    + e.getCause().getMessage() );
+                // noinspection ResultOfMethodCallIgnored
+                temporaryPom.delete();
             }
-            throw new MojoFailureException( "Unable to create the project.", e );
         }
     }
 
     /**
-     * Gets the path of the artifact constructed from the supplied groupId, artifactId, version, classifier and
-     * packaging within the local repository. Note that the returned path need not exist (yet).
-     * 
-     * @return The absolute path to the artifact when installed, never <code>null</code>.
+     * Gets the path of the specified artifact within the local repository. Note that the returned path need not exist
+     * (yet).
      */
-    private File getLocalRepoFile()
+    private File getLocalRepositoryFile( RepositorySystemSession session, Artifact artifact )
     {
-        DefaultArtifactCoordinate coordinate = new DefaultArtifactCoordinate();
-        coordinate.setGroupId( groupId );
-        coordinate.setArtifactId( artifactId );
-        coordinate.setVersion( version );
-        coordinate.setClassifier( classifier );
-        coordinate.setExtension( packaging );
-        String path = repoManager.getPathForLocalArtifact( getSession().getProjectBuildingRequest(), coordinate );
-        return new File( repoManager.getLocalRepositoryBasedir( getSession().getProjectBuildingRequest() ), path );
+        String path = session.getLocalRepositoryManager().getPathForLocalArtifact( artifact );
+        return new File( session.getLocalRepository().getBasedir(), path );
     }
 
     /**
@@ -737,4 +662,63 @@ public class DeployFileMojo
         this.classifier = classifier;
     }
 
+    // these below should be shared (duplicated in m-install-p, m-deploy-p)
+
+    /**
+     * Specialization of {@link FileUtils#getExtension(String)} that honors various {@code tar.xxx} combinations.
+     */
+    private String getExtension( final File file )
+    {
+        String filename = file.getName();
+        if ( filename.contains( ".tar." ) )
+        {
+            return "tar." + FileUtils.getExtension( filename );
+        }
+        else
+        {
+            return FileUtils.getExtension( filename );
+        }
+    }
+
+    /**
+     * Returns {@code true} if passed in string is "valid Maven ID" (groupId or artifactId).
+     */
+    private boolean isValidId( String id )
+    {
+        if ( id == null )
+        {
+            return false;
+        }
+        for ( int i = 0; i < id.length(); i++ )
+        {
+            char c = id.charAt( i );
+            if ( !( c >= 'a' && c <= 'z' || c >= 'A' && c <= 'Z'
+                    || c >= '0' && c <= '9' || c == '-' || c == '_' || c == '.' ) )
+            {
+                return false;
+            }
+        }
+        return true;
+    }
+
+    private static final String ILLEGAL_VERSION_CHARS = "\\/:\"<>|?*[](){},";
+
+    /**
+     * Returns {@code true} if passed in string is "valid Maven (simple. non range, expression, etc) version".
+     */
+    private boolean isValidVersion( String version )
+    {
+        if ( version == null )
+        {
+            return false;
+        }
+        for ( int i = version.length() - 1; i >= 0; i-- )
+        {
+            if ( ILLEGAL_VERSION_CHARS.indexOf( version.charAt( i ) ) >= 0 )
+            {
+                return false;
+            }
+        }
+        return true;
+    }
 }
diff --git a/src/main/java/org/apache/maven/plugins/deploy/DeployMojo.java b/src/main/java/org/apache/maven/plugins/deploy/DeployMojo.java
index bec6b38..d169ab8 100644
--- a/src/main/java/org/apache/maven/plugins/deploy/DeployMojo.java
+++ b/src/main/java/org/apache/maven/plugins/deploy/DeployMojo.java
@@ -19,26 +19,26 @@ package org.apache.maven.plugins.deploy;
  * under the License.
  */
 
+import java.io.File;
 import java.util.List;
 import java.util.Map;
 import java.util.regex.Matcher;
 import java.util.regex.Pattern;
 
+import org.apache.maven.RepositoryUtils;
 import org.apache.maven.artifact.ArtifactUtils;
-import org.apache.maven.artifact.repository.ArtifactRepository;
 import org.apache.maven.plugin.MojoExecutionException;
 import org.apache.maven.plugin.MojoFailureException;
 import org.apache.maven.plugin.descriptor.PluginDescriptor;
-import org.apache.maven.plugins.annotations.Component;
 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.project.MavenProject;
-import org.apache.maven.project.ProjectBuildingRequest;
-import org.apache.maven.shared.transfer.artifact.deploy.ArtifactDeployerException;
-import org.apache.maven.shared.transfer.project.NoFileAssignedException;
-import org.apache.maven.shared.transfer.project.deploy.ProjectDeployer;
-import org.apache.maven.shared.transfer.project.deploy.ProjectDeployerRequest;
+import org.apache.maven.project.artifact.ProjectArtifact;
+import org.apache.maven.project.artifact.ProjectArtifactMetadata;
+import org.eclipse.aether.deployment.DeployRequest;
+import org.eclipse.aether.repository.RemoteRepository;
+import org.eclipse.aether.util.artifact.SubArtifact;
 
 /**
  * Deploys an artifact to remote repository.
@@ -128,12 +128,6 @@ public class DeployMojo
     @Parameter( property = "maven.deploy.skip", defaultValue = "false" )
     private String skip = Boolean.FALSE.toString();
 
-    /**
-     * Component used to deploy project.
-     */
-    @Component
-    private ProjectDeployer projectDeployer;
-
     private enum State
     {
         SKIPPED, DEPLOYED, TO_BE_DEPLOYED
@@ -175,7 +169,7 @@ public class DeployMojo
 
     private boolean hasState( MavenProject project )
     {
-        Map<String, Object> pluginContext = getSession().getPluginContext( pluginDescriptor, project );
+        Map<String, Object> pluginContext = session.getPluginContext( pluginDescriptor, project );
         return pluginContext.containsKey( DEPLOY_PROCESSED_MARKER );
     }
 
@@ -193,32 +187,23 @@ public class DeployMojo
         else
         {
             failIfOffline();
+            warnIfAffectedPackagingAndMaven( project.getPackaging() );
 
             if ( !deployAtEnd )
             {
-                // CHECKSTYLE_OFF: LineLength
-                // @formatter:off
-                ProjectDeployerRequest pdr = new ProjectDeployerRequest()
-                        .setProject( project )
-                        .setRetryFailedDeploymentCount( getRetryFailedDeploymentCount() )
-                        .setAltReleaseDeploymentRepository( altReleaseDeploymentRepository )
-                        .setAltSnapshotDeploymentRepository( altSnapshotDeploymentRepository )
-                        .setAltDeploymentRepository( altDeploymentRepository );
-                // @formatter:on
-                // CHECKSTYLE_ON: LineLength
-
-                ArtifactRepository repo = getDeploymentRepository( pdr );
-
-                deployProject( getSession().getProjectBuildingRequest(), pdr, repo );
+                deploy( session.getRepositorySession(),
+                        processProject( project,
+                        altSnapshotDeploymentRepository, altReleaseDeploymentRepository, altDeploymentRepository ) );
                 putState( State.DEPLOYED );
             }
             else
             {
-                putState( State.TO_BE_DEPLOYED );
                 putPluginContextValue( DEPLOY_ALT_RELEASE_DEPLOYMENT_REPOSITORY, altReleaseDeploymentRepository );
                 putPluginContextValue( DEPLOY_ALT_SNAPSHOT_DEPLOYMENT_REPOSITORY, altSnapshotDeploymentRepository );
                 putPluginContextValue( DEPLOY_ALT_DEPLOYMENT_REPOSITORY, altDeploymentRepository );
-                getLog().info( "Deferring deploy for " + getProjectReferenceId( project ) + " at end" );
+                putState( State.TO_BE_DEPLOYED );
+                getLog().info( "Deferring deploy for " + project.getGroupId()
+                        + ":" + project.getArtifactId() + ":" + project.getVersion() + " at end" );
             }
         }
 
@@ -226,7 +211,7 @@ public class DeployMojo
         {
             for ( MavenProject reactorProject : reactorProjects )
             {
-                Map<String, Object> pluginContext = getSession().getPluginContext( pluginDescriptor, reactorProject );
+                Map<String, Object> pluginContext = session.getPluginContext( pluginDescriptor, reactorProject );
                 State state = getState( pluginContext );
                 if ( state == State.TO_BE_DEPLOYED )
                 {
@@ -237,26 +222,15 @@ public class DeployMojo
                     String altDeploymentRepository =
                         getPluginContextValue( pluginContext, DEPLOY_ALT_DEPLOYMENT_REPOSITORY );
 
-                    ProjectDeployerRequest pdr = new ProjectDeployerRequest()
-                        .setProject( reactorProject )
-                        .setRetryFailedDeploymentCount( getRetryFailedDeploymentCount() )
-                        .setAltReleaseDeploymentRepository( altReleaseDeploymentRepository )
-                        .setAltSnapshotDeploymentRepository( altSnapshotDeploymentRepository )
-                        .setAltDeploymentRepository( altDeploymentRepository );
-
-                    ArtifactRepository repo = getDeploymentRepository( pdr );
-
-                    deployProject( getSession().getProjectBuildingRequest(), pdr, repo );
+                    deploy( session.getRepositorySession(),
+                            processProject( reactorProject,
+                            altSnapshotDeploymentRepository, altReleaseDeploymentRepository, altDeploymentRepository )
+                    );
                 }
             }
         }
     }
 
-    private String getProjectReferenceId( MavenProject mavenProject )
-    {
-        return mavenProject.getGroupId() + ":" + mavenProject.getArtifactId() + ":" + mavenProject.getVersion();
-    }
-
     private boolean allProjectsMarked()
     {
         for ( MavenProject reactorProject : reactorProjects )
@@ -269,35 +243,89 @@ public class DeployMojo
         return true;
     }
 
-    private void deployProject( ProjectBuildingRequest pbr, ProjectDeployerRequest pir, ArtifactRepository repo )
-        throws MojoFailureException, MojoExecutionException
+    private DeployRequest processProject( final MavenProject project,
+                                          final String altSnapshotDeploymentRepository,
+                                          final String altReleaseDeploymentRepository,
+                                          final String altDeploymentRepository )
+            throws MojoExecutionException, MojoFailureException
     {
-        try
+        DeployRequest request = new DeployRequest();
+        request.setRepository( getDeploymentRepository( project,
+                altSnapshotDeploymentRepository, altReleaseDeploymentRepository, altDeploymentRepository ) );
+
+        org.apache.maven.artifact.Artifact mavenMainArtifact = project.getArtifact();
+        String packaging = project.getPackaging();
+        File pomFile = project.getFile();
+        boolean isPomArtifact = "pom".equals( packaging );
+        boolean pomArtifactAttached = false;
+
+        if ( pomFile != null )
         {
-            warnIfAffectedPackagingAndMaven( pir.getProject().getPackaging() );
-            projectDeployer.deploy( pbr, pir, repo );
+            request.addArtifact( RepositoryUtils.toArtifact( new ProjectArtifact( project ) ) );
+            pomArtifactAttached = true;
         }
-        catch ( NoFileAssignedException e )
+
+        if ( !isPomArtifact )
         {
-            throw new MojoExecutionException( "NoFileAssignedException", e );
+            File file = mavenMainArtifact.getFile();
+            if ( file != null && file.isFile() )
+            {
+                org.eclipse.aether.artifact.Artifact mainArtifact = RepositoryUtils.toArtifact( mavenMainArtifact );
+                request.addArtifact( mainArtifact );
+
+                if ( !pomArtifactAttached )
+                {
+                    for ( Object metadata : mavenMainArtifact.getMetadataList() )
+                    {
+                        if ( metadata instanceof ProjectArtifactMetadata )
+                        {
+                            request.addArtifact( new SubArtifact(
+                                    mainArtifact,
+                                    "",
+                                    "pom"
+                            ).setFile( ( (ProjectArtifactMetadata) metadata ).getFile() ) );
+                            pomArtifactAttached = true;
+                        }
+                    }
+                }
+            }
+            else if ( !project.getAttachedArtifacts().isEmpty() )
+            {
+                throw new MojoExecutionException( "The packaging plugin for this project did not assign "
+                        + "a main file to the project but it has attachments. Change packaging to 'pom'." );
+            }
+            else
+            {
+                throw new MojoExecutionException( "The packaging for this project did not assign "
+                        + "a file to the build artifact" );
+            }
         }
-        catch ( ArtifactDeployerException e )
+
+        if ( !pomArtifactAttached )
+        {
+            throw new MojoExecutionException( "The POM could not be attached" );
+        }
+
+        for ( org.apache.maven.artifact.Artifact attached : project.getAttachedArtifacts() )
         {
-            throw new MojoExecutionException( "ArtifactDeployerException", e );
+            getLog().debug( "Attaching for install: " + attached.getId() );
+            request.addArtifact( RepositoryUtils.toArtifact( attached ) );
         }
 
+        return request;
     }
 
-    ArtifactRepository getDeploymentRepository( ProjectDeployerRequest pdr )
+    /**
+     * Visible for testing.
+     */
+    RemoteRepository getDeploymentRepository( final MavenProject project,
+                                              final String altSnapshotDeploymentRepository,
+                                              final String altReleaseDeploymentRepository,
+                                              final String altDeploymentRepository )
 
         throws MojoExecutionException, MojoFailureException
     {
-        MavenProject project = pdr.getProject();
-        String altDeploymentRepository = pdr.getAltDeploymentRepository();
-        String altReleaseDeploymentRepository = pdr.getAltReleaseDeploymentRepository();
-        String altSnapshotDeploymentRepository = pdr.getAltSnapshotDeploymentRepository();
-
-        ArtifactRepository repo = null;
+        RemoteRepository repo = null;
 
         String altDeploymentRepo;
         if ( ArtifactUtils.isSnapshot( project.getVersion() ) && altSnapshotDeploymentRepository != null )
@@ -329,7 +357,7 @@ public class DeployMojo
                 {
                     getLog().warn( "Using legacy syntax for alternative repository. "
                             + "Use \"" + id + "::" + url + "\" instead." );
-                    repo = createDeploymentArtifactRepository( id, url );
+                    repo = getRemoteRepository( id, url );
                 }
                 else
                 {
@@ -356,14 +384,14 @@ public class DeployMojo
                     String id = matcher.group( 1 ).trim();
                     String url = matcher.group( 2 ).trim();
 
-                    repo = createDeploymentArtifactRepository( id, url );
+                    repo = getRemoteRepository( id, url );
                 }
             }
         }
 
         if ( repo == null )
         {
-            repo = project.getDistributionManagementArtifactRepository();
+            repo = RepositoryUtils.toRepo( project.getDistributionManagementArtifactRepository() );
         }
 
         if ( repo == null )
diff --git a/src/test/java/org/apache/maven/plugins/deploy/DeployFileMojoTest.java b/src/test/java/org/apache/maven/plugins/deploy/DeployFileMojoTest.java
index 371838b..d853870 100644
--- a/src/test/java/org/apache/maven/plugins/deploy/DeployFileMojoTest.java
+++ b/src/test/java/org/apache/maven/plugins/deploy/DeployFileMojoTest.java
@@ -97,7 +97,8 @@ public class DeployFileMojoTest
         DefaultRepositorySystemSession repositorySession = new DefaultRepositorySystemSession();
         repositorySession.setLocalRepositoryManager( new SimpleLocalRepositoryManagerFactory().newInstance( repositorySession, new LocalRepository( LOCAL_REPO ) ) );
         when( buildingRequest.getRepositorySession() ).thenReturn( repositorySession );
-        
+        when( session.getRepositorySession() ).thenReturn( repositorySession );
+
         String groupId = (String) getVariableValueFromObject( mojo, "groupId" );
 
         String artifactId = (String) getVariableValueFromObject( mojo, "artifactId" );
@@ -199,6 +200,7 @@ public class DeployFileMojoTest
         DefaultRepositorySystemSession repositorySession = new DefaultRepositorySystemSession();
         repositorySession.setLocalRepositoryManager( new SimpleLocalRepositoryManagerFactory().newInstance( repositorySession, new LocalRepository( LOCAL_REPO ) ) );
         when( buildingRequest.getRepositorySession() ).thenReturn( repositorySession );
+        when( session.getRepositorySession() ).thenReturn( repositorySession );
 
         String classifier = ( String ) getVariableValueFromObject( mojo, "classifier" );
 
@@ -248,6 +250,7 @@ public class DeployFileMojoTest
         DefaultRepositorySystemSession repositorySession = new DefaultRepositorySystemSession();
         repositorySession.setLocalRepositoryManager( new SimpleLocalRepositoryManagerFactory().newInstance( repositorySession, new LocalRepository( LOCAL_REPO ) ) );
         when( buildingRequest.getRepositorySession() ).thenReturn( repositorySession );
+        when( session.getRepositorySession() ).thenReturn( repositorySession );
 
         String groupId = (String) getVariableValueFromObject( mojo, "groupId" );
 
diff --git a/src/test/java/org/apache/maven/plugins/deploy/DeployFileMojoUnitTest.java b/src/test/java/org/apache/maven/plugins/deploy/DeployFileMojoUnitTest.java
index 6131f79..a7bbd8b 100644
--- a/src/test/java/org/apache/maven/plugins/deploy/DeployFileMojoUnitTest.java
+++ b/src/test/java/org/apache/maven/plugins/deploy/DeployFileMojoUnitTest.java
@@ -19,36 +19,27 @@ package org.apache.maven.plugins.deploy;
  * under the License.
  */
 
-import junit.framework.Test;
-import junit.framework.TestCase;
-import junit.framework.TestSuite;
 import org.apache.maven.model.Model;
 import org.apache.maven.model.Parent;
 import org.apache.maven.plugin.MojoExecutionException;
+import org.junit.After;
+import org.junit.Before;
+import org.junit.Test;
 
 import java.io.File;
 
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertTrue;
+
 /**
  * @author <a href="jerome@coffeebreaks.org">Jerome Lacoste</a>
  */
 public class DeployFileMojoUnitTest
-    extends TestCase
 {
-    public static void main( String[] args )
-    {
-        junit.textui.TestRunner.run( suite() );
-    }
-
-    public static Test suite()
-    {
-        TestSuite suite = new TestSuite( DeployFileMojoUnitTest.class );
-
-        return suite;
-    }
-
     MockDeployFileMojo mojo;
     Parent parent;
 
+    @Before
     public void setUp()
     {
         Model pomModel = new Model();
@@ -62,12 +53,13 @@ public class DeployFileMojoUnitTest
         mojo = new MockDeployFileMojo( pomModel );
     }
 
+    @After
     public void tearDown()
     {
         mojo = null;
     }
 
-    class MockDeployFileMojo extends DeployFileMojo {
+    static class MockDeployFileMojo extends DeployFileMojo {
         private Model model;
 
         public MockDeployFileMojo(Model model) {
@@ -83,6 +75,7 @@ public class DeployFileMojoUnitTest
         }
     }
 
+    @Test
     public void testProcessPomFromPomFileWithParent1() throws MojoExecutionException
     {
         mojo.setPomFile( new File( "foo.bar" ) );
@@ -98,6 +91,7 @@ public class DeployFileMojoUnitTest
         checkMojoProperties("parentGroup", null, "parentVersion", null);
     }
 
+    @Test
     public void testProcessPomFromPomFileWithParent2() throws MojoExecutionException
     {
         mojo.setPomFile( new File( "foo.bar" ) );
@@ -113,6 +107,7 @@ public class DeployFileMojoUnitTest
 
     }
 
+    @Test
     public void testProcessPomFromPomFileWithParent3() throws MojoExecutionException
     {
         mojo.setPomFile( new File( "foo.bar" ) );
@@ -127,6 +122,7 @@ public class DeployFileMojoUnitTest
         checkMojoProperties( "parentGroup", "artifact", "version", null );
     }
 
+    @Test
     public void testProcessPomFromPomFileWithParent4() throws MojoExecutionException
     {
         mojo.setPomFile( new File( "foo.bar" ) );
@@ -137,6 +133,7 @@ public class DeployFileMojoUnitTest
         checkMojoProperties("parentGroup", "artifact", "version", "packaging");
     }
 
+    @Test
     public void testProcessPomFromPomFileWithParent5() throws MojoExecutionException
     {
         mojo.setPomFile( new File( "foo.bar" ) );
@@ -147,6 +144,7 @@ public class DeployFileMojoUnitTest
         checkMojoProperties("group", "artifact", "version", "packaging");
     }
 
+    @Test
     public void testProcessPomFromPomFileWithParent6() throws MojoExecutionException
     {
         mojo.setPomFile( new File( "foo.bar" ) );
@@ -158,6 +156,7 @@ public class DeployFileMojoUnitTest
 
     }
 
+    @Test
     public void testProcessPomFromPomFileWithOverrides() throws MojoExecutionException
     {
         mojo.setPomFile( new File( "foo.bar" ) );
diff --git a/src/test/java/org/apache/maven/plugins/deploy/DeployMojoTest.java b/src/test/java/org/apache/maven/plugins/deploy/DeployMojoTest.java
index c8350c4..f34abd0 100644
--- a/src/test/java/org/apache/maven/plugins/deploy/DeployMojoTest.java
+++ b/src/test/java/org/apache/maven/plugins/deploy/DeployMojoTest.java
@@ -20,6 +20,7 @@ package org.apache.maven.plugins.deploy;
  */
 
 import static org.mockito.ArgumentMatchers.any;
+import static org.mockito.Mockito.doReturn;
 import static org.mockito.Mockito.mock;
 import static org.mockito.Mockito.spy;
 import static org.mockito.Mockito.when;
@@ -31,25 +32,23 @@ import java.util.List;
 import java.util.Properties;
 import java.util.concurrent.ConcurrentHashMap;
 
-import org.apache.maven.artifact.repository.ArtifactRepository;
 import org.apache.maven.execution.MavenSession;
 import org.apache.maven.plugin.MojoExecutionException;
 import org.apache.maven.plugin.MojoFailureException;
 import org.apache.maven.plugin.descriptor.PluginDescriptor;
 import org.apache.maven.plugin.testing.AbstractMojoTestCase;
 import org.apache.maven.plugin.testing.stubs.MavenProjectStub;
-import org.apache.maven.plugins.deploy.stubs.ArtifactDeployerStub;
 import org.apache.maven.plugins.deploy.stubs.ArtifactRepositoryStub;
 import org.apache.maven.plugins.deploy.stubs.DeployArtifactStub;
 import org.apache.maven.project.MavenProject;
 import org.apache.maven.project.ProjectBuildingRequest;
-import org.apache.maven.shared.transfer.project.deploy.ProjectDeployerRequest;
 import org.codehaus.plexus.util.FileUtils;
 import org.eclipse.aether.DefaultRepositorySystemSession;
+import org.eclipse.aether.RepositorySystem;
 import org.eclipse.aether.repository.LocalRepository;
+import org.eclipse.aether.repository.RemoteRepository;
 import org.junit.Ignore;
 import org.mockito.InjectMocks;
-import org.mockito.Mock;
 import org.mockito.MockitoAnnotations;
 import org.eclipse.aether.internal.impl.SimpleLocalRepositoryManagerFactory;
 
@@ -84,6 +83,9 @@ public class DeployMojoTest
         session = mock( MavenSession.class );
         when( session.getPluginContext(any(PluginDescriptor.class), any(MavenProject.class)))
                 .thenReturn( new ConcurrentHashMap<String, Object>() );
+        DefaultRepositorySystemSession repositorySession = new DefaultRepositorySystemSession();
+        repositorySession.setLocalRepositoryManager( new SimpleLocalRepositoryManagerFactory().newInstance( repositorySession, new LocalRepository( LOCAL_REPO ) ) );
+        when( session.getRepositorySession() ).thenReturn( repositorySession );
 
         remoteRepo = new File( REMOTE_REPO );
         
@@ -100,8 +102,6 @@ public class DeployMojoTest
         {
             FileUtils.deleteDirectory( remoteRepo );
         }
-        
-        
     }
 
     public void tearDown()
@@ -136,13 +136,14 @@ public class DeployMojoTest
         MockitoAnnotations.initMocks( this );
         
         assertNotNull( mojo );
-        
+
         ProjectBuildingRequest buildingRequest = mock ( ProjectBuildingRequest.class );
         when( session.getProjectBuildingRequest() ).thenReturn( buildingRequest );
         DefaultRepositorySystemSession repositorySession = new DefaultRepositorySystemSession();
         repositorySession.setLocalRepositoryManager( new SimpleLocalRepositoryManagerFactory().newInstance( repositorySession, new LocalRepository( LOCAL_REPO ) ) );
         when( buildingRequest.getRepositorySession() ).thenReturn( repositorySession );
-        
+        when( session.getRepositorySession() ).thenReturn( repositorySession );
+
         File file = new File( getBasedir(),
                               "target/test-classes/unit/basic-deploy-test/target/" +
                               "deploy-test-file-1.0-SNAPSHOT.jar" );
@@ -150,6 +151,9 @@ public class DeployMojoTest
         assertTrue( file.exists() );
 
         MavenProject project = (MavenProject) getVariableValueFromObject( mojo, "project" );
+        project.setGroupId( "org.apache.maven.test" );
+        project.setArtifactId( "maven-deploy-test" );
+        project.setVersion( "1.0-SNAPSHOT" );
 
         setVariableValueToObject( mojo, "pluginContext", new ConcurrentHashMap<>() );
         setVariableValueToObject( mojo, "reactorProjects", Collections.singletonList( project ) );
@@ -317,6 +321,7 @@ public class DeployMojoTest
         DefaultRepositorySystemSession repositorySession = new DefaultRepositorySystemSession();
         repositorySession.setLocalRepositoryManager( new SimpleLocalRepositoryManagerFactory().newInstance( repositorySession, new LocalRepository( LOCAL_REPO ) ) );
         when( buildingRequest.getRepositorySession() ).thenReturn( repositorySession );
+        when( session.getRepositorySession() ).thenReturn( repositorySession );
         
         File pomFile = new File( getBasedir(),
                               "target/test-classes/unit/basic-deploy-pom/target/" +
@@ -325,6 +330,9 @@ public class DeployMojoTest
         assertTrue( pomFile.exists() );
         
         MavenProject project = (MavenProject) getVariableValueFromObject( mojo, "project" );
+        project.setGroupId( "org.apache.maven.test" );
+        project.setArtifactId( "maven-deploy-test" );
+        project.setVersion( "1.0-SNAPSHOT" );
 
         setVariableValueToObject( mojo, "pluginContext", new ConcurrentHashMap<>() );
         setVariableValueToObject( mojo, "reactorProjects", Collections.singletonList( project ) );
@@ -391,6 +399,9 @@ public class DeployMojoTest
         assertNotNull( mojo );
         
         MavenProject project = (MavenProject) getVariableValueFromObject( mojo, "project" );
+        project.setGroupId( "org.apache.maven.test" );
+        project.setArtifactId( "maven-deploy-test" );
+        project.setVersion( "1.0-SNAPSHOT" );
 
         setVariableValueToObject( mojo, "pluginContext", new ConcurrentHashMap<>() );
         setVariableValueToObject( mojo, "reactorProjects", Collections.singletonList( project ) );
@@ -431,8 +442,12 @@ public class DeployMojoTest
         DefaultRepositorySystemSession repositorySession = new DefaultRepositorySystemSession();
         repositorySession.setLocalRepositoryManager( new SimpleLocalRepositoryManagerFactory().newInstance( repositorySession, new LocalRepository( LOCAL_REPO ) ) );
         when( buildingRequest.getRepositorySession() ).thenReturn( repositorySession );
+        when( session.getRepositorySession() ).thenReturn( repositorySession );
 
         MavenProject project = (MavenProject) getVariableValueFromObject( mojo, "project" );
+        project.setGroupId( "org.apache.maven.test" );
+        project.setArtifactId( "maven-deploy-test" );
+        project.setVersion( "1.0-SNAPSHOT" );
 
         setVariableValueToObject( mojo, "pluginContext", new ConcurrentHashMap<>() );
         setVariableValueToObject( mojo, "reactorProjects", Collections.singletonList( project ) );
@@ -524,9 +539,9 @@ public class DeployMojoTest
         
         assertNotNull( mojo );
         
-        ArtifactDeployerStub deployer = new ArtifactDeployerStub();
+        RepositorySystem repositorySystem = mock( RepositorySystem.class );
         
-        setVariableValueToObject( mojo, "deployer", deployer );
+        setVariableValueToObject( mojo, "repositorySystem", repositorySystem );
         
         File file = new File( getBasedir(),
                               "target/test-classes/unit/basic-deploy-scp/target/" +
@@ -571,42 +586,32 @@ public class DeployMojoTest
     public void testLegacyAltDeploymentRepositoryWithDefaultLayout()
         throws Exception
     {
-        DeployMojo mojo = spy( new DeployMojo() );
+        DeployMojo mojo = new DeployMojo();
 
-        ArtifactRepository repository = mock( ArtifactRepository.class );
-        when( mojo.createDeploymentArtifactRepository( "altDeploymentRepository", "http://localhost"
-        ) ).thenReturn( repository );
+        setVariableValueToObject( mojo, "project", project );
+        setVariableValueToObject( mojo, "session", session );
+        setVariableValueToObject( mojo, "altDeploymentRepository",  "altDeploymentRepository::default::http://localhost" );
 
         project.setVersion( "1.0-SNAPSHOT" );
 
-        ProjectDeployerRequest pdr =
-            new ProjectDeployerRequest()
-                .setProject( project )
-                .setAltDeploymentRepository( "altDeploymentRepository::default::http://localhost" );
-
-        assertEquals( repository,
-                mojo.getDeploymentRepository( pdr ) );
+        assertEquals( new RemoteRepository.Builder( "altDeploymentRepository", "default", "http://localhost" ).build(),
+                mojo.getDeploymentRepository( project, null, null, "altDeploymentRepository::default::http://localhost") );
 
     }
 
     public void testLegacyAltDeploymentRepositoryWithLegacyLayout()
         throws Exception
     {
-        DeployMojo mojo = spy( new DeployMojo() );
+        DeployMojo mojo = new DeployMojo();
 
-        ArtifactRepository repository = mock( ArtifactRepository.class );
-        when( mojo.createDeploymentArtifactRepository( "altDeploymentRepository", "http://localhost"
-        ) ).thenReturn( repository );
+        setVariableValueToObject( mojo, "project", project );
+        setVariableValueToObject( mojo, "session", session );
+        setVariableValueToObject( mojo, "altDeploymentRepository",  "altDeploymentRepository::legacy::http://localhost" );
 
         project.setVersion( "1.0-SNAPSHOT" );
-
-        ProjectDeployerRequest pdr =
-            new ProjectDeployerRequest()
-                .setProject( project )
-                .setAltDeploymentRepository( "altDeploymentRepository::legacy::http://localhost" );
         try
         {
-            mojo.getDeploymentRepository( pdr );
+            mojo.getDeploymentRepository( project, null, null, "altDeploymentRepository::legacy::http://localhost" );
             fail( "Should throw: Invalid legacy syntax and layout for repository." );
         }
         catch( MojoFailureException e )
@@ -619,21 +624,16 @@ public class DeployMojoTest
     public void testInsaneAltDeploymentRepository()
             throws Exception
     {
-        DeployMojo mojo = spy( new DeployMojo() );
+        DeployMojo mojo = new DeployMojo();
 
-        ArtifactRepository repository = mock( ArtifactRepository.class );
-        when( mojo.createDeploymentArtifactRepository( "altDeploymentRepository", "http://localhost"
-        ) ).thenReturn( repository );
+        setVariableValueToObject( mojo, "project", project );
+        setVariableValueToObject( mojo, "session", session );
+        setVariableValueToObject( mojo, "altDeploymentRepository",  "altDeploymentRepository::hey::wow::foo::http://localhost" );
 
         project.setVersion( "1.0-SNAPSHOT" );
-
-        ProjectDeployerRequest pdr =
-                new ProjectDeployerRequest()
-                        .setProject( project )
-                        .setAltDeploymentRepository( "altDeploymentRepository::hey::wow::foo::http://localhost" );
         try
         {
-            mojo.getDeploymentRepository( pdr );
+            mojo.getDeploymentRepository( project, null, null, "altDeploymentRepository::hey::wow::foo::http://localhost" );
             fail( "Should throw: Invalid legacy syntax and layout for repository." );
         }
         catch( MojoFailureException e )
@@ -646,40 +646,29 @@ public class DeployMojoTest
     public void testDefaultScmSvnAltDeploymentRepository()
             throws Exception
     {
-        DeployMojo mojo = spy( new DeployMojo() );
+        DeployMojo mojo = new DeployMojo();
 
-        ArtifactRepository repository = mock( ArtifactRepository.class );
-        when( mojo.createDeploymentArtifactRepository( "altDeploymentRepository", "scm:svn:http://localhost"
-        ) ).thenReturn( repository );
+        setVariableValueToObject( mojo, "project", project );
+        setVariableValueToObject( mojo, "session", session );
+        setVariableValueToObject( mojo, "altDeploymentRepository",  "altDeploymentRepository::default::scm:svn:http://localhost" );
 
         project.setVersion( "1.0-SNAPSHOT" );
 
-        ProjectDeployerRequest pdr =
-                new ProjectDeployerRequest()
-                        .setProject( project )
-                        .setAltDeploymentRepository( "altDeploymentRepository::default::scm:svn:http://localhost" );
-
-        assertEquals( repository,
-                mojo.getDeploymentRepository( pdr ) );
+        assertEquals( new RemoteRepository.Builder( "altDeploymentRepository", "default", "scm:svn:http://localhost" ).build(),
+                mojo.getDeploymentRepository( project, null, null, "altDeploymentRepository::default::scm:svn:http://localhost" ) );
     }
     public void testLegacyScmSvnAltDeploymentRepository()
             throws Exception
     {
-        DeployMojo mojo = spy( new DeployMojo() );
+        DeployMojo mojo = new DeployMojo();
 
-        ArtifactRepository repository = mock( ArtifactRepository.class );
-        when( mojo.createDeploymentArtifactRepository( "altDeploymentRepository", "http://localhost"
-        ) ).thenReturn( repository );
+        setVariableValueToObject( mojo, "project", project );
+        setVariableValueToObject( mojo, "altDeploymentRepository",  "altDeploymentRepository::legacy::scm:svn:http://localhost" );
 
         project.setVersion( "1.0-SNAPSHOT" );
-
-        ProjectDeployerRequest pdr =
-                new ProjectDeployerRequest()
-                        .setProject( project )
-                        .setAltDeploymentRepository( "altDeploymentRepository::legacy::scm:svn:http://localhost" );
         try
         {
-            mojo.getDeploymentRepository( pdr );
+            mojo.getDeploymentRepository( project, null, null, "altDeploymentRepository::legacy::scm:svn:http://localhost" );
             fail( "Should throw: Invalid legacy syntax and layout for repository." );
         }
         catch( MojoFailureException e )
@@ -692,39 +681,31 @@ public class DeployMojoTest
     public void testAltSnapshotDeploymentRepository()
         throws Exception
     {
-        DeployMojo mojo = spy( new DeployMojo() );
+        DeployMojo mojo = new DeployMojo();
 
-        ArtifactRepository repository = mock( ArtifactRepository.class );
-        when( mojo.createDeploymentArtifactRepository( "altSnapshotDeploymentRepository", "http://localhost"
-                                                       ) ).thenReturn( repository );
+        setVariableValueToObject( mojo, "project", project );
+        setVariableValueToObject( mojo, "session", session );
+        setVariableValueToObject( mojo, "altSnapshotDeploymentRepository",  "altSnapshotDeploymentRepository::http://localhost" );
 
         project.setVersion( "1.0-SNAPSHOT" );
 
-        ProjectDeployerRequest pdr =
-                        new ProjectDeployerRequest()
-                            .setProject( project )
-                            .setAltDeploymentRepository( "altSnapshotDeploymentRepository::http://localhost" );
-        assertEquals( repository,
-                      mojo.getDeploymentRepository( pdr ));
+        assertEquals( new RemoteRepository.Builder( "altSnapshotDeploymentRepository", "default", "http://localhost" ).build(),
+                      mojo.getDeploymentRepository( project, "altSnapshotDeploymentRepository::http://localhost", null, null ));
     }
 
     public void testAltReleaseDeploymentRepository()
         throws Exception
     {
-        DeployMojo mojo = spy( new DeployMojo() );
+        DeployMojo mojo = new DeployMojo();
 
-        ArtifactRepository repository = mock( ArtifactRepository.class );
-        when( mojo.createDeploymentArtifactRepository( "altReleaseDeploymentRepository", "http://localhost" ) ).thenReturn( repository );
+        setVariableValueToObject( mojo, "project", project );
+        setVariableValueToObject( mojo, "session", session );
+        setVariableValueToObject( mojo, "altReleaseDeploymentRepository",  "altReleaseDeploymentRepository::http://localhost" );
 
         project.setVersion( "1.0" );
 
-        ProjectDeployerRequest pdr =
-                        new ProjectDeployerRequest()
-                            .setProject( project )
-                            .setAltReleaseDeploymentRepository( "altReleaseDeploymentRepository::http://localhost" );
-
-        assertEquals( repository,
-                      mojo.getDeploymentRepository( pdr ));
+        assertEquals( new RemoteRepository.Builder("altReleaseDeploymentRepository", "default", "http://localhost").build(),
+                      mojo.getDeploymentRepository( project, null, "altReleaseDeploymentRepository::http://localhost", null ));
     }
     
     private void addFileToList( File file, List<String> fileList )
diff --git a/src/test/java/org/apache/maven/plugins/deploy/stubs/ArtifactDeployerStub.java b/src/test/java/org/apache/maven/plugins/deploy/stubs/ArtifactDeployerStub.java
deleted file mode 100644
index d0b47d4..0000000
--- a/src/test/java/org/apache/maven/plugins/deploy/stubs/ArtifactDeployerStub.java
+++ /dev/null
@@ -1,47 +0,0 @@
-package org.apache.maven.plugins.deploy.stubs;
-
-/*
- * 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 java.util.Collection;
-
-import org.apache.maven.artifact.Artifact;
-import org.apache.maven.artifact.repository.ArtifactRepository;
-import org.apache.maven.project.ProjectBuildingRequest;
-import org.apache.maven.shared.transfer.artifact.deploy.ArtifactDeployer;
-import org.apache.maven.shared.transfer.artifact.deploy.ArtifactDeployerException;
-
-public class ArtifactDeployerStub
-    implements ArtifactDeployer
-{
-
-    @Override
-    public void deploy( ProjectBuildingRequest request, Collection<Artifact> mavenArtifacts )
-        throws ArtifactDeployerException
-    {
-        // does nothing
-    }
-
-    @Override
-    public void deploy( ProjectBuildingRequest arg0, ArtifactRepository arg1, Collection<Artifact> arg2)
-        throws ArtifactDeployerException
-    {
-        // does nothing
-    }
-}