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, quand je construis le projet AAR, il ne contient pas le code JAR.

Détails:

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

le but est de fournir une version "configurée Android" de ce JAR bibliothèque via une bibliothèque AAR que plusieurs Applications Android peuvent utiliser et minimiser l'effort (et le code boilerplate) 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 AAR projet comprend un gradle dépendance pour mon SDK Java de la bibliothèque (le POT) mais lors de la construction, de l'AAR ne comprennent pas les classes.

Code:

C'est le projet Java SDK gradle fichier:

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'
}

c'est le fichier gradle pour mon projet AAR, notez que j'ai supprimé les déclarations du dépôt Maven de mon serveur nexus. Je suppose que ça 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')
}

C'est le fichier gradle pour mon projet Android, encore une fois j'ai supprimé les références au 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')
}

NOTE: j'ai d'abord résolu le problème en ajoutant le JAR dans le répertoire lib du projet AAR, mais c'est indésirables. Cela rend inutile d'avoir un serveur nexus. Il serait bon que nous puissions simplement modifier le numéro de version du JAR dans le fichier gradle du projet AAR et que la mise à jour se fasse automatiquement au moment de la compilation.

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

17
demandé sur Zoe 2015-10-31 00:35:41

2 réponses

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 avez besoin de package de la bibliothèque, exécutez cette tâche en premier et jar les fichiers seront copiés et inclus dans final aar.

35
répondu Héctor 2015-11-05 08:42:34

par défaut, AAR n'inclut pas de dépendances. La Solution mentionnée par @Hector devrait fonctionner pour gradle plugin < 3.0. Pour Gradle plugin 3.0+, essayez custom config 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"
}
1
répondu nayan 2018-05-22 04:32:31