将AS项目迁移到IDEA时,无法将com.android.build.gradle.internal.model.ApiVersionImpl强制转换为java.lang.Integer

时间:2014-07-10 14:59:06

标签: android intellij-idea gradle android-studio android-gradle

我需要从Android Studio迁移到IntelliJ IDEA ,因为我需要在Java中执行其他非Android工作。我从git克隆了我的项目并将其导入IDEA;但是,我在进程中遇到了Gradle错误。我搜索过但找不到能解决我错误的答案。

这是事件日志

03:39:42 PM All files are up-to-date
03:39:42 PM ClassCastException: com.android.build.gradle.internal.model.ApiVersionImpl cannot be cast to java.lang.Integer: com.android.build.gradle.internal.model.ApiVersionImpl cannot be cast to java.lang.Integer

settings.gradle(myproject是SO的示例,想要省略实际名称)

include ':myproject'

根目录中的build.gradle(例如/myproject/build.gradle)

buildscript {
    repositories {
        mavenCentral()
    }
    dependencies {
        classpath 'com.android.tools.build:gradle:0.12.+'
    }
}

allprojects {
    repositories {
        mavenCentral()
    }
}

和另一个build.gradle(例如/myproject/myproject/build.gradle)

apply plugin: 'android'

android {
    compileSdkVersion 19
    buildToolsVersion '20'
    defaultConfig {
        minSdkVersion 14
        targetSdkVersion 19
        versionCode 1
        versionName '1.0'
    }

    buildTypes {
        release {
            runProguard false
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.txt'
        }
        debug {
            versionNameSuffix "-alpha"
        }
    }
    productFlavors {
    }

    packagingOptions{
        exclude 'META-INF/DEPENDENCIES.text'
        exclude 'META-INF/LICENSE.txt'
        exclude 'META-INF/NOTICE.txt'
    }
}

dependencies {
    compile fileTree(include: ['*.jar'], dir: 'libs')
    compile 'com.readystatesoftware.systembartint:systembartint:1.0.3'
    compile 'commons-validator:commons-validator:1.4.0'
}

我认为这与Gradle版本或Studio与IDEA之间的不兼容有关,但我不确定。非常感谢答案。感谢。

2 个答案:

答案 0 :(得分:3)

我认为这是因为您的Gradle项目对于IntelliJ IDEA附带的Android插件版本来说太新了。

有几种可能的解决方法:

您可以尝试降级构建文件中Android Gradle插件的版本,直到您点击它将使用的版本。如果您向后移动到其他部分不兼容,这将遇到问题。为此,请减少行中的版本号:

   classpath 'com.android.tools.build:gradle:0.12.+'

但是,如果您这样做,请知道此构建文件与Android Studio的现代版本不兼容。目前还没有一个好的解决方法。

另一种方法是尝试IntelliJ 14 EAP,它可能会有更高版本的插件。请注意,IntelliJ 14仍然处于其开发周期的非常活跃的阶段,并且可能存在错误。使用风险由您自己承担。 http://confluence.jetbrains.com/display/IDEADEV/IDEA+14+EAP

冗长的解释:

有许多不同的作品在起作用:

  1. 您的构建文件
  2. Gradle的Android插件
  3. IntelliJ的Android插件,用于:
  4. Android Studio和
  5. IntelliJ IDEA
  6. #3中的插件与Android Studio和IntelliJ的插件相同,但问题是它的发展非常迅速,Android Studio的发布时间表要快得多,每个版本都附带最新的代码。 IntelliJ IDEA的发布时间表不那么频繁,说实话,我并不完全确定它附带的Android插件;我没有看过他们的分支策略。

    Gradle的Android插件也在迅速发展。通常情况下,这与Android Studio的新版本保持同步;为了支持我们在Android Studio中需要的新功能,用户需要更新的Gradle插件最低版本,反之亦然 - 这就是为什么过去经常会强制迁移插件版本。

    所以发生的事情是您的构建文件需要最新版本的Android Gradle插件,该插件需要最新版本的IntelliJ Android插件,该插件在Studio中提供,但不是当前版本的IJ 13。

    事情正在稳定下来,所以我们希望未来会有所改善。特别是,Android Gradle插件的1.0版本可以跨平台工作,并且即使不是永久性的,也可以长期与所有产品的未来版本兼容。

答案 1 :(得分:1)

您必须使用以前版本的Android工具。版本0.10。+与Idea 13一起使用

所以只需加上

classpath 'com.android.tools.build:gradle:0.10.+'

不幸的是,这不适用于Android工作室或Idea 14 EAP,如果你有同事在同一个项目上工作,那么就没有好的解决方案。

选项是继续使用Idea 13与Android工具0.10。+版本,或迁移到EAP和/或Android工作室并开始使用0.11。+版本的android工具。 :(注意:0.12。+不适用于Idea 14 EAP

或者您可以尝试介绍我们在团队中使用的变通方法,但这不会稳定下来:

在settings.gradle中添加

boolean fromIdea14 = System.properties["idea.version"]?.toString().equals("14")
org.gradle.api.internal.initialization.DefaultScriptHandler.metaClass.toolsVersion = fromIdea14 ? "0.11.+" : "0.10.+"

然后在build.gradle中

buildscript {
  repositories {
    mavenCentral()
  }
  dependencies {
    classpath group: 'com.android.tools.build', name: "gradle", version: getBuildscript().toolsVersion
  }
}

这适用于使用Idea 13的每个人,对于使用14 EAP或AndroidStudio的人,他们应该添加到Gradle VM参数 -Didea.version = 14

注意:如果通过调用gradle本身来配置android项目,那么Idea不会评估脚本,因此获取其他属性或env变量将无效:(唯一的方法是在设置中指定gradle VM参数。