Gradle Artifactory Plugin - Как опубликовать артефакты из нескольких модулей в проекте?

У меня есть проект, который имеет SharedCode (Java) модуль и во-вторых Android (Библиотека Android) модуль, который зависит от SharedCode модуль. Я хочу опубликовать jar артефакт из SharedCode модуль и aar артефакт из Android модуль. Я не могу понять, как сочинять мои build.gradle файлы, так что оба модуля публикуются в Artifactory, когда artifactoryPublish задание выполнено На данный момент только SharedCode Модуль публикует свой артефакт в Artifactory.

мой build.gradle файлы, как показано ниже. Обратите внимание, что maven-publish аспект моего build.gradle файлы кажутся правильными, потому что, когда я запускаю publishToMavenLocal задача Я вижу артефакты из обоих модулей в моей локальной папке Maven (т.е. '~/.m2/repository').

Во-первых, build.gradle файл в моем SharedCode Модуль выглядит следующим образом:

apply plugin: 'java'
apply plugin: 'maven-publish'
apply plugin: 'com.jfrog.artifactory'

group = "${projectGroupId}"
version = "${projectVersionName}"

dependencies {
    compile 'com.google.guava:guava:18.0'
}

publishing {
    publications {
        SharedCode(MavenPublication) {
            groupId "${projectGroupId}"
            artifactId 'SharedCode'
            version "${projectVersionName}"
            from components.java
        }
    }
}

artifactory {
    contextUrl = "${artifactory_url}"
    publish {
        repository {
            repoKey = 'libs-release-local'
            username = "${artifactory_username}"
            password = "${artifactory_password}"
        }
        defaults {
            publications('SharedCode')
            publishArtifacts = true
            properties = ['qa.level': 'basic', 'dev.team': 'core']
            publishPom = true
        }
    }
}

Во-вторых, build.gradle файл в моем Android Модуль выглядит следующим образом:

apply plugin: 'com.android.library'
apply plugin: 'maven-publish'
apply plugin: 'com.jfrog.artifactory'

group = "${projectGroupId}"
version = "${projectVersionName}"

android {
    // android stuff here...
}

dependencies {
    compile project(':SharedCode')
}

publishing {
    publications {
        Android(MavenPublication) {
            groupId "${projectGroupId}"
            artifactId 'Android'
            version "${projectVersionName}"
            artifact "$buildDir/outputs/aar/Android-release.aar"
        }
    }
}

artifactory {
    contextUrl = "${artifactory_url}"
    publish {
        repository {
            repoKey = 'libs-release-local'
            username = "${artifactory_username}"
            password = "${artifactory_password}"
        }
        defaults {
            publications('Android')
            publishArtifacts = true
            properties = ['qa.level': 'basic', 'dev.team': 'core']
            publishPom = true
        }
    }
}

Если я бегу artifactoryPublish Задача в корне, на уровне проекта или на SharedCode Уровень модуля, то я вижу вывод следующим образом:

18:23:38: Executing external task 'artifactoryPublish'...
Publication named 'SharedCode' does not exist for project ':Android' in task ':Android:artifactoryPublish'.
:SharedCode:generatePomFileForSharedCodePublication
:SharedCode:artifactoryPublish
Deploying artifact: http://localhost:8081/artifactory/libs-release-local/com/mycompany/sdk/SharedCode/0.0.2/SharedCode-0.0.2.jar
Deploying artifact: http://localhost:8081/artifactory/libs-release-local/com/mycompany/sdk/SharedCode/0.0.2/SharedCode-0.0.2.pom
Deploying build descriptor to: http://localhost:8081/artifactory/api/build Build successfully deployed.
Browse it in Artifactory under http://localhost:8081/artifactory/webapp/builds/client-sdk/1457375019604

BUILD SUCCESSFUL

Обратите внимание, что только SharedCode Артефакт опубликован в этом случае.

Если я бегу artifactoryPublish задача на Android Уровень модуля, то я вижу вывод следующим образом:

18:25:25: Executing external task 'artifactoryPublish'...
Publication named 'SharedCode' does not exist for project ':Android' in task ':Android:artifactoryPublish'.
:Android:artifactoryPublish
Deploying build descriptor to: http://localhost:8081/artifactory/api/build
Build successfully deployed. Browse it in Artifactory under http://localhost:8081/artifactory/webapp/builds/client-sdk/1457375127269

BUILD SUCCESSFUL

Обратите внимание, что в этом случае артефакты не публикуются.

3 ответа

