28 votes

Dépendance à la bibliothèque Android Gradle avec une dépendance à la bibliothèque en utilisant Nexus

Je passe mon projet à l'utilisation de Gradle et d'un Nexus SonaType interne pour héberger mes dépendances. Mon projet principal dépend du projet de bibliothèque A et le projet de bibliothèque A a une dépendance 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 de bibliothèques mais n'est pas une bibliothèque elle-même"

Je n'ai pas de problèmes pour ajouter des projets de bibliothèque avec des dépendances jar avec le même script de build. J'ai vu des personnes le faire avec succès avec des bibliothèques android LOCAL (dans le projet) mais personne ne le fait avec des dépôts Maven.

Est-ce un bug dans gradle ou ai-je mal configuré les builds de bibliothèque?

Build du Projet Principal

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.+')
}

Build de LibA

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.+')
    } ...

Build de LibB

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 {
    } ...

Modifier : Ajout de la sortie -info pour l'erreur.

* Que s'est-il passé :
Un problème est survenu lors de la configuration du projet ':GradleTest'.
> L'évaluation du projet a échoué.
   > La version du module com.example:LibA:1.+ dépend de bibliothèques mais n'est pas une bibliothèque elle-même

Modifier 2 : Ajout de mon script de déploiement 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
        }
    }
}

2voto

Scott Barta Points 18979

Votre ligne dans les dépendances pour inclure LibA est incorrecte. Pour inclure un projet de bibliothèque, utilisez ceci :

compile project(':LibA')

Si le répertoire de la bibliothèque n'est pas à la racine de votre répertoire de projet, vous devrez spécifier un chemin avec des deux-points. Par exemple, si votre structure de répertoire est la suivante :

projectFolder
  |
  +--coreProject
  |
  +--libraries
      |
      +--LibA
      |
      +--LibB

votre dépendance sera :

compile project(':libraries:LibA')

C'est la même notation que celle que vous utilisez dans votre fichier settings.gradle.

2voto

Audrius K Points 422

Peut-être que le problème est que vous utilisez mavenCentral comme votre référentiel pour les projets de bibliothèque

repositories {
    mavenCentral()
}

et pas votre propre référentiel nexus 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/"
    }
}

2voto

KeithYokoma Points 56

Si vous avez téléchargé l'artifact de la bibliothèque pour les fichiers jar et aar, essayez ceci.

compile 'com.example:LibA:1.1.1@aar'

1voto

omermuhammed Points 5468

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 manière de le faire avec Gradle : http://www.gradle.org/docs/current/userguide/dependency_management.html#sub:project_dependencies

1voto

Si vous ne voulez pas l'avoir comme sous-module dans le premier fichier build.gradle, vous pouvez ajouter votre dépôt maven local

mavenLocal()

//repositories
repositories {
    mavenCentral()
    mavenLocal()
}

mais vous devez d'abord exécuter install sur libA.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X