Je bascule mon projet sur l'utilisation de Gradle et d'un SonaType Nexus interne pour l'hébergement de mes dépendances. Mon projet principal dépend du projet de bibliothèque A et le projet de bibliothèque A dépend du projet de bibliothèque B.
Mon problème est que dès que j'ajoute LibA à mon projet principal, j'obtiens cette erreur: "La version du module com.example: LibA: 1.1 dépend des bibliothèques mais n'est pas une bibliothèque en soi"
Je n'ai aucun problème pour ajouter des projets de bibliothèque avec des dépendances de jar avec le même script de construction. J'ai vu des gens faire cela avec succès avec les bibliothèques Android LOCAL (dans le projet) mais personne ne le fait avec des dépôts de disques.
S'agit-il d'un bogue ou est-ce que j'ai mal configuré les versions de la bibliothèque?
Construction du projet de base
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 {
} ...
Edit: Ajout de la sortie -info pour l'erreur.
* 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
Edit 2: Ajout de mon script de téléchargement de maven local pour 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
}
}
}
Ce problème a disparu avec les dernières versions de Gradle et du plugin Android Gradle. Semble être juste un bug de publication anticipée.
Le problème est peut-être que vous utilisez mavenCentral en tant que référentiel pour les projets de bibliothèque
repositories {
mavenCentral()
}
et pas le vôtre référentiel de liens où les dépendances réelles existent
repositories {
maven {
url "http://localhost:8081/nexus/content/repositories/releases/"
}
maven {
url "http://localhost:8081/nexus/content/repositories/central/"
}
}
Votre ligne dans les dépendances pour inclure LibA est fausse. Pour inclure un projet de bibliothèque, utilisez ceci:
compile project(':LibA')
Si le répertoire de la bibliothèque ne se trouve pas à la racine de votre répertoire de projet, vous devez spécifier un chemin d'accès délimité par des deux-points. Par exemple, si votre structure de répertoire est:
projectFolder | + - coreProject | + - bibliothèques | + - LibA | + - LibB
votre dépendance sera:
compile project(':libraries:LibA')
C'est la même chose que la notation que vous utilisez dans votre fichier settings.gradle.
Si vous avez téléchargé un artefact de bibliothèque pour jar et aar, essayez ceci.
compile 'com.example:LibA:1.1.1@aar'
J'ai eu un message d'erreur similaire après avoir introduit par erreur un dépendance cyclique entre bibliothèques:
build.gradle dans commons-utils
dependencies {
...
instrumentTestCompile project(':test-utils')
}
build.gradle dans test-utils
dependencies {
...
compile project(':commons-utils')
}
Résoudre ce problème a résolu le problème. Le message d'erreur n'est pas très explicite.
Je ne sais pas avec certitude, juste quelques réflexions:
gradle assemble
à la place de gradle build
? Cela devrait ignorer les tests, car je vois que l'erreur est liée à la tâche de test..aar
à la main et de les télécharger à repo également à la main.:GradleTest
? Voir section 50.4.7 si vous ne voulez pas l'avoir en tant que sous-module dans le premier fichier build.gradle, vous pouvez ajouter votre référentiel maven local
mavenLocal ()
//repositories
repositories {
mavenCentral()
mavenLocal()
}
mais vous devez d'abord installer install sur libA.
Dans mon travail, j'ai utilisé compile project(':google-play-services_lib')
au lieu de compile ('google-play-services_lib')
lorsque je déclare des projets dépendants dans mon fichier build.gradle. Je pense que c’est la bonne façon de procéder avec Gradle: http://www.gradle.org/docs/current/userguide/dependency_management.html#sub:project_dependencies