Java 8 导致 :mobile:dexDebug' 异常的 Retrolambda 要求
Retrolambda Requirement for Java 8 Causing :mobile:dexDebug' Exception
尝试让 retrolambda 在我的项目中工作时遇到了很大的问题。那里有很多性问题和解决方案,但我还没有发现任何不求助于将 multiDexEnabled
标志添加到成绩文件的方法。
我收到以下错误。
Error:Execution failed for task ':mobile:dexDebug'.
com.android.ide.common.process.ProcessException: org.gradle.process.internal.ExecException: Process 'command '/Library/Java/JavaVirtualMachines/jdk1.8.0_51.jdk/Contents/Home/bin/java'' finished with non-zero exit value 2
为了解决这个问题,我可以添加 multiDexEnabled true
并且这有效,但是它也会增加我的构建时间 1 分钟,这对于开发来说是不可接受的。
还有其他方法还是我不应该使用 Retrolambda?
编辑 添加了 build.grade 代码。
apply plugin: 'com.android.application'
apply plugin: 'me.tatarka.retrolambda'
android {
compileSdkVersion 22
buildToolsVersion "22.0.1"
defaultConfig {
applicationId "com.myapplication"
multiDexEnabled true
minSdkVersion 11
targetSdkVersion 22
versionCode 1
versionName "1.0"
}
buildTypes {
release {
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
}
}
compileOptions {
sourceCompatibility JavaVersion.VERSION_1_8
targetCompatibility JavaVersion.VERSION_1_8
}
}
buildscript {
repositories {
mavenCentral()
jcenter()
}
dependencies {
classpath 'me.tatarka:gradle-retrolambda:3.2.0'
}
}
repositories {
mavenCentral()
}
dependencies {
compile fileTree(dir: 'libs', include: ['*.jar'])
compile 'com.google.android.gms:play-services-maps:7.5.0'
compile 'com.google.android.gms:play-services-wearable:7.5.0'
compile 'com.google.android.gms:play-services-location:7.5.0'
compile 'com.android.support:appcompat-v7:22.2.1'
compile 'com.android.support:support-v4:22.2.1'
compile 'com.android.support:design:22.2.1'
compile 'com.android.support:cardview-v7:22.2.1'
compile 'com.android.support:recyclerview-v7:22.2.1'
compile 'com.android.support:support-annotations:22.2.1'
compile 'com.jakewharton:butterknife:7.0.1'
compile 'joda-time:joda-time:2.7'
/*Graphs*/
compile 'com.androidplot:androidplot-core:0.6.1'
/*Parse*/
compile project(':ParseLoginUI')
/*Images*/
compile 'com.squareup.picasso:picasso:2.3.3'
compile 'com.makeramen:roundedimageview:2.1.0' // https://github.com/vinc3m1/RoundedImageView
compile 'io.reactivex:rxandroid:0.25.0'
}
编辑 将我的 JDK 版本更改为 1.7 错误后
Error:Execution failed for task ':activity-manager:compileDebugJava'.
When running gradle with java 5, 6 or 7, you must set the path to jdk8, either with property retrolambda.jdk or environment variable
JAVA8_HOME
所以在我的 .bash_profile 中,我这样设置环境变量:
export JAVA_HOME=$(/usr/libexec/java_home)
export JAVA8_HOME=$(/usr/libexec/java_home)
export JAVA7_HOME=$(/usr/libexec/java_home -v 1.7)
现在,当我在终端 echo JAVA8_HOME
中执行以下操作时,它给出了正确的路径,但是我的 Gradle 仍然没有找到它。我正在我的成绩文件中这样测试它。
println("***************** ---------- *******************")
println("JAVA_HOME: " + System.getenv("JAVA_HOME"))
println("JAVA7_HOME: " + System.getenv("JAVA7_HOME"))
println("JAVA8_HOME: " + System.getenv("JAVA8_HOME"))
println("***************** ---------- *******************")
所有这些输出的结果均为空。
编辑 我还用以下代码覆盖了 retrolambda 标签。
retrolambda {
jdk "/Library/Java/JavaVirtualMachines/jdk1.8.0_51.jdk/Contents/Home"
oldJdk "/Library/Java/JavaVirtualMachines/jdk1.7.0_75.jdk/Contents/Home"
javaVersion JavaVersion.VERSION_1_7
}
然后我返回使用 "finished with non-zero exit value 2" 获取原始异常,但现在在项目设置中设置了 JDK 版本。
Error:Execution failed for task ':mobile:dexDebug'.
com.android.ide.common.process.ProcessException: org.gradle.process.internal.ExecException: Process 'command
'/Library/Java/JavaVirtualMachines/jdk1.7.0_75.jdk/Contents/Home/bin/java''
finished with non-zero exit value 2
在我的项目中它工作正常,这是我的build.gradle
代码:
apply plugin: 'com.android.application'
apply plugin: 'me.tatarka.retrolambda'
apply plugin: 'com.neenbedankt.android-apt'
buildscript {
repositories {
mavenLocal()
jcenter()
mavenCentral()
}
dependencies {
classpath 'com.android.tools.build:gradle:1.2.3'
classpath 'com.neenbedankt.gradle.plugins:android-apt:1.4'
classpath 'me.tatarka.retrolambda.projectlombok:lombok.ast:0.2.3.a2'
classpath "me.tatarka:gradle-retrolambda:3.2.0"
}
}
repositories {
mavenCentral()
}
android {
compileSdkVersion 22
buildToolsVersion "22.0.1"
defaultConfig {
applicationId "xyz.com"
minSdkVersion 22
targetSdkVersion 22
multiDexEnabled true
compileOptions {
sourceCompatibility JavaVersion.VERSION_1_8
targetCompatibility JavaVersion.VERSION_1_8
}
dexOptions {
jumboMode = true
}
packagingOptions {
exclude 'META-INF/LICENSE'
exclude 'META-INF/notice.txt'
exclude 'META-INF/license.txt'
}
}
buildTypes {
release {
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.txt'
}
}
}
dependencies {
compile 'com.android.support:support-v4:22.2.1'
compile 'com.android.support:appcompat-v7:21.0.3'
}
仅供参考:我在文件 >> 项目结构 >> SDK 位置 JDK Location
.
中选择了 C:\Program Files\Java\jdk1.7.0_79
这就是我配置 OSx 环境的方式,
安装最新的 java 8
编辑您的 .bash_profile(位于您的主目录中)并添加以下行:
出口JAVA_HOME=/usr/libexec/java_home
导出 JAVA7_HOME=/usr/libexec/java_home -v 1.7
*现在 "java -version" 命令必须显示 java 1.8,但 retrolambda 也可以访问 java 7 主目录。
将这些行添加到您的项目 build.gradle 文件中:
依赖关系{
...
类路径 'me.tatarka:gradle-retrolambda:3.2.5'
类路径 'com.neenbedankt.gradle.plugins:android-apt:1.8'
将 retrolambda 插件应用到您的 android 应用程序模块 build.gradle:
应用插件:'me.tatarka.retrolambda'
*本模块无需添加retrolambda编译依赖
尝试让 retrolambda 在我的项目中工作时遇到了很大的问题。那里有很多性问题和解决方案,但我还没有发现任何不求助于将 multiDexEnabled
标志添加到成绩文件的方法。
我收到以下错误。
Error:Execution failed for task ':mobile:dexDebug'. com.android.ide.common.process.ProcessException: org.gradle.process.internal.ExecException: Process 'command '/Library/Java/JavaVirtualMachines/jdk1.8.0_51.jdk/Contents/Home/bin/java'' finished with non-zero exit value 2
为了解决这个问题,我可以添加 multiDexEnabled true
并且这有效,但是它也会增加我的构建时间 1 分钟,这对于开发来说是不可接受的。
还有其他方法还是我不应该使用 Retrolambda?
编辑 添加了 build.grade 代码。
apply plugin: 'com.android.application'
apply plugin: 'me.tatarka.retrolambda'
android {
compileSdkVersion 22
buildToolsVersion "22.0.1"
defaultConfig {
applicationId "com.myapplication"
multiDexEnabled true
minSdkVersion 11
targetSdkVersion 22
versionCode 1
versionName "1.0"
}
buildTypes {
release {
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
}
}
compileOptions {
sourceCompatibility JavaVersion.VERSION_1_8
targetCompatibility JavaVersion.VERSION_1_8
}
}
buildscript {
repositories {
mavenCentral()
jcenter()
}
dependencies {
classpath 'me.tatarka:gradle-retrolambda:3.2.0'
}
}
repositories {
mavenCentral()
}
dependencies {
compile fileTree(dir: 'libs', include: ['*.jar'])
compile 'com.google.android.gms:play-services-maps:7.5.0'
compile 'com.google.android.gms:play-services-wearable:7.5.0'
compile 'com.google.android.gms:play-services-location:7.5.0'
compile 'com.android.support:appcompat-v7:22.2.1'
compile 'com.android.support:support-v4:22.2.1'
compile 'com.android.support:design:22.2.1'
compile 'com.android.support:cardview-v7:22.2.1'
compile 'com.android.support:recyclerview-v7:22.2.1'
compile 'com.android.support:support-annotations:22.2.1'
compile 'com.jakewharton:butterknife:7.0.1'
compile 'joda-time:joda-time:2.7'
/*Graphs*/
compile 'com.androidplot:androidplot-core:0.6.1'
/*Parse*/
compile project(':ParseLoginUI')
/*Images*/
compile 'com.squareup.picasso:picasso:2.3.3'
compile 'com.makeramen:roundedimageview:2.1.0' // https://github.com/vinc3m1/RoundedImageView
compile 'io.reactivex:rxandroid:0.25.0'
}
编辑 将我的 JDK 版本更改为 1.7 错误后
Error:Execution failed for task ':activity-manager:compileDebugJava'.
When running gradle with java 5, 6 or 7, you must set the path to jdk8, either with property retrolambda.jdk or environment variable JAVA8_HOME
所以在我的 .bash_profile 中,我这样设置环境变量:
export JAVA_HOME=$(/usr/libexec/java_home)
export JAVA8_HOME=$(/usr/libexec/java_home)
export JAVA7_HOME=$(/usr/libexec/java_home -v 1.7)
现在,当我在终端 echo JAVA8_HOME
中执行以下操作时,它给出了正确的路径,但是我的 Gradle 仍然没有找到它。我正在我的成绩文件中这样测试它。
println("***************** ---------- *******************")
println("JAVA_HOME: " + System.getenv("JAVA_HOME"))
println("JAVA7_HOME: " + System.getenv("JAVA7_HOME"))
println("JAVA8_HOME: " + System.getenv("JAVA8_HOME"))
println("***************** ---------- *******************")
所有这些输出的结果均为空。
编辑 我还用以下代码覆盖了 retrolambda 标签。
retrolambda {
jdk "/Library/Java/JavaVirtualMachines/jdk1.8.0_51.jdk/Contents/Home"
oldJdk "/Library/Java/JavaVirtualMachines/jdk1.7.0_75.jdk/Contents/Home"
javaVersion JavaVersion.VERSION_1_7
}
然后我返回使用 "finished with non-zero exit value 2" 获取原始异常,但现在在项目设置中设置了 JDK 版本。
Error:Execution failed for task ':mobile:dexDebug'.
com.android.ide.common.process.ProcessException: org.gradle.process.internal.ExecException: Process 'command '/Library/Java/JavaVirtualMachines/jdk1.7.0_75.jdk/Contents/Home/bin/java'' finished with non-zero exit value 2
在我的项目中它工作正常,这是我的build.gradle
代码:
apply plugin: 'com.android.application'
apply plugin: 'me.tatarka.retrolambda'
apply plugin: 'com.neenbedankt.android-apt'
buildscript {
repositories {
mavenLocal()
jcenter()
mavenCentral()
}
dependencies {
classpath 'com.android.tools.build:gradle:1.2.3'
classpath 'com.neenbedankt.gradle.plugins:android-apt:1.4'
classpath 'me.tatarka.retrolambda.projectlombok:lombok.ast:0.2.3.a2'
classpath "me.tatarka:gradle-retrolambda:3.2.0"
}
}
repositories {
mavenCentral()
}
android {
compileSdkVersion 22
buildToolsVersion "22.0.1"
defaultConfig {
applicationId "xyz.com"
minSdkVersion 22
targetSdkVersion 22
multiDexEnabled true
compileOptions {
sourceCompatibility JavaVersion.VERSION_1_8
targetCompatibility JavaVersion.VERSION_1_8
}
dexOptions {
jumboMode = true
}
packagingOptions {
exclude 'META-INF/LICENSE'
exclude 'META-INF/notice.txt'
exclude 'META-INF/license.txt'
}
}
buildTypes {
release {
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.txt'
}
}
}
dependencies {
compile 'com.android.support:support-v4:22.2.1'
compile 'com.android.support:appcompat-v7:21.0.3'
}
仅供参考:我在文件 >> 项目结构 >> SDK 位置 JDK Location
.
C:\Program Files\Java\jdk1.7.0_79
这就是我配置 OSx 环境的方式,
安装最新的 java 8
编辑您的 .bash_profile(位于您的主目录中)并添加以下行:
出口JAVA_HOME=/usr/libexec/java_home 导出 JAVA7_HOME=/usr/libexec/java_home -v 1.7
*现在 "java -version" 命令必须显示 java 1.8,但 retrolambda 也可以访问 java 7 主目录。
将这些行添加到您的项目 build.gradle 文件中:
依赖关系{ ... 类路径 'me.tatarka:gradle-retrolambda:3.2.5' 类路径 'com.neenbedankt.gradle.plugins:android-apt:1.8'
将 retrolambda 插件应用到您的 android 应用程序模块 build.gradle:
应用插件:'me.tatarka.retrolambda'
*本模块无需添加retrolambda编译依赖