2016-01-25 30 views
5

Android Projesi (gradle) ana uygulama modülü vardır: app - android uygulama (eklenti uygulanır: 'com.android.application') ve java-modülü: Android Uygulama + Java Modülü (Java 1.8)

java modülü varsayılan olarak kaynak kodu uyumluluğu 1.8 sahiptir ve gerçekten çünkü lambda ifadelerinin olmasını istiyorum ağı: - (java 'eklentisi uygulanır).

Ancak Android uygulaması varsayılan olarak 1.7 ve uygulamayı oluşturamıyorum. Tabii benim uygulama yılında retrolambda kullanmak - android modülü, ancak proje nedeniyle derleme değil: Benim java modülü yaparsanız

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 

Her şey iyi derler:

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

ancak bu durumda ben lambda ifadeleri kullanamaz ama ihtiyacım var.

  1. modül değil java ama android-modül ve kullanımı retrolambda olun (Ama .jar bunun böylece bu modülden .aar değil yapacağım:

    yalnızca önümüzdeki çözümleri görmek olmak zorunda java)

  2. Ben de lambda olmadan rxJava aptal kodla eşleşecek yüzünden kullanmak istiyorum benim java modülü gelecekte (.jar) (Ama yılında lambda ifadeleri kullanmayın)

Benim için en iyi çözüm, java modülümde retrolambda gibi bir şey olurdu. Ben böyle bir şey denedim ama retroambda bağımlılıkları (eklentiyi uygula: 'me.tatarka.retrolambda') derleme sırasında hatalardan etkilenmedi. Veya java 1.7'yi retrolambda gibi bir şeyle kullanabilirsin. Ancak derleme dosyası, derleme seçeneklerini ayarlamak için android {...} bölümüne sahip değildir.

Bu nasıl yapılır? Ben FunctionalIterables için yaptıklarına dayanarak

+0

Lambdalar kullanan ancak retrolambdalar kullanarak android üzerinde kullanılacak java 7'de derleyen bir kütüphanem var. Gradle dosyasını ve kütüphaneyi buradan görebilirsiniz: https://github.com/smaspe/FunctionalIterables – njzk2

cevap

3

, senin gradle dosyası bu gibi görünmelidir:

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 
} 

Retrolambda herşey ihtiyaç yoktur (benim gradle dosyanın geri kalanı sadece kütüphane yayıncılık ile ilgilidir) çıktı kavanozunuzu doğru java sürümünü hedeflemek için.

+0

Tnx! Benim için aslında işe yaramıyor, demek istediğim hala derleme değil ama eğer yukarıda yazdığın gibi retrolambda ile yapsam ve bu kavanozu bu durumda içersen işe yarar. –