intellij-idea – IntelliJ,Android和Gradle

我试图让我现有的Android项目使用gradle和IntelliJ 12.
以前我让它与maven一起工作,但这似乎不像gradle那么灵活,而且我认为我知道的是我需要更少的子文件夹.

我的Android项目分为干净的java库(:core)和实际的Application(:android).这两个项目都在我的主项目文件夹中.

~-+MainProject
  |--+core
  |  L--build.gradle
  |--+android
  |  L--build.gradle
  |--build.gradle
  L--settings.gradle 

我认为让gradle工作的理想解决方案是将(:core)和(:android)项目视为嵌套项目,这意味着我可以简单地使用我的cmd在MainProject源文件夹中启动gradle任务.

但是我想出了不同的问题:

> Gradle依赖项仅包含在核心项目中

>这意味着在instrumentatetionTest和主项目文件中都没有
目录正确设置为源/测试目录
> IntelliJ不解析我在gradle中添加的任何类作为依赖项(AndroidSDK,junit,mockito,来自:core项目的那些)

>试图使用插件的’想法’,但要么我错了,要么没有解决问题

>我得到了重复的依赖错误,用于构建APK

>必须与junit有关:4.11和mockito-core:我添加了1.9.5
>我试过的:

>删除从属关系 – >构建失败导致某些课程当然无法解决
>改为junit:4.5在其他一些帖子中提到 – >完全没有变化

这是* .gradle配置

MainProject:
   – settings.gradle

include ':core', ':android'

– build.gradle

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

subprojects {
    repositories {
        mavenLocal()
        maven { url "http://repo.maven.apache.org/maven2" }
    }
}

:核心
   – build.gradle

apply plugin: 'java'

dependencies {
    testCompile 'junit:junit:4.11'
    testCompile 'org.mockito:mockito-core:1.9.5'
}

:机器人

apply plugin: 'android'

repositories {
    mavenCentral()
}

dependencies {
     compile project(":core")

     compile 'com.google.android:android:4.1.1.4'

     instrumentTestCompile 'junit:junit:4.11'
     instrumentTestCompile 'org.mockito:mockito-core:1.9.5'
     instrumentTestCompile 'com.google.dexmaker:dexmaker:1.0'
     instrumentTestCompile 'com.google.dexmaker:dexmaker-mockito:1.0'

     instrumentTestCompile 'com.jayway.android.robotium:robotium-solo:3.6'
} 

/* ... androidSettings

我希望有人可以帮助我

MFG Dornathal

最佳答案
好吧,所以你有正确的想法,但你仍然需要一些改变.

您的root build.gradle文件应如下所示:

subprojects {
    repositories {
        mavenCentral()
    }
}

>如果您使用的是本地安装的仓库,则只需要包含mavenLocal().大多数人没有,你的项目中没有任何东西表明你需要一个.
> mavenCentral()可用于替换您正在使用的maven URL.
>我们只需要修改android项目的buildscript,所以我们应该将它本地化为android项目的build.gradle.

您的settings.gradle和核心项目的build.gradle都很好.

但是,你的android项目的build.gradle需要一些更改:

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

apply plugin: 'android'

dependencies {
    compile project(":core")

    instrumentTestCompile 'com.jayway.android.robotium:robotium-solo:3.6'
}

>通过包含android插件,我们直接链接到已安装的SDK.这意味着我们不再需要包含android依赖:compile’c​​om.google.android:android:4.1.1.4′.
>我们不需要包含junit.它由SDK提供,因此我们将使用它.需要注意的一点是SDK只包含JUnit 3.
>我们不需要包括mockito和dexmaker,除非我们实际使用它进行android测试.如果它仅用于java库的测试,我们在这里不需要它.

回答你的问题:

>我不确定你在这里问什么.如果您的项目结构包括您拥有文件的目录等,这可能会有所帮助.
>你的预感是正确的.为测试提供匹配器的Hamcrest对版本1.1和1.3之间的API进行了重大更改. JUnit 4.11依赖于Hamcrest 1.3.然而,Mockito 1.9.5取决于Hamcrest 1.1.因此,当两者都包括在内时,1.3优先于1.1& Mockito不再有效.恢复到JUnit 4.5也是一个问题. Junit 4.5包含Hamcrest 1.1 jar作为文件而不是POM中的依赖项.因此,当我们有相同文件的2个版本时,这将导致问题. JUnit 4.10就是你想要去的地方.这依赖于Hamcrest 1.1并将其包含在POM中而不是文件中.赢了!我也遇到过这方面的问题,而我最好的解决方法就是只看Maven Central上的POM文件,看看他们告诉我的内容.

最后一点说明. Intellij 12无法处理Gradle Multi-project构建.您需要切换到Android Studio或Intellij 13.

转载注明原文:intellij-idea – IntelliJ,Android和Gradle - 代码日志