Gradle 的冲突解决不适用于 Android 项目?
Gradle's conflict resolution doesn't work with Android projects?
我正在尝试编译一个依赖树类似于
的模块
+--- com.squareup.burst:burst-junit4:1.0.2
| +--- com.squareup.burst:burst:1.0.2
| \--- junit:junit:4.11 -> 4.12
| \--- org.hamcrest:hamcrest-core:1.3
+--- com.android.support.test.espresso:espresso-core:2.0
| +--- com.squareup:javawriter:2.1.1
| +--- org.hamcrest:hamcrest-integration:1.1
| | \--- org.hamcrest:hamcrest-core:1.1 -> 1.3
| +--- org.hamcrest:hamcrest-library:1.1
| | \--- org.hamcrest:hamcrest-core:1.1 -> 1.3
| +--- com.android.support.test.espresso:espresso-idling-resource:2.0
| +--- com.android.support.test:testing-support-lib:0.1
| | \--- junit:junit-dep:4.10
| | \--- org.hamcrest:hamcrest-core:1.1 -> 1.3
| +--- com.google.code.findbugs:jsr305:2.0.1
| +--- javax.annotation:javax.annotation-api:1.2
| \--- org.hamcrest:hamcrest-core:1.1 -> 1.3
...
如您所见,存在 hamcrest-core
版本冲突,但 gradle 似乎识别出冲突并应用其默认的 "latest version" 策略,这正是我想要的。
但是,当尝试 运行 assembleDebugTest
(手动或通过 Android Studio)时,我得到
com.android.dex.DexException: Multiple dex files define Lorg/hamcrest/MatcherAssert;
一些类似问题的答案建议 exclude
处理不需要的 jar,但我遇到过很多类似的冲突,而且有点失控了。
为什么 gradle 的默认冲突策略没有自动删除旧的 jar? android gradle 插件会抑制该功能吗?
经过更多挖掘,问题似乎是我的依赖关系树包含 hamcrest-core
1.3 和 hamcrest-integration
1.1,并且 MatcherAssert
从 hamcrest-integration
移动到 hamcrest-core
在这些版本之间。
所以 gradle 正在按照记录执行冲突解决;我没想到不同模块之间会发生冲突。
为所有三个 hamcrest 模块强制使用 1.3 解决了这个问题。
我正在尝试编译一个依赖树类似于
的模块+--- com.squareup.burst:burst-junit4:1.0.2
| +--- com.squareup.burst:burst:1.0.2
| \--- junit:junit:4.11 -> 4.12
| \--- org.hamcrest:hamcrest-core:1.3
+--- com.android.support.test.espresso:espresso-core:2.0
| +--- com.squareup:javawriter:2.1.1
| +--- org.hamcrest:hamcrest-integration:1.1
| | \--- org.hamcrest:hamcrest-core:1.1 -> 1.3
| +--- org.hamcrest:hamcrest-library:1.1
| | \--- org.hamcrest:hamcrest-core:1.1 -> 1.3
| +--- com.android.support.test.espresso:espresso-idling-resource:2.0
| +--- com.android.support.test:testing-support-lib:0.1
| | \--- junit:junit-dep:4.10
| | \--- org.hamcrest:hamcrest-core:1.1 -> 1.3
| +--- com.google.code.findbugs:jsr305:2.0.1
| +--- javax.annotation:javax.annotation-api:1.2
| \--- org.hamcrest:hamcrest-core:1.1 -> 1.3
...
如您所见,存在 hamcrest-core
版本冲突,但 gradle 似乎识别出冲突并应用其默认的 "latest version" 策略,这正是我想要的。
但是,当尝试 运行 assembleDebugTest
(手动或通过 Android Studio)时,我得到
com.android.dex.DexException: Multiple dex files define Lorg/hamcrest/MatcherAssert;
一些类似问题的答案建议 exclude
处理不需要的 jar,但我遇到过很多类似的冲突,而且有点失控了。
为什么 gradle 的默认冲突策略没有自动删除旧的 jar? android gradle 插件会抑制该功能吗?
经过更多挖掘,问题似乎是我的依赖关系树包含 hamcrest-core
1.3 和 hamcrest-integration
1.1,并且 MatcherAssert
从 hamcrest-integration
移动到 hamcrest-core
在这些版本之间。
所以 gradle 正在按照记录执行冲突解决;我没想到不同模块之间会发生冲突。
为所有三个 hamcrest 模块强制使用 1.3 解决了这个问题。