IntelliJ,Android和Gradle

Dor*_*hal 5 intellij-idea android-gradle-plugin

我试图让我现有的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 
Run Code Online (Sandbox Code Playgroud)

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

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

  1. Gradle依赖项仅包含在核心项目中
    • 这意味着在instrumentatetionTest和主项目文件中都没有正确设置为源/测试目录的任何目录
    • IntelliJ不解析我在gradle中添加的任何类作为依赖项(AndroidSDK,junit,mockito,来自:core项目的那些)
      • 试图使用插件'的想法',但要么我错了,要么没有解决问题
  2. 我为构建APK获得了重复依赖错误
    • 必须与junit有关:4.11和mockito-core:我添加了1.9.5
    • 我试过的:
      • 删除依赖项 - >构建失败导致某些类当然无法解决
      • 改为junit:4.5+在其他一些帖子中被提及 - >根本没有变化

这是*.gradle配置

MainProject: - settings.gradle

include ':core', ':android'
Run Code Online (Sandbox Code Playgroud)

- 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" }
    }
}
Run Code Online (Sandbox Code Playgroud)

:core - build.gradle

apply plugin: 'java'

dependencies {
    testCompile 'junit:junit:4.11'
    testCompile 'org.mockito:mockito-core:1.9.5'
}
Run Code Online (Sandbox Code Playgroud)

:机器人

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
Run Code Online (Sandbox Code Playgroud)

我希望有人可以帮助我

MFG Dornathal

Mar*_*art 6

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

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

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

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

build.gradle然而,您的Android项目需要一些更改:

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'
}
Run Code Online (Sandbox Code Playgroud)
  • 通过包含android插件,我们直接链接到已安装的SDK.这意味着我们不再需要包含android依赖:compile 'com.google.android:android:4.1.1.4'.
  • 我们不需要包含junit.它由SDK提供,因此我们将使用它.需要注意的一点是SDK只包含JUnit 3.
  • 我们不需要包括mockito,dexmaker除非我们实际使用它进行Android测试.如果它仅用于java库的测试,我们在这里不需要它.

回答你的问题:

  1. 我不确定你在这里问什么.如果您的项目结构包括您拥有文件的目录等,这可能会有所帮助.
  2. 你的预感是正确的.为测试提供匹配器的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.