Dépendances transitives non résolues pour la bibliothèque aar à l'aide de gradle

93

J'ai enquêté pendant un certain temps et j'ai probablement vu les réponses les plus populaires ici liées aux dépendances aar et transitive, mais d'une manière ou d'une autre, je ne sais toujours pas comment faire fonctionner cela.

Alors:

J'ai une bibliothèque Android avec une configuration de gradle donnée:

apply plugin: 'android-library'
apply plugin: 'android-maven'

version = "1.0.0"
group = "com.somepackage"

buildscript {
    repositories {
        mavenCentral()
        mavenLocal()
    }

    dependencies {
        classpath 'com.github.dcendents:android-maven-plugin:1.0'
    }
}

android {
    compileSdkVersion 19
    buildToolsVersion '19.0.3'

    defaultConfig {
        minSdkVersion 10
    }
}

repositories {
    maven { url 'http://www.bugsense.com/gradle/' }
}

dependencies {
    provided 'com.google.android.gms:play-services:+'
    provided 'com.android.support:appcompat-v7:+'
    compile 'com.google.code.gson:gson:2.2.4'
    compile 'com.bugsense.trace:bugsense:3.6'
    compile 'commons-net:commons-net:3.3'
}

Ensuite, je le déploie sur le repo maven local avec gradle install. Le fichier POM de la bibliothèque déployée ressemble à ceci:

<?xml version="1.0" encoding="UTF-8"?>
<project xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd" xmlns="http://maven.apache.org/POM/4.0.0"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
  <modelVersion>4.0.0</modelVersion>
  <groupId>com.sprezzat</groupId>
  <artifactId>app</artifactId>
  <version>1.0.0</version>
  <packaging>aar</packaging>
  <dependencies>
    <dependency>
      <groupId>com.bugsense.trace</groupId>
      <artifactId>bugsense</artifactId>
      <version>3.6</version>
      <scope>compile</scope>
    </dependency>
    <dependency>
      <groupId>commons-net</groupId>
      <artifactId>commons-net</artifactId>
      <version>3.3</version>
      <scope>compile</scope>
    </dependency>
    <dependency>
      <groupId>com.google.code.gson</groupId>
      <artifactId>gson</artifactId>
      <version>2.2.4</version>
      <scope>compile</scope>
    </dependency>
  </dependencies>
</project>

Et enfin graduer la configuration de mon application Android en utilisant la bibliothèque ci-dessus comme dépendance:

buildscript {
    repositories {
        mavenCentral()
    }
    dependencies {
        classpath 'com.android.tools.build:gradle:0.9.+'
    }
}
apply plugin: 'android'

repositories {
    mavenCentral()
    mavenLocal()
}

android {
    compileSdkVersion 15
    buildToolsVersion "19.0.2"

    defaultConfig {
        minSdkVersion 10
        targetSdkVersion 18
    }
}

dependencies {
    compile 'com.google.android.gms:play-services:+'
    compile 'com.android.support:appcompat-v7:+'
    compile 'com.somepackage:LIBRARY_NAME:1.0.0@aar'
}

Et après avoir déployé l'application sur le téléphone, je reçois NoClassDefFoundErrordes classes appartenant à des dépendances de compilation de ma bibliothèque Android.

Inspecter les dépendances de mes applications Android en utilisant gradle dependencies:

apk - Classpath packaged with the compiled main classes.
+--- com.google.android.gms:play-services:+ -> 4.3.23
|    \--- com.android.support:support-v4:19.0.1 -> 19.1.0
+--- com.android.support:appcompat-v7:+ -> 19.1.0
|    \--- com.android.support:support-v4:19.1.0
\--- com.somepackage:LIBRARY_NAME:1.0.0

Selon l'arborescence ci-dessus, toutes les dépendances transitives ne sont pas détectées. Où est le problème et comment le faire correctement?

