2015-10-30 19 views
13

Sommario:Come includere JAR dipendenza in una libreria AAR

Ho un file AAR che dipende da un file JAR, quando costruire il progetto AAR, non contiene il codice JAR.

Dettagli:

Ho un progetto libreria Java SDK che contiene il codice che utilizziamo per progetti web Java e così via, questa libreria è creata usando Gradle e risiede in un server nesso interno (come JAR) .

L'obiettivo è fornire una versione "Android configurata" di questa libreria JAR tramite una libreria AAR che più applicazioni Android possono utilizzare e ridurre al minimo lo sforzo (e il codice boilerplate) per implementarlo. Questo file AAR viene anche caricato sul server nexus per essere utilizzato dai progetti delle applicazioni Android.

Il mio progetto AAR include una dipendenza gradle per la mia libreria Java SDK (il JAR), ma una volta creato, l'AAR non include alcuna classe da esso.

Codice:

Questo è il file Gradle del progetto 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' 
} 

Questo è il file Gradle per il mio progetto AAR, nota che ho rimosso le dichiarazioni del repository Maven al mio nexus server da esso. Immagino che non dovrebbe essere importante per questa domanda.

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

Questo è il file Gradle per il mio progetto Android, ancora una volta ho rimosso i riferimenti del server 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:[email protected]') 
} 

NOTA: inizialmente ho risolto il problema aggiungendo il JAR nella directory lib il progetto AAR, ma questo è indesiderato. Rende inutile avere un server nexus. Sarebbe bello poter solo sfiorare il numero di versione del JAR nel file gradle del progetto AAR e l'aggiornamento avviene automaticamente al momento della compilazione.

NOTA 2: Ho provato ad aggiungere transitive=true alla mia dipendenza AAR nel progetto Android, ma non ha risolto nulla, il vero problema è che quando si costruisce il progetto AAR, il codice di progetto JAR non ottiene in bundle.

risposta

25

È possibile aggiungere questo compito:

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

dipendenze verranno scaricati dal Nexus, ma quando è necessario confezionare la biblioteca, eseguire questo compito primo e jar file vengono copiati e incluso all'interno finale aar.

+0

uomo, penso che questo sia quello che stavo cercando, lo proverei e tornerò. Grazie! – rastadrian

+1

Hai provato? –

+0

sì, questo ha risolto il problema. Ho appena aggiunto un 'clean task' per cancellare la directory libs, in base a [questo post] (https://discuss.gradle.org/t/how-do-i-delete-a-subset-of-files/ 6855/2). Dopo questo ho dovuto aggiungere alcune esclusioni nel 'packagingOptions' per alcuni file generati nel' META-INF', ma nel complesso, questo ha funzionato! – rastadrian