Yur*_*off 5 java lambda android gradle retrolambda
Android Project(gradle)有主要的应用程序模块: app - android应用程序(apply plugin:'com.android.application')和java-module: network - (apply plugin:'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
Run Code Online (Sandbox Code Playgroud)
如果我创建我的java模块,一切都编译好:
apply plugin: 'java'
sourceCompatibility = 1.7
targetCompatibility = 1.7
Run Code Online (Sandbox Code Playgroud)
但在这种情况下我不能使用lambda表达式,但我需要它.
我只看到下一个解决方案:
使网络模块不是java而是android-module并使用retrolambda(但是我要从这个模块中生成.jar而不是.aar所以它必须是java)
不要在我的java模块中使用lambda表达式(以后的.jar)(但我想使用它,因为rxJava中没有lambda的愚蠢代码太匹配了)
对我来说最好的解决方案就是在我的java模块中使用retrolambda.我试过做类似的事情,但retroambda依赖(apply plugin:'me.tatarka.retrolambda')在编译期间没有受到影响.或者也许使用java 1.7与retrolambda之类的东西.但gradle文件没有部分android {...}来设置compileOptions.
这该怎么做?
根据我对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
}
Run Code Online (Sandbox Code Playgroud)
(我的 gradle 文件的其余部分仅与发布库相关)
Retrolambda 会执行使您的输出 jar 定位到正确的 java 版本所需的一切。
| 归档时间: |
|
| 查看次数: |
1663 次 |
| 最近记录: |