Android应用程序+ Java模块(Java 1.8)

时间:2016-01-25 16:37:27

标签: java android gradle lambda retrolambda

Android Project(gradle)有主要的应用模块: app - Android应用程序(应用插件:' com.android.application') 和java模块: 网络 - (应用插件:' java')

java模块网络默认情况下源代码兼容性为1.8,因为lambda表达式,我真的想拥有它。

但默认情况下Android应用程序1.7我无法构建应用程序。 当然我在我的 app - android模块中使用了retrolambda,但项目因为以下原因而无法编译:

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

如果我创建我的java模块,那么所有内容都会编译好:

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

但在这种情况下,我不能使用lambda表达式,但我需要它。

我只看到下一个解决方案:

  1. 使网络模块不是java而是android-module并使用retrolambda (但是我要从这个模块中制作.jar不是.aar所以它必须是 JAVA)

  2. 不要在我的java模块中使用lambda表达式(将来会.jar)(但是 我想使用它,因为在rxJava中没有匹配愚蠢的代码 拉姆达)

  3. 对我来说最好的解决方案就是在我的java模块中使用retrolambda。我试过做类似的事情但是retroambda依赖(apply plugin:' me.tatarka.retrolambda')在编译期间没有受到影响的错误。 或者也许使用java 1.7与retrolambda之类的东西。 但gradle文件没有 android {...} 部分来设置compileOptions。

    怎么做?

1 个答案:

答案 0 :(得分:3)

根据我对FunctionalIterables所做的操作,您的gradle文件应如下所示:

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
}

(我的gradle文件的其余部分仅与发布库有关)

Retrolambda会尽一切努力使您的输出jar定位到正确的java版本。