当两个依赖项对同一个库具有内部依赖关系但在Android中具有不同版本时,gradle如何解决冲突?

时间:2016-12-28 16:40:20

标签: android gradle android-gradle

我的应用程序依赖于两个库。它们都使用相同的库“ org.hamcrest:hamcrest-core ”,但内部使用不同的版本。

androidTestCompile 'junit:junit:4.12' //(Depends on version 1.3)
androidTestCompile 'org.mockito:mockito-core:1.10.19' //(Depends on version 1.1)

由于两个依赖项都与Android instrumentation tests相关,因此应用程序构建成功,并在构建中包含更高版本 - 在本例中为1.3版。

但是,如果我将一个库用于主应用程序,而其他库用于Android Instrumentation测试,则如下所示:

compile 'junit:junit:4.12'
androidTCompile 'org.mockito:mockito-core:1.10.19'

我收到以下错误。

:app:prepareDebugAndroidTestDependencies
Conflict with dependency 'org.hamcrest:hamcrest-core'. Resolved versions for app (1.3) and test app (1.1) differ. See http://g.co/androidstudio/app-test-app-conflict for details.

 FAILED

FAILURE: Build failed with an exception.

* What went wrong:
Execution failed for task ':app:prepareDebugAndroidTestDependencies'.
> Dependency Error. See console for details.

所以我去了异常中给出的链接。出现这种行为的原因如下

  

运行检测测试时,主APK和测试APK共享相同的类路径。如果主APK和测试APK使用相同的库(例如Guava)但是在不同的版本中,Gradle构建将失败。如果gradle没有捕获到,那么您的应用程序在测试期间和正常运行期间可能会有不同的行为(包括在其中一个案例中崩溃)。

到目前为止,我没有任何问题,但在以下情况下我遇到了问题:

1)在下面的声明中,只创建了一个主apk,因为本地单元测试在JVM上运行,那么为什么这会以相同的冲突异常失败

compile 'junit:junit:4.12'
testCompile 'org.mockito:mockito-core:1.10.19'

2)如果上述情况失败,那么这也应该失败。但令人惊讶的是,这种方法很好并且构建良好。

 androidTestCompile 'junit:junit:4.12'
 testCompile 'org.mockito:mockito-core:1.10.19'

我无法理解gradleAndroid中解决依赖关系的这种含糊不清的性质。

0 个答案:

没有答案