All Downloads are FREE. Search and download functionalities are using the official Maven repository.

org.apache.maven.plugin.deploy.DeployMojo Maven / Gradle / Ivy

There is a newer version: 4.0.0-beta-1
Show newest version
package org.apache.maven.plugin.deploy;

/*
 * 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 org.apache.maven.artifact.Artifact;
import org.apache.maven.artifact.ArtifactUtils;
import org.apache.maven.artifact.deployer.ArtifactDeploymentException;
import org.apache.maven.artifact.metadata.ArtifactMetadata;
import org.apache.maven.artifact.repository.ArtifactRepository;
import org.apache.maven.artifact.repository.layout.ArtifactRepositoryLayout;
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.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.artifact.ProjectArtifactMetadata;

import java.io.File;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.util.concurrent.atomic.AtomicInteger;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

/**
 * Deploys an artifact to remote repository.
 * 
 * @author Emmanuel Venisse
 * @author John Casey (refactoring only)
 * @version $Id: DeployMojo.java 1620080 2014-08-23 21:34:57Z khmarbaise $
 */
@Mojo( name = "deploy", defaultPhase = LifecyclePhase.DEPLOY, threadSafe = true )
public class DeployMojo
    extends AbstractDeployMojo
{

    private static final Pattern ALT_REPO_SYNTAX_PATTERN = Pattern.compile( "(.+)::(.+)::(.+)" );

    /**
     * When building with multiple threads, reaching the last project doesn't have to mean that all projects are ready
     * to be deployed
     */
    private static final AtomicInteger readyProjectsCounter = new AtomicInteger();

    private static final List deployRequests =
        Collections.synchronizedList( new ArrayList() );

    /**
     */
    @Parameter( defaultValue = "${project}", readonly = true, required = true )
    private MavenProject project;

    @Parameter( defaultValue = "${reactorProjects}", required = true, readonly = true )
    private List reactorProjects;

    /**
     * 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. (experimental)
     * 
     * @since 2.8
     */
    @Parameter( defaultValue = "false", property = "deployAtEnd" )
    private boolean deployAtEnd;

    /**
     * @deprecated either use project.getArtifact() or reactorProjects.get(i).getArtifact()
     */
    @Parameter( defaultValue = "${project.artifact}", required = true, readonly = true )
    private Artifact artifact;

    /**
     * @deprecated either use project.getPackaging() or reactorProjects.get(i).getPackaging()
     */
    @Parameter( defaultValue = "${project.packaging}", required = true, readonly = true )
    private String packaging;

    /**
     * @deprecated either use project.getFile() or reactorProjects.get(i).getFile()
     */
    @Parameter( defaultValue = "${project.file}", required = true, readonly = true )
    private File pomFile;

    /**
     * Specifies an alternative repository to which the project artifacts should be deployed ( other than those
     * specified in <distributionManagement> ). 
* Format: id::layout::url *
*
id
*
The id can be used to pick up the correct credentials from the settings.xml
*
layout
*
Either default for the Maven2 layout or legacy for the Maven1 layout. Maven3 also * uses the default layout.
*
url
*
The location of the repository
*
*/ @Parameter( property = "altDeploymentRepository" ) private String altDeploymentRepository; /** * The alternative repository to use when the project has a snapshot version. * * @since 2.8 * @see DeployMojo#altDeploymentRepository */ @Parameter( property = "altSnapshotDeploymentRepository" ) private String altSnapshotDeploymentRepository; /** * The alternative repository to use when the project has a final version. * * @since 2.8 * @see DeployMojo#altDeploymentRepository */ @Parameter( property = "altReleaseDeploymentRepository" ) private String altReleaseDeploymentRepository; /** * @deprecated either use project.getAttachedArtifacts() or reactorProjects.get(i).getAttachedArtifacts() */ @Parameter( defaultValue = "${project.attachedArtifacts}", required = true, readonly = true ) private List attachedArtifacts; /** * Set this to 'true' to bypass artifact deploy * * @since 2.4 */ @Parameter( property = "maven.deploy.skip", defaultValue = "false" ) private boolean skip; public void execute() throws MojoExecutionException, MojoFailureException { boolean addedDeployRequest = false; if ( skip ) { getLog().info( "Skipping artifact deployment" ); } else { failIfOffline(); DeployRequest currentExecutionDeployRequest = new DeployRequest().setProject( project ).setUpdateReleaseInfo( isUpdateReleaseInfo() ).setRetryFailedDeploymentCount( getRetryFailedDeploymentCount() ).setAltReleaseDeploymentRepository( altReleaseDeploymentRepository ).setAltSnapshotDeploymentRepository( altSnapshotDeploymentRepository ).setAltDeploymentRepository( altDeploymentRepository ); if ( !deployAtEnd ) { deployProject( currentExecutionDeployRequest ); } else { deployRequests.add( currentExecutionDeployRequest ); addedDeployRequest = true; } } boolean projectsReady = readyProjectsCounter.incrementAndGet() == reactorProjects.size(); if ( projectsReady ) { synchronized ( deployRequests ) { while ( !deployRequests.isEmpty() ) { deployProject( deployRequests.remove( 0 ) ); } } } else if ( addedDeployRequest ) { getLog().info( "Deploying " + project.getGroupId() + ":" + project.getArtifactId() + ":" + project.getVersion() + " at end" ); } } private void deployProject( DeployRequest request ) throws MojoExecutionException, MojoFailureException { Artifact artifact = request.getProject().getArtifact(); String packaging = request.getProject().getPackaging(); File pomFile = request.getProject().getFile(); @SuppressWarnings( "unchecked" ) List attachedArtifacts = request.getProject().getAttachedArtifacts(); ArtifactRepository repo = getDeploymentRepository( request.getProject(), request.getAltDeploymentRepository(), request.getAltReleaseDeploymentRepository(), request.getAltSnapshotDeploymentRepository() ); String protocol = repo.getProtocol(); if ( protocol.equalsIgnoreCase( "scp" ) ) { File sshFile = new File( System.getProperty( "user.home" ), ".ssh" ); if ( !sshFile.exists() ) { sshFile.mkdirs(); } } // Deploy the POM boolean isPomArtifact = "pom".equals( packaging ); if ( !isPomArtifact ) { ArtifactMetadata metadata = new ProjectArtifactMetadata( artifact, pomFile ); artifact.addMetadata( metadata ); } if ( request.isUpdateReleaseInfo() ) { artifact.setRelease( true ); } int retryFailedDeploymentCount = request.getRetryFailedDeploymentCount(); try { if ( isPomArtifact ) { deploy( pomFile, artifact, repo, getLocalRepository(), retryFailedDeploymentCount ); } else { File file = artifact.getFile(); if ( file != null && file.isFile() ) { deploy( file, artifact, repo, getLocalRepository(), retryFailedDeploymentCount ); } else if ( !attachedArtifacts.isEmpty() ) { getLog().info( "No primary artifact to deploy, deploying attached artifacts instead." ); Artifact pomArtifact = artifactFactory.createProjectArtifact( artifact.getGroupId(), artifact.getArtifactId(), artifact.getBaseVersion() ); pomArtifact.setFile( pomFile ); if ( request.isUpdateReleaseInfo() ) { pomArtifact.setRelease( true ); } deploy( pomFile, pomArtifact, repo, getLocalRepository(), retryFailedDeploymentCount ); // propagate the timestamped version to the main artifact for the attached artifacts to pick it up artifact.setResolvedVersion( pomArtifact.getVersion() ); } else { String message = "The packaging for this project did not assign a file to the build artifact"; throw new MojoExecutionException( message ); } } for ( Artifact attached : attachedArtifacts ) { deploy( attached.getFile(), attached, repo, getLocalRepository(), retryFailedDeploymentCount ); } } catch ( ArtifactDeploymentException e ) { throw new MojoExecutionException( e.getMessage(), e ); } } ArtifactRepository getDeploymentRepository( MavenProject project, String altDeploymentRepository, String altReleaseDeploymentRepository, String altSnapshotDeploymentRepository ) throws MojoExecutionException, MojoFailureException { ArtifactRepository repo = null; String altDeploymentRepo; if ( ArtifactUtils.isSnapshot( project.getVersion() ) && altSnapshotDeploymentRepository != null ) { altDeploymentRepo = altSnapshotDeploymentRepository; } else if ( !ArtifactUtils.isSnapshot( project.getVersion() ) && altReleaseDeploymentRepository != null ) { altDeploymentRepo = altReleaseDeploymentRepository; } else { altDeploymentRepo = altDeploymentRepository; } if ( altDeploymentRepo != null ) { getLog().info( "Using alternate deployment repository " + altDeploymentRepo ); Matcher matcher = ALT_REPO_SYNTAX_PATTERN.matcher( altDeploymentRepo ); if ( !matcher.matches() ) { throw new MojoFailureException( altDeploymentRepo, "Invalid syntax for repository.", "Invalid syntax for alternative repository. Use \"id::layout::url\"." ); } else { String id = matcher.group( 1 ).trim(); String layout = matcher.group( 2 ).trim(); String url = matcher.group( 3 ).trim(); ArtifactRepositoryLayout repoLayout = getLayout( layout ); repo = repositoryFactory.createDeploymentArtifactRepository( id, url, repoLayout, true ); } } if ( repo == null ) { repo = project.getDistributionManagementArtifactRepository(); } if ( repo == null ) { String msg = "Deployment failed: repository element was not specified in the POM inside" + " distributionManagement element or in -DaltDeploymentRepository=id::layout::url parameter"; throw new MojoExecutionException( msg ); } return repo; } }




© 2015 - 2024 Weber Informatics LLC | Privacy Policy