Решение

Если взять артефактные мультипроектные примеры на своем репозитории github, то может показаться, что только корневой проект должен иметь artifactory{...} раздел конфигурации, в отличие от каждого подпроекта, как вы сделали.

Более того, когда вы объявляете publications('SharedCode') в корневом проекте плагин artifactory, похоже, ищет публикацию под названием sharedCode в каждом подпроекте.

Я бы попробовал:

  • Удалить artifactory{...} раздел от андроида build.gradle

  • Переименуйте публикацию Android в sharedCode а также (или что-то более общее в обоих проектах)

Обновление: Начиная с версии 4.6.0 из com.jfrog.artifactory Gradle плагин публикации артефактов в многомодульном проекте просто не работает. Исходя из личного опыта, лучше всего отказаться от этого плагина и использовать стандартные maven-publish плагин для модулей библиотеки Java и digital.wup.android-maven-publish плагин для модулей библиотеки Android.

Так что у меня наконец-то все получилось! Отдельное спасибо @RaGe за помощь в этом. Ключевыми моментами, которые следует отметить, является то, что artifactory блок должен находиться на корневом уровне проекта build.gradle файл, а не в build.gradle файл отдельных модулей. Также нужно добавить artifactoryPublish.skip=true на корневой уровень проекта build.gradle файл. Посмотрите репозиторий GitHub для полного примера, хотя и минимально возможного:

https://github.com/adil-hussain-84/SO-35851251-Multiproject-Artifactory-Publish

Если ссылка перестает работать, я вставлю содержимое build.gradle файлы здесь тоже. Во-первых, корневой уровень проекта build.gradle файл:

buildscript {
    repositories {
        jcenter()
    }
    dependencies {
        classpath 'com.android.tools.build:gradle:1.5.0'
        classpath 'org.jfrog.buildinfo:build-info-extractor-gradle:4.0.1'
    }
}

allprojects {
    apply plugin: 'com.jfrog.artifactory'

    repositories {
        jcenter()
    }

    group = "${projectGroupName}"
    version = "${projectVersionName}"
}

artifactoryPublish.skip=true

artifactory {
    contextUrl = "${artifactory_url}"
    publish {
        repository {
            repoKey = 'libs-release-local'
            username = "${artifactory_username}"
            password = "${artifactory_password}"
        }
        defaults {
        publications('SomePublication')
            publishArtifacts = true
            properties = ['qa.level': 'basic', 'dev.team': 'core']
            publishPom = true
        }
    }
}

task wrapper(type: Wrapper) {
    gradleVersion = '2.8'
}

Во-вторых, build.gradle файл из Android модуль:

apply plugin: 'com.android.library'
apply plugin: 'maven-publish'

android {
    compileSdkVersion 23
    buildToolsVersion "23.0.2"

    defaultConfig {
        minSdkVersion 19
        targetSdkVersion 23
        versionCode Integer.parseInt("${projectVersionCode}")
        versionName "${projectVersionName}"
    }
    buildTypes {
        release {
            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
        }
    }
}

dependencies {
    compile project(':SharedCode')
    compile 'com.android.support:appcompat-v7:23.2.1'

    testCompile 'junit:junit:4.12'
}

publishing {
    publications {
        SomePublication(MavenPublication) {
            artifact "$buildDir/outputs/aar/Android-release.aar"

            //The publication doesn't know about our dependencies, so we have to manually add them to the pom
            pom.withXml {
                def dependenciesNode = asNode().appendNode('dependencies')

                //Iterate over the compile dependencies (we don't want the test ones), adding a <dependency> node for each
                configurations.compile.allDependencies.each {
                    def dependencyNode = dependenciesNode.appendNode('dependency')
                    dependencyNode.appendNode('groupId', it.group)
                    dependencyNode.appendNode('artifactId', it.name)
                    dependencyNode.appendNode('version', it.version)
                }
            }
        }
    }
}

В-третьих, и наконец, build.gradle файл из SharedCode (Java) модуль:

apply plugin: 'java'
apply plugin: 'maven-publish'

dependencies {
    compile 'com.google.guava:guava:18.0'
}

publishing {
    publications {
        SomePublication(MavenPublication) {
            from components.java
        }
    }
}

Это оно!

Версия 4.2.0 плагина Gradle Artifactory была выпущена на прошлой неделе и добавила несколько хранилищ Artifactory. Теперь вы можете просто определить артефактное закрытие с другим репозиторием для разных модулей проекта.

Другие вопросы по тегам