2014-04-01 15 views
68

Ho studiato un po 'e probabilmente ha visto le risposte più popolari qui legati alla AAR e dipendenze transitive ma in qualche modo non è ancora chiaro per me come fare questo lavoro.transitiva non dipendenze risolto per la libreria AAR utilizzando Gradle

Quindi:

devo biblioteca androide con data config Gradle:

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

allora sono distribuirlo ai pronti contro termine Maven locale con gradle install. file di POM della biblioteca schierato assomiglia a questo:

<?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> 

E infine config Gradle della mia applicazione Android utilizzando sopra biblioteca come una dipendenza:

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:[email protected]' 
} 

E dopo la distribuzione di applicazioni sul telefono sto ottenendo NoClassDefFoundError per classi che appartengono alle dipendenze di compilazione della mia libreria Android.

Ispezione mie dipendenze delle applicazioni Android utilizzando 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 

Secondo albero sopra, non vengono rilevate tutte le dipendenze transitive. Dov'è il problema e come dovrebbe essere fatto correttamente?

+1

avete esaminato l'uscita di correre ** 'DEPE Gradle ndencies' ** per la tua app? – CommonsWare

+0

E sei proprio sicuro di volere la parola chiave 'provided' lì? Secondo Xav, [tali dipendenze non sono impacchettate nell'APK] (https://groups.google.com/d/msg/adt-dev/WIjtHjgoGwA/h1gS9J5xLUAJ), e penserei che vorreste che fossero impacchettate nell'APK. – CommonsWare

+0

@CommonsWare 'gradle dependencies' per il mio android lib: default - Configurazione per gli artefatti predefiniti. + --- com.google.code.gson: gson: 2.2.4 + --- com.bugsense.trace: bugsense: 3.6 \ --- commons-net: commons-net: 3.3 – mkorszun

risposta

72

Ho risolto il mio problema impostando l'attributo transitive per la mia dipendenza AAR:

compile ('com.somepackage:LIBRARY_NAME:[email protected]'){ 
    transitive=true 
} 
+3

Hai provato a omettere '@ aar' invece? –

+1

+1 funziona come un fascino – Abhijit

+3

@PeterNiederwieser Se si omette il '@ aar', Gradle tenta di catturare l'artefatto come file .jar. Questo uccide la build. – cwc

14

non si dovrebbe usare "@aar", se l'uso "@" è diventato "Artifact only notation", se si desidera utilizzare "@" e vogliono avere la dipendenza transitiva, si dovrebbe aggiungere "transitiva = true"

+1

Questa risposta è utile. C'è stato un refuso nel mio commento precedente e l'ho cancellato. Grazie per la tua risposta, buona giornata :). – srain

12

Prova questa se si utilizza AAR a livello locale:

compile(project(:your-library-name)) { 
    transitive=true 
} 
+4

Ciao, non funziona per me. Ho creato un progetto di libreria che utilizza internamente la libreria di volley. Ho incluso il file aar creato usando il progetto di libreria nella mia applicazione. Ricevo l'errore "Errore: (8, 26) errore: il pacchetto com.android.volley non esiste". Nel mio progetto di biblioteca, ho incluso pallavolo usando compile (progetto (': volley')) { transitive = true } – Manish

+2

Hey Manish, di fronte allo stesso problema, hai trovato qualche soluzione? – Jalpesh

+0

non funziona, classe def non trovata – yongsunCN

Problemi correlati