5

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

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

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

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)(但我想使用它,因为在没有 lambda 的 rxJava 中太匹配愚蠢的代码)

对我来说最好的解决方案是我的 java 模块中的 retrolambda。我尝试做类似的事情,但是在编译过程中,retroambda 依赖项(应用插件:'me.tatarka.retrolambda')没有受到影响。或者也许使用带有retrolambda之类的java 1.7。但是 gradle 文件没有部分android {...}来设置 compileOptions。

这该怎么做?

4

1 回答 1

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 版本为目标。

于 2016-01-25T16:52:54.813 回答