web-dev-qa-db-fra.com

Dépendance de la bibliothèque Android Gradle avec dépendance de la bibliothèque à l'aide de Nexus

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
        }
    }
}
28
sgarman

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.

0
sgarman

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/"
    }
}
2
Audrius K

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.

2
Scott Barta

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'
2
KeithYokoma

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.

1
ben75

Je ne sais pas avec certitude, juste quelques réflexions:

  1. Avez-vous essayé d'exécuter 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.
  2. Peut-être stupide, mais essayez de supprimer la dépendance sur la 2e lib du premier et de le mettre dans votre liste de fichiers de construction principale avant le premier. J'ai un souvenir de quelque chose en rapport. De cette façon, la deuxième bibliothèque peut être ajoutée à classpath, permettant ainsi à la première de se compiler.
  3. Essayez de créer des fichiers .aar à la main et de les télécharger à repo également à la main.
  4. C'est un hack, mais peut-être que ça va marcher: avez-vous envisagé d'exclure ce module :GradleTest? Voir section 50.4.7
1
Dmide

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.

1

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

1
omermuhammed