Search code examples
mavenivyartifactorywebjars

Deploy Maven project to local Artifactory service


I have forked a webjar project for working locally in my company's environment. We use Artifactory/Ivy for dependency management.

Currently Smart Table (and other webjars) pom.xml show the following for deployment:

        <plugin>
            <groupId>org.sonatype.plugins</groupId>
            <artifactId>nexus-staging-maven-plugin</artifactId>
            <version>1.6.5</version>
            <extensions>true</extensions>
            <configuration>
                <serverId>sonatype-nexus-staging</serverId>
                <nexusUrl>https://oss.sonatype.org/</nexusUrl>
                <autoReleaseAfterClose>true</autoReleaseAfterClose>
            </configuration>
        </plugin>

It will by default publish to Sonatype, which is good for publicly-visible open source projects once you have release credentials.

However we do currently want to work locally on a fork of the project and deploy to our local Artifactory server. Contributions (to the real project) will be shared via Pull Request, so we are not interested in going to Sonatype repository.

Question

How do I change Maven pom.xml so that mvn deploy will deploy to a locally-configured Artifactory service? (For which credentials are stored in Maven configuration of course)

Bonus question

Can I tell Maven to publish using Ivy layout or should I create a new Maven-layout repository in Artifactory?


Solution

  • First option is to use the standard Maven deploy plugin

    <distributionManagement>
        <repository>
          <id>repo-id</id>
          <name>Artifactory</name>
          <url>http://server:8081/artifactory/repo-id</url>
        </repository>
      </distributionManagement>
    

    You should configure your settings.xml file to define corresponding entries which provides authentication information. Server entries are matched to the different parts of the distributionManagement using their elements.

    <server>
       <id>repo-id</id>
       <username>repo-username</username>
       <password>password/encrypted password</password>
    </server>
    

    Second option is to use the JFrog Maven Artifactory plugin, available at the JCenter repository in Bintray

    <build>
        <plugins>
            ...
            <plugin>
                <groupId>org.jfrog.buildinfo</groupId>
                <artifactId>artifactory-maven-plugin</artifactId>
                <version>2.4.0</version>
                <inherited>false</inherited>
                <executions>
                    <execution>
                        <id>build-info</id>
                        <goals>
                            <goal>publish</goal>
                        </goals>
                        <configuration>
                            <deployProperties>
                                <gradle>awesome</gradle>
                                <review.team>qa</review.team>
                            </deployProperties>
                            <publisher>
                                <contextUrl>https://server:8081/artifactory</contextUrl>
                                <username>username</username>
                                <password>{DESede}...</password>
                                <repoKey>libs-release-local</repoKey>
                                <snapshotRepoKey>libs-snapshot-local</snapshotRepoKey>
                            </publisher>
                        </configuration>
                    </execution>
                </executions>
            </plugin>
        </plugins>
    </build>
    

    Through the Maven Artifactory Plugin, Artifactory is fully integrated with Maven builds and allows you to do the following:

    1. Attach properties to published artifacts in Artifactory metadata.
    2. Capture a BuildInfo object which can be passed to the Artifactory REST API to provide a fully traceable build context.
    3. Automatically publish all build artifacts at the end of the build.

    More detailed usage examples of the plugin can be found in this Github project.

    Bonus question

    Maven can only deploy to a Maven2 (default) or Maven1 (legacy) layout repository. You will have to create a new Maven repository in Artifactory.