Cómo incluir la dependencia JAR en una biblioteca AAR

Resumen:

Tengo un archivo AAR que depende de un archivo JAR, cuando construyo el proyecto AAR, no contiene el código JAR.

Detalles:

Tengo un proyecto de biblioteca SDK de Java que contiene código que usamos para proyectos web Java y, por lo tanto, esta biblioteca se crea utilizando Gradle y reside en un servidor nexus interno (como un JAR).

El objective es proporcionar una versión “configurada para Android” de esta biblioteca JAR a través de una biblioteca AAR que múltiples aplicaciones de Android pueden usar y minimizar el esfuerzo (y el código repetitivo) para implementarlo. Este archivo AAR también se carga en el servidor nexus para ser utilizado por los proyectos de la aplicación Android.

Mi proyecto AAR incluye una dependencia gradle para mi biblioteca Java SDK (el JAR) pero cuando se construye, el AAR no incluye ninguna clase.

Código:

Este es el archivo gradle del proyecto 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' } 

Este es el archivo gradle para mi proyecto AAR, tenga en cuenta que eliminé las declaraciones del repository Maven de mi servidor nexus. Supongo que no debería importar por el bien de esta pregunta.

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

Este es el archivo gradle para mi Proyecto Android, de nuevo eliminé las referencias del servidor 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') } 

NOTA: Inicialmente resolví el problema agregando el JAR en el directorio lib del proyecto AAR, pero esto no es deseado. Hace que tener un servidor nexo sea inútil. Sería bueno que simplemente podamos encontrar el número de versión del JAR en el archivo gradle del proyecto AAR y la actualización se realice automáticamente en el momento de la comstackción.

NOTA 2: Intenté agregar transitive=true a mi dependencia AAR en el Proyecto Android, pero no solucionó nada, el verdadero problema es que cuando se construye el proyecto AAR, el código del proyecto JAR no se empaqueta.

Puedes agregar esta tarea:

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

Las dependencias se descargarán de tu Nexus, pero cuando necesites empaquetar la biblioteca, ejecuta primero esta tarea y los archivos jar se copiarán e incluirán en el aar final.

Por defecto, AAR no incluye ninguna dependencia. La solución mencionada por @Hector debería funcionar para el plugin de gradle <3.0. Para el plugin de Gradle 3.0+, pruebe la configuración personalizada como se menciona aquí .

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