Зависимость библиотеки Android Gradle с зависимостью библиотеки с помощью Nexus
Я переключаю свой проект на использование Gradle и внутреннего SonaType Nexus для размещения моих зависимостей. Мой основной проект зависит от библиотечного проекта A, а библиотечный проект A зависит от библиотечного проекта B.
Моя проблема в том, что как только я добавляю LibA в свой основной проект, я получаю эту ошибку: "Версия модуля com.example:LibA:1.1 зависит от библиотек, но не является самой библиотекой"
У меня нет проблем с добавлением библиотечных проектов с зависимостями jar с помощью того же сценария сборки. Я видел, как люди успешно делали это с LOCAL (в проекте) библиотеками Android, но никто не делал этого с репозиториями Mave n.
Это ошибка в Gradle или я неправильно настроил сборку библиотеки?
Основной проект Build
buildscript {
repositories {
mavenCentral()
}
dependencies {
classpath 'com.android.tools.build:gradle:0.6.+'
}
}
apply plugin: 'android'
repositories {
maven {
url "http://localhost:8081/nexus/content/repositories/releases/"
}
maven {
url "http://localhost:8081/nexus/content/repositories/central/"
}
}
android {
compileSdkVersion 19
buildToolsVersion "19.0.0"
defaultConfig {
minSdkVersion 14
targetSdkVersion 19
}
}
dependencies {
compile 'com.android.support:support-v4:+'
compile('com.example:LibA:1.+')
}
LibA Build
buildscript {
repositories {
mavenCentral()
}
dependencies {
classpath 'com.android.tools.build:gradle:0.6.+'
}
}
apply plugin: 'android-library'
android {
compileSdkVersion 19
buildToolsVersion "19.0.0"
defaultConfig {
minSdkVersion 9
targetSdkVersion 17
versionCode = "3"
versionName = "1.2"
}
android {
sourceSets {
main {
manifest.srcFile 'AndroidManifest.xml'
java.srcDirs = ['src']
resources.srcDirs = ['src']
aild.srcDirs = ['src']
renderscript.srcDirs = ['src']
res.srcDirs = ['res']
assets.srcDirs = ['assets']
}
}
}
repositories {
mavenCentral()
}
dependencies {
compile ('com.example:LibB:1.+')
} ...
LibB Build
buildscript {
repositories {
mavenCentral()
}
dependencies {
classpath 'com.android.tools.build:gradle:0.6.+'
}
}
apply plugin: 'android-library'
android {
compileSdkVersion 19
buildToolsVersion "19.0.0"
defaultConfig {
minSdkVersion 9
targetSdkVersion 17
versionCode = "1"
versionName = "1.0"
}
android {
sourceSets {
main {
manifest.srcFile 'AndroidManifest.xml'
java.srcDirs = ['src']
resources.srcDirs = ['src']
aild.srcDirs = ['src']
renderscript.srcDirs = ['src']
res.srcDirs = ['res']
assets.srcDirs = ['assets']
}
}
}
repositories {
mavenCentral()
}
dependencies {
} ...
Редактировать: Добавление вывода -info для ошибки.
* What went wrong:
A problem occurred configuring project ':GradleTest'.
> Failed to notify project evaluation listener.
> Module version com.example:LibA:1.+ depends on libraries but is not a library itself
Изменить 2: Добавление моего локального сценария загрузки Mave n для LibA
apply plugin: 'maven'
apply plugin: 'signing'
group = "com.example"
version = defaultConfig.versionName
configurations {
archives {
extendsFrom configurations.default
}
}
signing {
required { has("release") && gradle.taskGraph.hasTask("uploadArchives") }
sign configurations.archives
}
uploadArchives {
configuration = configurations.archives
repositories.mavenDeployer {
beforeDeployment { MavenDeployment deployment -> signing.signPom(deployment) }
repository(url: sonatypeRepo) {
authentication(userName: sonatypeUsername,
password: sonatypePassword)
}
pom.project {
name 'com-example'
packaging 'aar'
description 'none'
url 'https://internal github link'
scm {
url 'scm:git@https://internal github link'
connection 'git@https://internal github link'
developerConnection 'git@https://internal github link'
}
licenses {
license {
name 'example'
url 'example'
distribution 'example'
}
}
developers {
developer {
id 'example'
name 'example'
email 'example'
}
}
groupId "com.example"
artifactId rootProject.name //LibA
version defaultConfig.versionName
}
}
}
8 ответов
Эта проблема исчезла с более поздними версиями Gradle и Android Gradle Plugin. Кажется, только что была ранняя ошибка выпуска.
Если вы загрузили артефакт библиотеки для jar и aar, попробуйте это.
compile 'com.example:LibA:1.1.1@aar'
Возможно, проблема в том, что вы используете mavenCentral в качестве хранилища для библиотечных проектов.
repositories {
mavenCentral()
}
а не ваше хранилище Nexus, где существуют реальные зависимости
repositories {
maven {
url "http://localhost:8081/nexus/content/repositories/releases/"
}
maven {
url "http://localhost:8081/nexus/content/repositories/central/"
}
}
Ваша линия в зависимостях для включения LibA неверна. Чтобы включить проект библиотеки, используйте это:
compile project(':LibA')
Если каталог библиотеки не находится в корне каталога вашего проекта, вам нужно указать путь, разделенный двоеточиями. Например, если ваша структура каталогов:
projectFolder | +- coreProject | +- библиотеки | + - Либа | + - LibB
Ваша зависимость будет:
compile project(':libraries:LibA')
Это то же самое, что и нотация, которую вы используете в файле settings.gradle.
Если вы не хотите, чтобы он был субмодулем в первом файле build.gradle, вы можете добавить свой локальный репозиторий maven
mavenLocal()
//repositories
repositories {
mavenCentral()
mavenLocal()
}
но сначала вам нужно запустить install на libA.
У меня было похожее сообщение об ошибке после введения по ошибке циклической зависимости между библиотеками:
build.gradle в обыкновенных утилитах
dependencies {
...
instrumentTestCompile project(':test-utils')
}
build.gradle в тестовых утилитах
dependencies {
...
compile project(':commons-utils')
}
Исправление это решило проблему. Сообщение об ошибке не очень явное.
Не знаю точно, только пара мыслей:
- Ты пробовал бегать
gradle assemble
вместоgradle build
? Это должно пропустить тесты, так как я вижу, что ошибка связана с тестовым заданием. - Может быть, глупо, но попробуйте удалить зависимость от 2-й библиотеки из первой и поместить ее в список основных сборок перед первой. У меня есть память о чем-то связанном. Таким образом, вторая библиотека может быть добавлена в classpath, позволяя первой скомпилировать.
- Попробуй создать
.aar
файлы вручную и загрузить его в репо также вручную. - Это взлом, но, может быть, это сработает: вы рассматривали, чтобы исключить это
:GradleTest
модуль? Смотрите раздел 50.4.7
В своей работе я использовал compile project(':google-play-services_lib')
вместо compile ('google-play-services_lib')
когда я объявляю зависимые проекты в моем файле build.gradle. Я думаю, что это правильный способ сделать это с Gradle: http://www.gradle.org/docs/current/userguide/dependency_management.html