You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@maven.apache.org by sj...@apache.org on 2023/01/24 20:49:31 UTC

[maven-deploy-plugin] 01/01: [MDEPLOY-305] Improvement in DeployAtEnd

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

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

commit 9029c8a8088ac3b91ee201a6b8ee378358739056
Author: Slawomir Jaranowski <s....@gmail.com>
AuthorDate: Mon Jan 23 22:44:42 2023 +0100

    [MDEPLOY-305] Improvement in DeployAtEnd
    
    - Fix when module does not use m-deploy-p
    - Don't use metadata from main artifact to fetch pom.xml
    - Deploy all artifacts in one request
---
 src/it/deploy-at-end-pass/module2/pom.xml          |  39 ++++++++
 src/it/deploy-at-end-pass/module3/pom.xml          |  25 +++++
 src/it/deploy-at-end-pass/module4/pom.xml          |  38 ++++++++
 src/it/deploy-at-end-pass/pom.xml                  |   5 +-
 src/it/deploy-at-end-pass/verify.groovy            |   7 +-
 .../invoker.properties                             |  18 ++++
 src/it/setup-mock-phase-maven-plugin/pom.xml       |  57 +++++++++++
 .../main/resources/META-INF/plexus/components.xml  |  40 ++++++++
 .../maven/plugins/deploy/AbstractDeployMojo.java   |  14 +--
 .../apache/maven/plugins/deploy/DeployMojo.java    | 105 +++++++++++++--------
 .../plugins/deploy/stubs/MavenProjectStub.java     |  12 +++
 11 files changed, 314 insertions(+), 46 deletions(-)

diff --git a/src/it/deploy-at-end-pass/module2/pom.xml b/src/it/deploy-at-end-pass/module2/pom.xml
new file mode 100644
index 0000000..827396f
--- /dev/null
+++ b/src/it/deploy-at-end-pass/module2/pom.xml
@@ -0,0 +1,39 @@
+<?xml version="1.0" encoding="UTF-8"?>
+
+<!-- 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. -->
+
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+  <modelVersion>4.0.0</modelVersion>
+
+  <parent>
+    <groupId>org.apache.maven.its.deploy.dae.pass</groupId>
+    <artifactId>dae</artifactId>
+    <version>1.0</version>
+  </parent>
+  <artifactId>module2</artifactId>
+
+  <build>
+    <plugins>
+      <plugin>
+        <groupId>org.apache.maven.plugins</groupId>
+        <artifactId>maven-deploy-plugin</artifactId>
+        <executions>
+          <execution>
+            <id>default-deploy</id>
+            <phase>none</phase>
+          </execution>
+        </executions>
+      </plugin>
+    </plugins>
+  </build>
+</project>
diff --git a/src/it/deploy-at-end-pass/module3/pom.xml b/src/it/deploy-at-end-pass/module3/pom.xml
new file mode 100644
index 0000000..48c9caa
--- /dev/null
+++ b/src/it/deploy-at-end-pass/module3/pom.xml
@@ -0,0 +1,25 @@
+<?xml version="1.0" encoding="UTF-8"?>
+
+<!-- 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. -->
+
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+  xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+  <modelVersion>4.0.0</modelVersion>
+
+  <parent>
+    <groupId>org.apache.maven.its.deploy.dae.pass</groupId>
+    <artifactId>dae</artifactId>
+    <version>1.0</version>
+  </parent>
+  <artifactId>module3</artifactId>
+
+</project>
diff --git a/src/it/deploy-at-end-pass/module4/pom.xml b/src/it/deploy-at-end-pass/module4/pom.xml
new file mode 100644
index 0000000..05f0762
--- /dev/null
+++ b/src/it/deploy-at-end-pass/module4/pom.xml
@@ -0,0 +1,38 @@
+<?xml version="1.0" encoding="UTF-8"?>
+
+<!-- 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. -->
+
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+  <modelVersion>4.0.0</modelVersion>
+
+  <parent>
+    <groupId>org.apache.maven.its.deploy.dae.pass</groupId>
+    <artifactId>dae</artifactId>
+    <version>1.0</version>
+  </parent>
+  <artifactId>module4</artifactId>
+
+  <!-- packaging without deploy plugin -->
+  <packaging>without-deploy</packaging>
+
+  <build>
+    <plugins>
+      <plugin>
+        <groupId>org.apache.maven.its.deploy.mock</groupId>
+        <artifactId>mock-phase-maven-plugin</artifactId>
+        <version>1.0</version>
+        <extensions>true</extensions>
+      </plugin>
+    </plugins>
+  </build>
+</project>
diff --git a/src/it/deploy-at-end-pass/pom.xml b/src/it/deploy-at-end-pass/pom.xml
index 04250d5..45bb6cc 100644
--- a/src/it/deploy-at-end-pass/pom.xml
+++ b/src/it/deploy-at-end-pass/pom.xml
@@ -38,7 +38,7 @@ under the License.
   <distributionManagement>
     <repository>
       <id>it</id>