mkorszun
la source
1
Avez-vous examiné le résultat de l'exécution gradle dependenciesde votre application?
CommonsWare
Et êtes-vous vraiment sûr de vouloir le providedmot - clé? Selon Xav, ces dépendances ne sont pas incluses dans l'APK , et je pense que vous voudriez qu'elles soient emballées dans l'APK.
CommonsWare
@CommonsWare gradle dependenciespour ma lib android: default - Configuration des artefacts par défaut. + --- com.google.code.gson: gson: 2.2.4 + --- com.bugsense.trace: bugsense: 3.6 \ --- commons-net: commons-net: 3.3
mkorszun
Je ne suis pas conscient que les fichiers AAR locaux comme ça fonctionnent - je pense qu'ils doivent aller dans un référentiel Maven local et être référencés de cette façon. Mais je parlais vraiment de courir gradle dependenciespour l' application , pas pour une bibliothèque que quelqu'un a décidé de nommer «application».
CommonsWare
@CommonsWare s'il vous plaît voir la question mise à jour. J'ai installé la bibliothèque dans le repo local de maven mais cela n'aide pas.
mkorszun

Réponses:

87

J'ai résolu mon problème en définissant l' transitiveattribut pour ma dépendance aar:

compile ('com.somepackage:LIBRARY_NAME:1.0.0@aar'){
    transitive=true
}
mkorszun
la source
3
@PeterNiederwieser L'omission des @aarcauses à Gradle pour tenter de récupérer l'artefact sous forme de fichier .jar. Cela tue la construction.
cwc
4
Cela n'a pas fonctionné pour moi. J'ai le problème exact. J'ai 2 bibliothèques et l'une d'elles utilise l'autre. compile project(':LeafPeripheralsContract') { transitive=true }n'a pas marché. Il se plaignait de transitif. Et j'ai créé un aaret j'ai essayé de lui ajouter de la transitive. Il ne s'est pas plaint mais il ne l'a pas inclus dans l'autre package aar.
tasomaniac
1
Cela n'a pas fonctionné pour moi non plus. J'ai également un classificateur dans la dépendance. Vous vous demandez si tel est le problème. Utilisation d'Android Studio RC1 avec les outils de construction gradle 0.14.4.
lostintranslation
1
Oui, si vous utilisez des classificateurs, cela ne semble pas que les deps transitifs fonctionnent. Regardez ici: code.google.com/p/android/issues/…
lostintranslation
2
si vous avez à la fois des artefacts .jar et .aar, c'est la seule solution pour utiliser @aar et inclure les transitives.
Jeffrey Blattman
18

vous ne devriez pas utiliser "@aar", si utiliser "@" est devenu " Notation d'artefact seulement ", si vous voulez utiliser "@" et voulez avoir une dépendance transitive, vous devez ajouter "transitive = true"

utilisateur3070402
la source
2
Cette réponse est utile. Il y avait une faute de frappe dans mon commentaire précédent et j'ai supprimé celui-là. Merci pour votre réponse, passez une bonne journée :).
srain
14

Essayez ceci si vous utilisez aar localement:

compile(project(:your-library-name)) {
    transitive=true
}
suhas_sm
la source
6
Salut, ça ne marche pas pour moi. J'ai créé un projet de bibliothèque qui utilise en interne la bibliothèque de volley. J'ai inclus un fichier aar créé à l'aide d'un projet de bibliothèque dans mon application. J'obtiens l'erreur "Erreur: (8, 26): le package com.android.volley n'existe pas". Dans mon projet de bibliothèque, j'ai inclus volley en utilisant compile (project (': volley')) {transitive = true}
Manish
2
Hey Manish, Face au même problème, as-tu trouvé une solution?
Jalpesh
Je suis coincé avec le même problème
Alex
1
Incluez-vous l'aar comme flatDir? Si tel est le cas, je vous renvoie au commentaire suivant: stackoverflow.com/questions/25698160/…
FloG
5

J'avais un problème similaire et je sentais que je pouvais partager les étapes de résolution du problème.

L'idée de base de ne pas pouvoir utiliser les dépendances transitives pendant que vous publiez les vôtres aarest en fait de ne pas .pomgénérer le fichier avec les dépendances transitives attendues.

J'utilisais un 'maven-publish'plugin pour ma aardépendance Android pour le publier dans mon propre référentiel maven privé. Les dépendances transitives n'étaient pas résolues lorsque mes autres projets ajoutaient ma aardépendance dans leur build.gradle. D'où ici ce que j'ai fait pour modifier le .pomfichier lors de la publication de mon aar.

