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

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

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

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

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

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

Моя настройка

Сценарии сборки

Lib-апи /build.gradle

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

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

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

Библиотека /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-Артефакторная интеграция
    • Опубликовать артефакты в Артефактории
      • Опубликовать дескрипторы Maven
    • Используйте Maven совместимые шаблоны
  • Вызов скрипта Gradle
    • Используйте Gradle Wrapper
    • Задачи: clean assemble -x preDexDebug -x preDexDAT -x preDexRelease

Результат в Артефактор репо

+-- 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

Вопрос

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

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

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

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

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

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

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. Это могло быть основной проблемой моей предыдущей конфигурации, но я не вернулся и не протестировал ее.

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