-      <url>file:///${basedir}/target/repo</url>
+      <url>file:///${maven.multiModuleProjectDirectory}/target/repo</url>
     </repository>
   </distributionManagement>
 
@@ -95,5 +95,8 @@ under the License.
 
   <modules>
     <module>module1</module>
+    <module>module2</module>
+    <module>module3</module>
+    <module>module4</module>
   </modules>
 </project>
diff --git a/src/it/deploy-at-end-pass/verify.groovy b/src/it/deploy-at-end-pass/verify.groovy
index 634808a..52adc47 100644
--- a/src/it/deploy-at-end-pass/verify.groovy
+++ b/src/it/deploy-at-end-pass/verify.groovy
@@ -18,9 +18,14 @@
  */
 
 assert new File( basedir, "target/repo/org/apache/maven/its/deploy/dae/pass/dae/1.0/dae-1.0.pom" ).exists()
-assert new File( basedir, "module1/target/repo/org/apache/maven/its/deploy/dae/pass/module1/1.0/module1-1.0.pom" ).exists()
+assert new File( basedir, "target/repo/org/apache/maven/its/deploy/dae/pass/module1/1.0/module1-1.0.pom" ).exists()
+assert new File( basedir, "target/repo/org/apache/maven/its/deploy/dae/pass/module1/1.0/module1-1.0.jar" ).exists()
+assert new File( basedir, "target/repo/org/apache/maven/its/deploy/dae/pass/module3/1.0/module3-1.0.pom" ).exists()
+assert new File( basedir, "target/repo/org/apache/maven/its/deploy/dae/pass/module3/1.0/module3-1.0.jar" ).exists()
 
 File buildLog = new File( basedir, 'build.log' )
 assert buildLog.exists()
 assert buildLog.text.contains( "[INFO] Deferring deploy for org.apache.maven.its.deploy.dae.pass:dae:1.0 at end" )
+assert buildLog.text.contains( "[INFO] Deferring deploy for org.apache.maven.its.deploy.dae.pass:module1:1.0 at end" )
+assert buildLog.text.contains( "[INFO] Deferring deploy for org.apache.maven.its.deploy.dae.pass:module3:1.0 at end" )
 