Il est important de noter ici que les dépendances dont vous souhaitez avoir le comportement transitif doivent être importées en utilisant le fichier apide votre projet de bibliothèque build.gradlecomme suit.

dependencies {
    implementation fileTree(dir: 'libs', include: ['*.jar'])
    api 'com.android.volley:volley:1.0.0'
    api "com.google.code.gson:gson:$globalGsonVersion"
}

Maintenant, comme je l'ai dit plus tôt, j'utilisais un maven-publishplugin pour publier la aardépendance et donc ma tâche de publication dans le gradle ressemble à ce qui suit.

publishing {
    publications {
        mavenAar(MavenPublication) {
            from components.android
        }

        mavenJava(MavenPublication) {
            pom.withXml {
                def dependenciesNode = asNode().appendNode('dependencies')
                // Iterate over the api dependencies (we don't want the test ones), adding a <dependency> node for each
                configurations.api.allDependencies.each {
                    def dependencyNode = dependenciesNode.appendNode('dependency')
                    dependencyNode.appendNode('groupId', it.group)
                    dependencyNode.appendNode('artifactId', it.name)
                    dependencyNode.appendNode('version', it.version)
                }
            }
        }
    }

    repositories {
        maven {
            // Your repository information goes here
        }
    }
}

Par conséquent, j'ai utilisé une autre mavenJavatâche pour publier le .pomfichier dans mon repo privé maven afin que lorsque le aarfichier est ajouté en tant que dépendance à un autre module, il obtienne les .pominformations et télécharge la dépendance transitive.

Pour compléter la réponse, voici comment vous devez ajouter la dépendance dans le build.gradlefichier pour votre propre publié aarimporté.

api('com.example.masudias:my_lib:1.0.0@aar') {
    transitive = true
}
Reaz Murshed
la source
2

transitivesignifie que le consommateur (par exemple, une application) comprend un producteur et toutes les dépendances du producteur (par exemple des bibliothèques). Cela augmente le temps de construction et peut créer des problèmes avec les versions de dépendance

Par défaut, la dépendance Gradle a transitive = true

api ('com.package:library:0.0.1')
//the same
api ('com.package:library:0.0.1') {
    transitive = true
}

Lorsque vous l'utilisez, @artifact notationil atransitive = false

api ('com.package:library:0.0.1@aar')
//the same
api ('com.package:library:0.0.1@aar') {
    transitive = false
}
yoAlex5
la source
0

Pour moi, la solution de publication complète ressemble à ceci:


apply plugin: 'com.github.dcendents.android-maven'

group = GROUP
version = VERSION

// you could move it to env variable or property
def publishFlavorless = true
def firstTask = null

android.libraryVariants.all { variant ->

    if (variant.name.toLowerCase().contains("debug")) {
        // Workaround for https://github.com/gradle/gradle/issues/1487
        if (publishFlavorless && firstTask == null) {
            def bundleTask = tasks["bundle${variant.name.capitalize()}Aar"]
            firstTask = bundleTask
            artifacts {
                archives(firstTask.archivePath) {
                    builtBy firstTask
                    name = project.name
                }
            }
        }
        return
    }

    def bundleTask = tasks["bundle${variant.name.capitalize()}Aar"]

    artifacts {
        archives(bundleTask.archivePath) {
            classifier variant.flavorName
            builtBy bundleTask
            name = project.name
        }
    }
}

install {
    repositories.mavenInstaller {
        // This generates POM.xml with proper parameters
        pom.project {
            name POM_NAME
            artifactId POM_ARTIFACT_ID
            // For aar it is equal to 'aar' with jar transitive dependencies won't work
            packaging POM_PACKAGING
            description POM_DESCRIPTION
        }
    }
}

Le transitive = truebloc est également nécessaire ...

Sergey Dryganets
la source
-1

Le simple fait d'ajouter @aar à la fin de la dépendance est ce qui a fonctionné pour moi.

dependencies {
    implementation 'org.videolan.vlc:libvlc:3.0.13@aar'
}
Merc
la source