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