diff --git a/src/it/setup-mock-phase-maven-plugin/invoker.properties b/src/it/setup-mock-phase-maven-plugin/invoker.properties
new file mode 100644
index 0000000..d5d6ca5
--- /dev/null
+++ b/src/it/setup-mock-phase-maven-plugin/invoker.properties
@@ -0,0 +1,18 @@
+# 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.
+
+invoker.goals = install
diff --git a/src/it/setup-mock-phase-maven-plugin/pom.xml b/src/it/setup-mock-phase-maven-plugin/pom.xml
new file mode 100644
index 0000000..4ebb8af
--- /dev/null
+++ b/src/it/setup-mock-phase-maven-plugin/pom.xml
@@ -0,0 +1,57 @@
+<?xml version="1.0" encoding="UTF-8"?>
+
+<!--
+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.
+-->
+
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+  <modelVersion>4.0.0</modelVersion>
+
+  <groupId>org.apache.maven.its.deploy.mock</groupId>
+  <artifactId>mock-phase-maven-plugin</artifactId>
+  <version>1.0</version>
+  <packaging>maven-plugin</packaging>
+
+  <prerequisites>
+    <maven>@mavenVersion@</maven>
+  </prerequisites>
+
+  <description>plugin with Maven phase without m-deploy-p</description>
+
+  <build>
+    <pluginManagement>
+      <plugins>
+        <plugin>
+          <groupId>org.apache.maven.plugins</groupId>
+          <artifactId>maven-install-plugin</artifactId>
+          <version>@mavenInstallPluginVersion@</version>
+        </plugin>
+        <plugin>
+          <groupId>org.apache.maven.plugins</groupId>
+          <artifactId>maven-plugin-plugin</artifactId>
+          <version>@mavenPluginToolsVersion@</version>
+          <configuration>
+            <skipErrorNoDescriptorsFound>true</skipErrorNoDescriptorsFound>
+          </configuration>
+        </plugin>
+      </plugins>
+    </pluginManagement>
+  </build>
+
+</project>
diff --git a/src/it/setup-mock-phase-maven-plugin/src/main/resources/META-INF/plexus/components.xml b/src/it/setup-mock-phase-maven-plugin/src/main/resources/META-INF/plexus/components.xml
new file mode 100644
index 0000000..93e017c
--- /dev/null
+++ b/src/it/setup-mock-phase-maven-plugin/src/main/resources/META-INF/plexus/components.xml
@@ -0,0 +1,40 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+
+<!--
+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.
+-->
+
+<component-set>
+  <components>
+    <component>
+      <role>org.apache.maven.lifecycle.mapping.LifecycleMapping</role>
+      <role-hint>without-deploy</role-hint>
+      <implementation>org.apache.maven.lifecycle.mapping.DefaultLifecycleMapping</implementation>
+      <configuration>
+        <lifecycles>
+          <lifecycle>
+            <id>default</id>
+            <phases>
+              <process-resources>org.apache.maven.plugins:maven-resources-plugin:resources</process-resources>
+            </phases>
+          </lifecycle>
+        </lifecycles>
+      </configuration>
+    </component>
+  </components>
+</component-set>
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 33ecad0..2c5c1d9 100644
--- a/src/main/java/org/apache/maven/plugins/deploy/AbstractDeployMojo.java
+++ b/src/main/java/org/apache/maven/plugins/deploy/AbstractDeployMojo.java
@@ -26,7 +26,6 @@ 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;
@@ -122,10 +121,13 @@ public abstract class AbstractDeployMojo extends AbstractMojo {
         return result;
     }
 
