Upload/Download entire directory to Nexus through Maven

前端 未结 2 1142
情话喂你
情话喂你 2020-12-16 18:39

Is it possible to upload/download an entire directory and all of the sub-directories within it to/from a Nexus repository server?

相关标签:
2条回答
  • 2020-12-16 19:22

    You can always zip the directory and ship it as a zip file. the users of this folder can download it from Nexus and unzip using dependency:unpack.

    0 讨论(0)
  • 2020-12-16 19:39

    In case you want to actually deploy a hierarchy of files, I hacked together a solution using GMaven (groovy embedded in maven).

    Use the pom below, supply a few properties and hit mvn install. The folder will be crawled and all files inside it will be deployed using an artifactId taken from the relative path. e.g.

    Given the base folder

    c:\a\b\c
    

    the file

    c:\a\b\c\def\ghi\jkl.mno
    

    would have the artifactId def-ghi-jkl and the packaging mno, this can of course be changed to something else.

    The repository info will be taken from the pom, so you need to supply a distributionManagement element in the pom.

    Here it is (a lot of this code is taken from the deploy:deploy-file mojo):

    <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/maven-v4_0_0.xsd">
        <modelVersion>4.0.0</modelVersion>
        <groupId>com.mycompany</groupId>
        <artifactId>folderdeployer</artifactId>
        <packaging>jar</packaging>
        <version>SNAPSHOT</version>
    
        <properties>
            <!-- This is where your artifacts are -->
            <deploy.basefolder>c:\temp\stuff</deploy.basefolder>
    
            <!-- This will be used as groupId -->
            <deploy.groupId>my.groupid</deploy.groupId>
    
            <!-- this will be used as version -->
            <deploy.version>1.2.3</deploy.version>
        </properties>
        <build>
            <plugins>
    
                <plugin>
                    <groupId>org.codehaus.groovy.maven</groupId>
                    <artifactId>gmaven-plugin</artifactId>
                    <version>1.0</version>
                    <dependencies>
                        <dependency>
                            <groupId>commons-io</groupId>
                            <artifactId>commons-io</artifactId>
                            <version>1.4</version>
                        </dependency>
                    </dependencies>
                    <executions>
                        <execution>
                            <id>deploy-files</id>
                            <phase>prepare-package</phase>
                            <goals>
                                <goal>execute</goal>
                            </goals>
                            <configuration>
                                <source>
                                <![CDATA[
    // read components from plexus container             
    def layout = session.lookup(
        'org.apache.maven.artifact.repository.layout.ArtifactRepositoryLayout');
    def repoFactory = session.lookup(
        'org.apache.maven.artifact.repository.ArtifactRepositoryFactory');
    def repository = repoFactory.createDeploymentArtifactRepository(
        pom.distributionManagement.repository.id,
        pom.distributionManagement.repository.url,
        layout, true );
    def localRepository = session.localRepository;
    def helper =
        session.lookup("org.apache.maven.project.MavenProjectHelper");
    def afm = session.lookup(
        'org.apache.maven.artifact.handler.manager.ArtifactHandlerManager');
    def factory = new org.apache.maven.artifact.factory.DefaultArtifactFactory();
    factory.class.getDeclaredField("artifactHandlerManager").accessible = true;
    factory.artifactHandlerManager=afm;
    
    def deployer = session.lookup(
        'org.apache.maven.artifact.deployer.ArtifactDeployer');
    
    // initialize properties
    def baseFolder = new File(pom.properties['deploy.basefolder']);
    def groupId = pom.properties['deploy.groupId'];
    def version = pom.properties['deploy.version'];
    
    // iterate over all files recursively
    baseFolder.eachFileRecurse{
        if(it.isDirectory())return;
    
        // packaging = file.extension
        def packaging = it.name.replaceAll( /.+\./ , '' );
        // artifactId = file.relativePath.replace '/' , '-'
        def artifactId = it.absolutePath
            .replace(baseFolder.absolutePath, '')
            .substring(1)
            .replaceFirst( /\..*?$/ , '')
            .replaceAll( /\W+/ , '-' );
        def artifact = 
            factory.createBuildArtifact( 
                groupId, artifactId, version, packaging );
    
        // create pom for artifact
        def model = new org.apache.maven.model.Model();
        model.setModelVersion( "4.0.0" );
        model.setGroupId( groupId );
        model.setArtifactId( artifactId );
        model.setVersion( version );
        model.setPackaging( packaging );
        File pomFile = File.createTempFile( "mvndeploy", ".pom" );
        pomFile.deleteOnExit();
        fw = org.codehaus.plexus.util.WriterFactory.newXmlWriter( pomFile );
        new org.apache.maven.model.io.xpp3.MavenXpp3Writer().write( fw, model );
        org.apache.commons.io.IOUtils.closeQuietly( fw );
    
        def metadata = 
            new org.apache.maven.project.artifact.ProjectArtifactMetadata(
                        artifact, pomFile );
        artifact.addMetadata( metadata );
    
        // deploy file
        deployer.deploy(it, artifact, repository, localRepository );
    }
                                        ]]>
                                </source>
                            </configuration>
                        </execution>
                    </executions>
                </plugin>
            </plugins>
        </build>
    
        <distributionManagement>
            <repository>
                <id>your repo id here</id>
                <url>scp://your.repo.url/here</url>
                <layout>default</layout>
            </repository>
        </distributionManagement>
    
    </project>
    

    EDIT:

    I elaborated on this on my blog

    0 讨论(0)
提交回复
热议问题