Разрешение транзитивных зависимостей от Artifactory в gradle

В моем проекте есть два модуля, lib и lib-api, со следующими обязанностями

  • lib-api - чистый java-модуль, содержащий только файлы интерфейса.
  • lib - библиотека для Android.

и я хотел бы, чтобы jenkins опубликовал оба модуля (как банки) на внутреннем сервере артефактов, чтобы другие проекты могли их использовать.

Используя плагин Jenkins Artifactory, я смог опубликовать jar-файлы для обоих модулей в artifactory, но мой другой проект, который зависит от lib, не может быть построен со следующей ошибкой gradle

Не удалось найти com.mygroup: lib-api: 1.0.0-SNAPSHOT

Моя установка

Скрипты сборки

lib-api / build.gradle

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

group = 'com.mygroup'
version = project.version

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

lib / build.gradle

apply plugin: 'com.android.library'
apply plugin: 'com.github.dcendents.android-maven'

android { ... }

dependencies {
    compile project(':lib-api')
}

group = 'com.mygroup'
version = project.version

Конфигурация плагина Jenkins Artifactory

  • Gradle-Artifactory Integration
    • Publish artifacts to Artifactory
      • Publish Maven descriptors
    • Используйте шаблоны, совместимые с Maven
  • Invoke Gradle script
    • Use Gradle Wrapper
    • Задачи: clean assemble -x preDexDebug -x preDexDAT -x preDexRelease

Результат в Artifactory репо

+-- libs-snapshot-local
|   +-- com
|   |   +-- mygroup
|   |   |   +-- lib
|   |   |   |   +-- 1.0.0-SNAPSHOT
|   |   |   |   |   `-- lib-1.0.0-20150508-1.jar
|   |   |   |   |   `-- lib-1.0.0-20150508-1.pom
|   |   |   |   |   `-- maven-metadata.xml
|   |   |   |   `-- maven-metadata.xml
|   |   |   +-- lib-api
|   |   |   |   +-- 1.0.0-SNAPSHOT
|   |   |   |   |   `-- lib-1.0.0-20150508-1.jar

Вопрос

Насколько я понимаю, artifactory / gradle должен быть достаточно умен, чтобы разрешить -SNAPSHOT в последний моментальный снимок с отметкой времени, и это, кажется, подтверждается тем фактом, что ему удается разрешить lib независимо от того, указываю ли я latest.integration или 1.0.0-SNAPSHOT

Как я могу получить Gradle для разрешения этой транзитивной зависимости моментального снимка от artifactory? Или заставить плагин artifactory опубликовать банку таким образом, чтобы градиент мог ее разрешить?

Рабочая теория

Я заметил, что в папке lib-api нет файла maven-metadata.xml, а в папке с версией моментального снимка нет ни одного ... ни файла pom. Я подозреваю, что проблема в этом.

Плагин Jenkins от Artifactory использует под капотом плагин artifactory gradle для заданий, для которых включена интеграция Gradle-Artifactory. Согласно документации подключаемого модуля gradle artifactory, идентификатор подключаемого модуля изменяется в зависимости от используете ли вы новый (maven-publish) или старый (maven) механизм публикации.

Может ли это быть проблемой? Плагин Artifactory применяет неправильный идентификатор плагина, возможно, потому, что он принимает решение на основе модуля библиотеки Android?


person Enrico    schedule 08.05.2015    source источник


Ответы (1)


tl; dr Устранено переключение на старый плагин maven для gradle.

Мой lib-api/build.gradle теперь выглядит так

apply plugin: 'java'
apply plugin: 'maven'

group = 'com.mygroup'
version = project.version
ext.artifactId = project.name.toLowerCase()
project.archivesBaseName = project.artifactId

uploadArchives {
    repositories {
        mavenDeployer {
            pom.artifactId = project.artifactId
        }
    }
}

Примечание. Согласно документации gradle для подключаемого модуля maven, pom.artifactId должен быть явно определен, если вы установили archivesBaseName. Возможно, это была основная проблема моей предыдущей конфигурации, но я не возвращался и не тестировал ее.

person Enrico    schedule 22.05.2015