2013-11-21 34 views
5

我想讓我現有的Android項目與gradle和IntelliJ 12一起工作。 以前我曾經使用過maven,但似乎沒有gradle那麼靈活,並且從我的想法我知道是我需要更少的子文件夾。我的Android項目分爲乾淨的java庫(:core)和實際的應用程序(:android)。這兩個項目都在我的主項目文件夾中。IntelliJ,Android和Gradle

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

我認爲理想的解決方案,使gradle這個工作,這是治療(:核心)和(:機器人)項目爲嵌套的項目,這意味着我可以簡單地與我在MainProject源文件夾CMD啓動gradle任務。

不過,我想出了不同的問題:

  1. 搖籃依賴只包含在覈心項目
    • 這意味着既不在instrumentatetionTest也不在主項目文件的任何 目錄正確設置爲源/測試目錄
    • IntelliJ不解決我添加爲gradle中的依賴關係的任何類(AndroidSDK,junit,mockito,來自:core項目的那些)
      • 試圖使用該插件「想法」,但無論是我用錯了或者它並沒有解決問題
  2. 我得到重複的相關性錯誤爲建設APK
    • 必須有東西做使用JUnit:4.11和的Mockito核心:1.9.5我添加
    • 我的嘗試:
      • 刪除dependencys - >構建失敗造成當然could'nt的一些類來解決
      • 改變JUnit的:4.5 +作爲suggesed在一些其他線程 - 在所有

>沒有改變這裏是* .gradle configuartions

MainProject: - 設置。 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" } 
    } 
} 

:core - 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

回答

6

好了,所以你有正確的想法,但也有你仍然需要做一些改變。

你的根build.gradle文件應該如下:

subprojects { 
    repositories { 
     mavenCentral() 
    } 
} 
  • 你只需要包括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' 
} 
  • 通過包括Android插件,我們直接鏈接到已安裝的SDK。這意味着我們不再需要包含android依賴項:compile 'com.google.android:android:4.1.1.4'
  • 我們不需要包含junit。它由SDK提供,所以我們將使用它。有一點需要注意的是,SDK只包含JUnit 3.
  • 我們不需要包含mockitodexmaker,除非我們實際上將它用於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中的依賴項。所以當我們有兩個版本的同一個文件時,這會導致問題。 JUnit 4.10是你想要去的地方。這對Hamcrest 1.1具有依賴性,並將其包含在POM中而不是作爲文件。贏得勝利!我也遇到過這方面的問題,我想要弄明白的最好方法就是看Maven Central上的POM文件,看看他們告訴我什麼。

最後一個注意事項。Intellij 12無法處理Gradle Multi-project構建。您需要切換到Android Studio或Intellij 13。

+0

超級不錯的回答馬呂斯。我認爲他在第一點的問題是關於如何從android build.gradle文件中指定測試源目錄。但對我來說也不完全清楚。我使用的是AndroidStudio,因此我不確定我的答案在這裏會有幫助。感謝JUnit提示;) – khose

+0

由於Android Studio是IntelliJ與ADT已經捆綁在一起,我認爲應該沒有任何區別。 – Dornathal

+0

當然,對於jUnit 4.11,如果SDK只包含JUnit 3,他確實需要依賴項 – RichieHH