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

Android Application + Java Module (Java 1.8)

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

java 模块 network 默认具有源代码兼容性 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模块并使用retrolambda (但是我打算从这个模块中生成 .jar 而不是 .aar,所以它必须是 java)

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

对我来说最好的解决方案是我的 java 模块中的 retrolambda。我尝试做类似的事情,但 retroambda 依赖项(应用插件:'me.tatarka.retrolambda')在编译期间没有受到影响错误。 或者可以将 java 1.7 与 retrolambda 之类的东西一起使用。 但是 gradle 文件没有 android {...} 部分来设置编译选项。

如何操作?

根据我为 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 版本。