-    /**
-     * Handles high level retries (this was buried into MAT).
-     */
-    protected void deploy(RepositorySystemSession session, DeployRequest deployRequest) throws MojoExecutionException {
+    // I'm not sure if retries will work with deploying on client level ...
+    // Most repository managers block a duplicate artifacts.
+
+    // Eg, when we have an artifact list, even simple pom and jar in one request with released version,
+    // next try can fail due to duplicate.
+
+    protected void deploy(DeployRequest deployRequest) throws MojoExecutionException {
         int retryFailedDeploymentCounter = Math.max(1, Math.min(10, retryFailedDeploymentCount));
         DeploymentException exception = null;
         for (int count = 0; count < retryFailedDeploymentCounter; count++) {
@@ -134,7 +136,7 @@ public abstract class AbstractDeployMojo extends AbstractMojo {
                     getLog().info("Retrying deployment attempt " + (count + 1) + " of " + retryFailedDeploymentCounter);
                 }
 
-                repositorySystem.deploy(session, deployRequest);
+                repositorySystem.deploy(session.getRepositorySession(), deployRequest);
                 exception = null;
                 break;
             } catch (DeploymentException e) {
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 0921417..c6f76f6 100644
--- a/src/main/java/org/apache/maven/plugins/deploy/DeployMojo.java
+++ b/src/main/java/org/apache/maven/plugins/deploy/DeployMojo.java
@@ -19,6 +19,8 @@
 package org.apache.maven.plugins.deploy;
 
 import java.io.File;
+import java.util.ArrayList;
+import java.util.LinkedHashMap;
 import java.util.List;
 import java.util.Map;
 import java.util.regex.Matcher;
@@ -26,6 +28,8 @@ import java.util.regex.Pattern;
 
 import org.apache.maven.RepositoryUtils;
 import org.apache.maven.artifact.ArtifactUtils;
+import org.apache.maven.model.Plugin;
+import org.apache.maven.model.PluginExecution;
 import org.apache.maven.plugin.MojoExecutionException;
 import org.apache.maven.plugin.MojoFailureException;
 import org.apache.maven.plugin.descriptor.PluginDescriptor;
@@ -63,7 +67,6 @@ public class DeployMojo extends AbstractDeployMojo {
     /**
      * Whether every project should be deployed during its own deploy-phase or at the end of the multimodule build. If
      * set to {@code true} and the build fails, none of the reactor projects is deployed.
-     * <strong>(experimental)</strong>
      *
      * @since 2.8
      */
@@ -176,17 +179,21 @@ public class DeployMojo extends AbstractDeployMojo {
             warnIfAffectedPackagingAndMaven(project.getPackaging());
 
             if (!deployAtEnd) {
-                deploy(
-                        session.getRepositorySession(),
-                        processProject(
-                                project,
-                                altSnapshotDeploymentRepository,
-                                altReleaseDeploymentRepository,
-                                altDeploymentRepository));
+
+                RemoteRepository deploymentRepository = getDeploymentRepository(
+                        project,
+                        altSnapshotDeploymentRepository,
+                        altReleaseDeploymentRepository,
+                        altDeploymentRepository);
+
+                DeployRequest request = new DeployRequest();
+                request.setRepository(deploymentRepository);
+                processProject(project, request);
+                deploy(request);
                 putState(State.DEPLOYED);
             } else {
-                putPluginContextValue(DEPLOY_ALT_RELEASE_DEPLOYMENT_REPOSITORY, altReleaseDeploymentRepository);
                 putPluginContextValue(DEPLOY_ALT_SNAPSHOT_DEPLOYMENT_REPOSITORY, altSnapshotDeploymentRepository);
+                putPluginContextValue(DEPLOY_ALT_RELEASE_DEPLOYMENT_REPOSITORY, altReleaseDeploymentRepository);
                 putPluginContextValue(DEPLOY_ALT_DEPLOYMENT_REPOSITORY, altDeploymentRepository);
                 putState(State.TO_BE_DEPLOYED);
                 getLog().info("Deferring deploy for " + project.getGroupId() + ":" + project.getArtifactId() + ":"
@@ -194,32 +201,41 @@ public class DeployMojo extends AbstractDeployMojo {
             }
         }
 
-        if (allProjectsMarked()) {
-            for (MavenProject reactorProject : reactorProjects) {
+        List<MavenProject> allProjectsUsingPlugin = getAllProjectsUsingPlugin();
+
+        if (allProjectsMarked(allProjectsUsingPlugin)) {
+            Map<RemoteRepository, DeployRequest> requests = new LinkedHashMap<>();
+
+            // collect all arifacts from all modules to deploy
+            // requests are grouped by used remote repository
+            for (MavenProject reactorProject : allProjectsUsingPlugin) {
                 Map<String, Object> pluginContext = session.getPluginContext(pluginDescriptor, reactorProject);
                 State state = getState(pluginContext);
                 if (state == State.TO_BE_DEPLOYED) {
-                    String altReleaseDeploymentRepository =
-                            getPluginContextValue(pluginContext, DEPLOY_ALT_RELEASE_DEPLOYMENT_REPOSITORY);
-                    String altSnapshotDeploymentRepository =
-                            getPluginContextValue(pluginContext, DEPLOY_ALT_SNAPSHOT_DEPLOYMENT_REPOSITORY);
-                    String altDeploymentRepository =
-                            getPluginContextValue(pluginContext, DEPLOY_ALT_DEPLOYMENT_REPOSITORY);
-
-                    deploy(
-                            session.getRepositorySession(),
-                            processProject(
-                                    reactorProject,
-                                    altSnapshotDeploymentRepository,
-                                    altReleaseDeploymentRepository,
-                                    altDeploymentRepository));
+
+                    RemoteRepository deploymentRepository = getDeploymentRepository(
+                            reactorProject,
+                            getPluginContextValue(pluginContext, DEPLOY_ALT_SNAPSHOT_DEPLOYMENT_REPOSITORY),
+                            getPluginContextValue(pluginContext, DEPLOY_ALT_RELEASE_DEPLOYMENT_REPOSITORY),
+                            getPluginContextValue(pluginContext, DEPLOY_ALT_DEPLOYMENT_REPOSITORY));
+
+                    DeployRequest request = requests.computeIfAbsent(deploymentRepository, repo -> {
+                        DeployRequest newRequest = new DeployRequest();
+                        newRequest.setRepository(repo);
+                        return newRequest;
+                    });
+                    processProject(reactorProject, request);
                 }
             }
+            // finally execute all deployments request, lets resolver to optimize deployment
+            for (DeployRequest request : requests.values()) {
+                deploy(request);
+            }
         }
     }
 
-    private boolean allProjectsMarked() {
-        for (MavenProject reactorProject : reactorProjects) {
+    private boolean allProjectsMarked(List<MavenProject> allProjectsUsingPlugin) {
+        for (MavenProject reactorProject : allProjectsUsingPlugin) {
             if (!hasState(reactorProject)) {
                 return false;
             }
@@ -227,15 +243,30 @@ public class DeployMojo extends AbstractDeployMojo {
         return true;
     }
 
-    private DeployRequest processProject(
-            final MavenProject project,
-            final String altSnapshotDeploymentRepository,
-            final String altReleaseDeploymentRepository,
-            final String altDeploymentRepository)
-            throws MojoExecutionException, MojoFailureException {
-        DeployRequest request = new DeployRequest();
-        request.setRepository(getDeploymentRepository(
-                project, altSnapshotDeploymentRepository, altReleaseDeploymentRepository, altDeploymentRepository));
+    private List<MavenProject> getAllProjectsUsingPlugin() {
+        ArrayList<MavenProject> result = new ArrayList<>();
+        for (MavenProject reactorProject : reactorProjects) {
+            if (hasExecution(reactorProject.getPlugin("org.apache.maven.plugins:maven-deploy-plugin"))) {
+                result.add(reactorProject);
+            }
+        }
+        return result;
+    }
+
+    private boolean hasExecution(Plugin plugin) {
+        if (plugin == null) {
+            return false;
+        }
+
+        for (PluginExecution execution : plugin.getExecutions()) {
+            if (!execution.getGoals().isEmpty() && !"none".equalsIgnoreCase(execution.getPhase())) {
+                return true;
+            }
+        }
+        return false;
+    }
+
+    private void processProject(final MavenProject project, DeployRequest request) throws MojoExecutionException {
 
         org.apache.maven.artifact.Artifact mavenMainArtifact = project.getArtifact();
         String packaging = project.getPackaging();
@@ -280,8 +311,6 @@ public class DeployMojo extends AbstractDeployMojo {
             getLog().debug("Attaching for install: " + attached.getId());
             request.addArtifact(RepositoryUtils.toArtifact(attached));
         }
-
-        return request;
     }
 
     /**
diff --git a/src/test/java/org/apache/maven/plugins/deploy/stubs/MavenProjectStub.java b/src/test/java/org/apache/maven/plugins/deploy/stubs/MavenProjectStub.java
index ff97f91..646e09a 100644
--- a/src/test/java/org/apache/maven/plugins/deploy/stubs/MavenProjectStub.java
+++ b/src/test/java/org/apache/maven/plugins/deploy/stubs/MavenProjectStub.java
@@ -18,7 +18,11 @@
  */
 package org.apache.maven.plugins.deploy.stubs;
 
+import java.util.Collections;
+
 import org.apache.maven.artifact.repository.ArtifactRepository;
+import org.apache.maven.model.Build;
+import org.apache.maven.model.Plugin;
 
 public class MavenProjectStub extends org.apache.maven.plugin.testing.stubs.MavenProjectStub {
 
@@ -27,4 +31,12 @@ public class MavenProjectStub extends org.apache.maven.plugin.testing.stubs.Mave
     public ArtifactRepository getDistributionManagementArtifactRepository() {
         return deploymentRepository;
     }
+
+    @Override
+    public Build getBuild() {
+        Plugin plugin = new Plugin();
+        Build build = new Build();
+        build.setPlugins(Collections.singletonList(plugin));
+        return build;
+    }
 }