Android Gradle dépendance de la bibliothèque avec dépendance de 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 de base 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 de Module de com.exemple:LibA:1.1 dépend des bibliothèques, mais n'est pas une bibliothèque elle-même"

Je n'ai aucun problème à ajouter des projets de bibliothèque avec des dépendances jar avec le même script de construction. J'ai vu des gens le faire avec succès avec des bibliothèques Android locales (dans le projet) mais personne ne le fait avec des repos maven.

Est-ce un bug dans gradle ou Ai-je mal configuré les builds 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.+')
}

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

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

Edit: ajout d'une 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 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
demandé sur sgarman 2013-11-19 05:52:20

8 réponses

Votre ligne dans les dépendances à 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 du répertoire de votre projet, vous devrez spécifier un chemin délimité par deux points. Par exemple, si votre structure de répertoire est:

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

Votre dépendance sera:

compile project(':libraries:LibA')

C'est la même que la notation que vous utilisez dans vos paramètres.fichier gradle.

2
répondu Scott Barta 2013-11-21 18:06:36

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

repositories {
    mavenCentral()
}

Et pas le vôtre 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/"
    }
}
2
répondu Audrius K 2013-12-10 20:19:05

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
répondu KeithYokoma 2014-04-15 09:27:38

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 ma construction.fichier gradle. Je pense que c'est la bonne façon de le faire avec Gradle: http://www.gradle.org/docs/current/userguide/dependency_management.html#sub:project_dependencies

1
répondu omermuhammed 2013-11-21 17:04:19

Si vous ne voulez pas l'avoir comme sous-module dans la première génération.fichier gradle vous pouvez ajouter votre référentiel Maven local

MavenLocal ()

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

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

1
répondu Luis Ramirez-Monterosa 2013-11-21 23:05:44

J'ai eu un message d'erreur similaire après avoir introduit par erreur une dépendance cyclique entre les bibliothèques:

Construire.gradle dans les communes-utils

dependencies {
    ...
    instrumentTestCompile project(':test-utils')
}

Construire.gradle dans test-utils

dependencies {
    ...
    compile project(':commons-utils')
}

La résolution de ce problème a résolu le problème. Le message d'erreur n'est pas très explicite.

1
répondu ben75 2014-01-16 10:55:39

Je ne sais pas avec certitude, juste quelques pensées:

  1. avez-vous essayé d'exécuter gradle assemble à la place 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 dependcy sur 2nd lib de la première et placez-le dans votre liste de fichiers de construction principale avant la première. J'ai un souvenir de quelque chose de lié. De cette façon, la deuxième lib peut être ajoutée à classpath permettant à la première de compiler.
  3. Essayez de créer des fichiers .aar à la main et téléchargez-les pensions aussi à 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
répondu Dmide 2014-02-19 09:44:19

Ce problème a disparu avec les versions ultérieures de Gradle et le Plugin Android Gradle. Semble avoir juste été un bug de libération anticipée.

0
répondu sgarman 2014-04-17 20:13:02