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

5

Android项目(gradle)有主应用程序模块: app- Android应用程序(应用插件: 'com.android.application') 和java模块: network- (应用插件: '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. network模块从java转为android模块,并使用retrolambda (但我将从此模块制作.jar而不是.aar,因此它必须是java)

  2. 不要在我的java模块(.jar在未来)中使用lambda表达式 (但由于rxJava中太多愚蠢的代码没有lambda,我想使用它)

对我而言最好的解决方案是在我的java模块中使用类似于retrolambda的东西。我尝试做了类似的事情,但是retroambda依赖项(apply plugin: 'me.tatarka.retrolambda')在编译过程中出现错误。 或者可能使用类似于retrolambda的东西的java 1.7。 但gradle文件没有

android {...}
来设置compileOptions。

如何做到这一点?


我有一个使用lambda表达式的库,但是编译成Java 7以在Android上使用,使用retrolambdas。您可以在此处查看gradle文件和库:https://github.com/smaspe/FunctionalIterables - njzk2
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版本。


谢谢!对我来说实际上并没有起作用,我的意思是它仍然无法编译,但如果我按照您上面发布的方法使用retrolambda制作.jar文件,并在这种情况下包含此jar文件,则可以正常工作。 - Yura Buyaroff

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接