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 表达式,但我需要它。
我只看到下一个解决方案:
使网络模块不是java而是android模块并使用retrolambda
(但是我打算从这个模块中生成 .jar 而不是 .aar,所以它必须是
java)
不要在我的 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 版本。
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 表达式,但我需要它。
我只看到下一个解决方案:
使网络模块不是java而是android模块并使用retrolambda (但是我打算从这个模块中生成 .jar 而不是 .aar,所以它必须是 java)
不要在我的 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 版本。