2016-01-25 16 views
5

progetto Android (Gradle) ha modulo principale dell'applicazione: app - applicazione Android (a plugin: 'com.android.application') e java-modulo: rete - (a plugin: 'java')Application Module Java Android + (Java 1.8)

modulo Java rete ha compatibilità del codice sorgente 1.8 di default e ho voglia di avere a causa di espressioni lambda.

Ma l'applicazione Android 1.7 per impostazione predefinita e non riesco a creare l'app. Naturalmente io uso retrolambda nel mio app - Modulo Android, ma il progetto non viene compilato correttamente a causa di:

Error:com.android.dx.cf.iface.ParseException: bad class file magic (cafebabe) or version (0034.0000)

Error:Execution failed for task ':app:transformClassesWithDexForDebug'. 
> com.android.ide.common.process.ProcessException: org.gradle.process.internal.ExecException: Process 'command '/Library/Java/JavaVirtualMachines/jdk1.8.0_45.jdk/Contents/Home/bin/java'' finished with non-zero exit value 1 

Tutto compila bene se faccio il mio modulo Java:

apply plugin: 'java' 
sourceCompatibility = 1.7 
targetCompatibility = 1.7 

Ma in questo caso non posso usare espressioni lambda ma ne ho bisogno.

vedo solo prossimi soluzioni:

  1. Fai rete modulo non java ma Android-modulo e l'uso retrolambda (ma ho intenzione di fare non .jar .aar da questo modulo in modo che deve essere java)

  2. non usare le espressioni lambda nel mio modulo Java (.jar in futuro) (Ma voglio usarlo a causa del troppo coincidere con il codice stupido rxJava senza lambda)

La soluzione migliore per me sarebbe qualcosa come retrolambda nel mio modulo java. Ho provato a fare qualcosa di simile, ma le dipendenze retroambda (applicare plugin: 'me.tatarka.retrolambda') non è stata influenzata dagli errori durante la compilazione. O forse usare java 1.7 con qualcosa come retrolambda. Ma il file gradle non ha sezione android {...} per impostare compileOptions.

Come fare questo?

+0

Ho una libreria che utilizza lambdas ma compila in java 7 per essere utilizzato su Android, usando retrolambdas. Puoi vedere il file gradle e la libreria qui: https://github.com/smaspe/FunctionalIterables – njzk2

risposta

3

Sulla base di quello che ho fatto per il FunctionalIterables, il file Gradle dovrebbe essere simile che:

buildscript { 
    repositories { 
     jcenter() 
    } 

    dependencies { 
     classpath 'me.tatarka:gradle-retrolambda:3.2.3' 
    } 
} 

repositories { 
    jcenter() 
} 

apply plugin: 'java' 
apply plugin: 'me.tatarka.retrolambda' 

retrolambda { 
    jdk System.getenv("JAVA8_HOME") 
    oldJdk System.getenv("JAVA7_HOME") 
    javaVersion JavaVersion.VERSION_1_6 
} 

(Il resto del mio file Gradle è legato solo a pubblicare la biblioteca)

Retrolambda fa tutto il necessario per rendere il tuo output jar target la giusta versione java.

+0

Tnx! Per me non funziona in realtà, voglio dire che non si compila ma se faccio .jar con retrolambda come hai postato sopra e includo questo jar in questo caso funziona. –