Multiple deployments in maven

前端 未结 4 1660
后悔当初
后悔当初 2021-01-02 06:51

We have a internal artifactory repository. At the moment all snapshots will be deployed there. We also want to have a different server with a web interface, and want to copy

4条回答
  •  囚心锁ツ
    2021-01-02 07:43

    If you are willing to use a custom plugin, you can configure Maven to deploy to a list of "mirror" locations at the same time as the standard deployment. I'd recommend defining this in a profile so you can control what deployments are mirrored (it might not be appropriate to do this on every build).

    To define a new plugin you need to create a new Maven project and specify the POM has packaging maven-plugin:

    
      4.0.0
      name.seller.rich
      maven-mirror-plugin
      maven-plugin
      0.0.1
      
        
          org.apache.maven
          maven-plugin-api
          2.2.0
        
        
          org.apache.maven.plugins
          maven-deploy-plugin
          2.4
        
      
    
    

    In src/main/java define a Mojo. The code below declares a "mirror" goal, it takes a list of mirrorRepository items (containing a repositoryId and url) to mirror the artifact deployment to. The plugin uses the same approach to deployment as the maven-deploy-plugin, and takes most of the same parameters.

    Note that you still need to define a server in your settings.xml for each repository with appropriate permissions to do the deployment or the build will fail!

    package name.seller.rich;
    
    import java.io.File;
    import java.util.Iterator;
    import java.util.List;
    import java.util.Map;
    
    import org.apache.maven.artifact.Artifact;
    import org.apache.maven.artifact.deployer.ArtifactDeployer;
    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.ArtifactRepositoryFactory;
    import org.apache.maven.artifact.repository.layout.ArtifactRepositoryLayout;
    import org.apache.maven.plugin.AbstractMojo;
    import org.apache.maven.plugin.MojoExecutionException;
    import org.apache.maven.plugin.MojoFailureException;
    import org.apache.maven.project.MavenProject;
    import org.apache.maven.project.artifact.ProjectArtifactMetadata;
    
    /**
     * @goal mirror
     * @phase deploy
     */
    public class MirrorMojo extends AbstractMojo {
        /**
         * @parameter expression=
         *            "${component.org.apache.maven.artifact.deployer.ArtifactDeployer}"
         * @required
         * @readonly
         */
        private ArtifactDeployer deployer;
    
        /**
         * Map that contains the layouts
         * 
         * @component role=
         *            "org.apache.maven.artifact.repository.layout.ArtifactRepositoryLayout"
         */
        private Map repositoryLayouts;
    
        /**
         * Component used to create a repository
         * 
         * @component
         */
        private ArtifactRepositoryFactory repositoryFactory;
    
        /**
         * The type of remote repository layout to deploy to. Try legacy for
         * a Maven 1.x-style repository layout.
         * 
         * @parameter expression="${repositoryLayout}" default-value="default"
         * @required
         */
        private String repositoryLayout;
    
        /**
         * Parameter used to update the metadata to make the artifact as release.
         * 
         * @parameter expression="${updateReleaseInfo}" default-value="false"
         */
        private boolean updateReleaseInfo;
    
        /**
         * Whether to deploy snapshots with a unique version or not.
         * 
         * @parameter expression="${uniqueVersion}" default-value="true"
         */
        private boolean uniqueVersion;
    
        /**
         * @parameter expression="${mirrorRepositories}"
         * @required
         */
        private MirrorRepository[] mirrorRepositories;
    
        /**
         * @parameter expression="${localRepository}"
         * @required
         * @readonly
         */
        private ArtifactRepository localRepository;
    
        /**
         * @parameter expression="${project}"
         * @required
         * @readonly
         */
        private MavenProject project;
    
        /**
         * Deploy all artifacts for the project to each mirror repository.
         */
        public void execute() throws MojoExecutionException, MojoFailureException {
            ArtifactRepositoryLayout layout;
    
            layout = (ArtifactRepositoryLayout) repositoryLayouts
                    .get(repositoryLayout);
    
            for (int i = 0; i < mirrorRepositories.length; i++) {
                MirrorRepository mirrorRepository = mirrorRepositories[i];
    
                ArtifactRepository deploymentRepository = repositoryFactory
                        .createDeploymentArtifactRepository(mirrorRepository
                                .getRepositoryId(), mirrorRepository.getUrl(),
                                layout, uniqueVersion);
    
                String protocol = deploymentRepository.getProtocol();
    
                if ("".equals(protocol) || protocol == null) {
                    throw new MojoExecutionException("No transfer protocol found.");
                }
    
                deployToRepository(deploymentRepository);
            }
    
        }
    
        /**
         * Deploy all artifacts to the passed repository.
         */
        private void deployToRepository(ArtifactRepository repo)
                throws MojoExecutionException {
            String protocol = repo.getProtocol();
    
            if (protocol.equalsIgnoreCase("scp")) {
                File sshFile = new File(System.getProperty("user.home"), ".ssh");
    
                if (!sshFile.exists()) {
                    sshFile.mkdirs();
                }
            }
    
            File pomFile = project.getFile();
            Artifact artifact = project.getArtifact();
            // Deploy the POM
            boolean isPomArtifact = "pom".equals(project.getPackaging());
            if (!isPomArtifact) {
                ArtifactMetadata metadata = new ProjectArtifactMetadata(artifact,
                        pomFile);
                artifact.addMetadata(metadata);
            }
    
            if (updateReleaseInfo) {
                artifact.setRelease(true);
            }
    
            try {
                List attachedArtifacts = project.getAttachedArtifacts();
    
                if (isPomArtifact) {
                    deployer.deploy(pomFile, artifact, repo, localRepository);
                } else {
                    File file = artifact.getFile();
    
                    if (file != null && !file.isDirectory()) {
                        deployer.deploy(file, artifact, repo, localRepository);
                    } else if (!attachedArtifacts.isEmpty()) {
                        getLog()
                                .info(
                                        "No primary artifact to deploy, deploy attached artifacts instead.");
                    } else {
                        String message = "The packaging for this project did not assign a file to the build artifact";
                        throw new MojoExecutionException(message);
                    }
                }
    
                for (Iterator i = attachedArtifacts.iterator(); i.hasNext();) {
                    Artifact attached = (Artifact) i.next();
    
                    deployer.deploy(attached.getFile(), attached, repo,
                            localRepository);
                }
            } catch (ArtifactDeploymentException e) {
                throw new MojoExecutionException(e.getMessage(), e);
            }
        }
    }
    

    The mojo references a MirrorRepository type to encapsulate the repositoryId and url, it is a simple bean:

    package name.seller.rich;
    
    public class MirrorRepository {
        private String repositoryId;
        private String url;
    
        public String getRepositoryId() {
            return repositoryId;
        }
    
        public void setRepositoryId(String repositoryId) {
            this.repositoryId = repositoryId;
        }
    
        public String getUrl() {
            return url;
        }
    
        public void setUrl(String url) {
            this.url = url;
        }
    }
    

    Here's an example configuration using the plugin. Note all the deploy formats are supported (http, scp, ftp):

    
      name.seller.rich
      maven-mirror-plugin
      
        
          mirror
          deploy
          
            mirror
          
        
      
      
        
          
            mirror
            http://path/to/mirror
          
        
        
      
    
    

提交回复
热议问题