Gradle - plugin maven-publish: How to publish only specific publication to a repository

gradle, maven-plugin

Solution

You could disable and hide the "invalid" tasks like so:

apply plugin: 'maven-publish'

publishing {
    repositories {
        maven {
            name 'Dev'
            url 'http://dev/'
            credentials {
                username 'username'
                password 'password'
            }
        }

        maven {
            name 'Prod'
            url 'http://prod/'
            credentials {
                username 'username'
                password 'password'
            }
        }

    }

    publications {
        // This will only be enabled on Dev
        MyDevJar(MavenPublication) {
            artifactId "test"
            version "1.0"
            groupId "org.example"
            artifact file('abc')
            ext.repo = 'Dev'
        }

        // This will only be enabled on prod
        MyJar(MavenPublication) {
            artifactId "test"
            version "1.0"
            groupId "org.example"
            artifact file('abc')
            ext.repo = 'Prod'
        }
    }
}

afterEvaluate {
    tasks.withType(PublishToMavenRepository) { task ->
        if (task.publication.hasProperty('repo') && task.publication.repo != task.repository.name) {
            task.enabled = false
            task.group = null
        }
    }
}

Problem

We have two different artifacts that is going to be published to two different maven repositories. - "ProjectXMergedWar" should be published to "MyMavenRepo1" (snapshots) - "ProjectXJarRelease" should be published to "MyMavenRepo2" (release) - "ProjectXMergedWar" should never be published to "MyMavenRepo2" (release) - "ProjectXJarRelease" should never be published to "MyMavenRepo1" (snapshots) We use the plugin maven-publish where you configure a set of publications and reposistories. The plugin then generates tasks for all combinations of publications and repositories (see tasks list at the bottom). Currently the tasks `publish` and `publishRelease` is doing what we want, but there are tasks we don't want. Some solutions might be: - Can we remove the unwanted tasks**? - Can we configure maven-publish to only generate two publish tasks (the wanted tasks*)? - Can we call the correct classes directly (`repo.publish(artifact)` or something like that)? I have looked at the source code of `PublishToMavenRepository`. It seems like the action I want to achive is located in `protected void doPublish`. *Wanted tasks: - publishProjectXMergedWarPublicationToMyMavenRepo1Repository + generatePom - publishProjectXJarReleasePublicationToMyMavenRepo2Repository + generatePom **Unwanted tasks: - publishProjectXMergedWarPublicationToMyMavenRepo2Repository - publishProjectXJarReleasePublicationToMyMavenRepo1Repository Gradle file: ``` apply plugin: 'maven-publish' publishing { publications { ProjectXMergedWar(MavenPublication) { artifact mergeWar artifactId = 'projectx' } ProjectXJarRelease(MavenPublication) { artifact releaseJar artifactId = 'projectx' } } repositories { maven { name 'MyMavenRepo1' url 'http://artifactory/url/our-snapshot-local' credentials { (...) } } maven { name 'MyMavenRepo2' url 'http://artifactory/url/our-release-local' credentials { (...) } } } } task publish(dependsOn: [ 'generatePomFileForProjectXMergedWarPublication', 'publishProjectXMergedWarPublicationToMyMavenRepo1Repository' ], overwrite: true) { // We override the normal publish which would have tried to publish all combinations of defined // publications and repositories: // - publishProjectXMergedWarPublicationToMyMavenRepo1Repository (we use this in normal snapshot publish) // - publishProjectXMergedWarPublicationToMyMavenRepo2Repository (not to be used) // - publishProjectXJarReleasePublicationToMyMavenRepo1Repository (not to be used) // - publishProjectXJarReleasePublicationToMyMavenRepo2Repository (we use this one in publishRelease) } task publishRelease(dependsOn: [ 'generatePomFileForProjectXJarReleasePublication', 'publishProjectXJarReleasePublicationToMyMavenRepo2Repository' ]) ``` Output from tasks: ``` $ ./gradlew tasks (...) Publishing tasks ---------------- generatePomFileForProjectXJarReleasePublication - Generates the Maven POM file for publication 'ProjectXJarRelease'. generatePomFileForProjectXMergedWarPublication - Generates the Maven POM file for publication 'ProjectXMergedWar'. publishProjectXJarReleasePublicationToMavenLocal - Publishes Maven publication 'ProjectXJarRelease' to the local Maven repository. publishProjectXJarReleasePublicationToMyMavenRepo1Repository - Publishes Maven publication 'ProjectXJarRelease' to Maven repository 'MyMavenRepo1'. publishProjectXJarReleasePublicationToMyMavenRepo2Repository - Publishes Maven publication 'ProjectXJarRelease' to Maven repository 'MyMavenRepo2'. publishProjectXMergedWarPublicationToMavenLocal - Publishes Maven publication 'ProjectXMergedWar' to the local Maven repository. publishProjectXMergedWarPublicationToMyMavenRepo1Repository - Publishes Maven publication 'ProjectXMergedWar' to Maven repository 'MyMavenRepo1'. publishProjectXMergedWarPublicationToMyMavenRepo2Repository - Publishes Maven publication 'ProjectXMergedWar' to Maven repository 'MyMavenRepo2'. publishToMavenLocal - Publishes all Maven publications produced by this project to the local Maven cache. (...) Other tasks ----------- (...) publish publishRelease (...) ```

Original source