web-dev-qa-db-fra.com

Comment inclure la dépendance JAR dans une bibliothèque AAR

Résumé:

J'ai un fichier AAR qui dépend d'un fichier JAR, lorsque je crée le projet AAR, il ne contient pas le code JAR.

Détails:

J'ai un projet de bibliothèque SDK Java qui contient du code que nous utilisons pour les projets Web Java et ainsi de suite, cette bibliothèque est créée à l'aide de Gradle et réside dans un serveur nexus interne (en tant que JAR ).

L'objectif est de fournir une version "configurée Android" de cette bibliothèque JAR via une bibliothèque AAR que plusieurs applications Android peuvent utiliser et minimiser l'effort (et le code standard) pour l'implémenter. Ce fichier AAR est également téléchargé sur le serveur Nexus pour être utilisé par les projets d'application Android.

Mon projet AAR inclut une dépendance gradle pour ma bibliothèque de SDK Java (le JAR) mais une fois construit, l'AAR n'en inclut aucune classe.

Code:

Il s'agit du fichier gradle du projet Java SDK:

apply plugin: 'Java'

//noinspection GroovyUnusedAssignment
sourceCompatibility = 1.7
version = '1.1.1'

repositories {
    mavenCentral()
}

jar {
    from {
        configurations.compile.collect { it.isDirectory() ? it : zipTree(it) }
    }
}

dependencies {
    testCompile group: 'junit', name: 'junit', version: '4.11'
    testCompile 'org.Apache.directory.studio:org.Apache.commons.io:2.4'
    compile 'org.springframework:spring-web:3.1.1.RELEASE'
    compile 'com.google.code.gson:gson:2.3'
}

Il s'agit du fichier gradle pour mon projet AAR, notez que j'en ai supprimé les déclarations du référentiel Maven sur mon serveur Nexus. Je suppose que cela ne devrait pas avoir d'importance pour cette question.

apply plugin: 'com.Android.library'

Android {
    compileSdkVersion 23
    buildToolsVersion "23.0.1"

    defaultConfig {
        minSdkVersion 16
        targetSdkVersion 23
        versionCode 1
        versionName "2.2.2"
    }
    buildTypes {
        release {
            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-Android.txt'), 'proguard-rules.pro'
        }
    }
    lintOptions {
        abortOnError false
    }
}

dependencies {
    compile fileTree(dir: 'libs', include: ['*.jar'])
    testCompile 'junit:junit:4.12'
    compile 'com.Android.support:appcompat-v7:23.1.0'

    compile ('com.mycompany:javasdk:1.1.1')
}

Ceci est le fichier gradle pour mon projet Android, encore une fois j'ai supprimé les références du serveur Nexus:

apply plugin: 'com.Android.application'

Android {
    compileSdkVersion 23
    buildToolsVersion "23.0.1"

    defaultConfig {
        applicationId "com.mycompany.application1"
        minSdkVersion 16
        targetSdkVersion 23
        versionCode 1
        versionName "1.0"
    }
    buildTypes {
        release {
            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-Android.txt'), 'proguard-rules.pro'
        }
    }
}

dependencies {
    compile fileTree(dir: 'libs', include: ['*.jar'])
    testCompile 'junit:junit:4.12'
    compile 'com.Android.support:appcompat-v7:23.1.0'

    compile ('com.mycompany:androidsdk:2.2.2@aar')
}

REMARQUE: J'ai d'abord résolu le problème en ajoutant le JAR dans le répertoire lib du projet AAR, mais ce n'est pas souhaité. Cela rend inutile d'avoir un serveur Nexus. Il serait bon que nous puissions simplement augmenter le numéro de version du JAR dans le fichier de gradle du projet AAR et la mise à jour se produit automatiquement au moment de la compilation.

NOTE2: J'ai essayé d'ajouter transitive=true À ma dépendance AAR dans le projet Android mais cela n'a rien résolu, le le vrai problème est que lors de la construction du projet AAR, le code du projet JAR n'est pas fourni.

28
rastadrian

Vous pouvez ajouter cette tâche:

task copyLibs(type: Copy) {
    from configurations.compile
    into 'libs'
}

Les dépendances seront téléchargées à partir de votre Nexus, mais lorsque vous aurez besoin d'un package de bibliothèque, exécutez d'abord cette tâche et les fichiers jar seront copiés et inclus dans le fichier final aar.

43
Héctor

Par défaut, AAR n'inclut aucune dépendance. La solution mentionnée par @Hector devrait fonctionner pour le plugin gradle <3.0. Pour le plugin Gradle 3.0+, essayez la configuration personnalisée comme mentionné ici .

Android { ... }

// Add a new configuration to hold your dependencies
configurations {
    myConfig
}

dependencies {
    ....
    myConfig 'com.Android.support:appcompat-v7:26.1.0'
    myConfig 'com.Android.support:support-v4:26.1.0'
    ...
}

task copyLibs(type: Copy) {
    from configurations.myConfig 
    into "libs"
}
7
nayan

Aucune des suggestions ne m'a aidé pour Gradle 4.6, j'ai donc perdu toute la journée à inventer la mienne.

Finalement, j'ai trouvé un bon Gist et l'ai modifié pour ma version de Gradle: https://Gist.github.com/stepio/824ef073447eb8d8d654f22d73f9f30b

4
stepio