我正在使用AndroidStudio和Gradle在源代码“ androidTest”中构建带有测试的Android应用。我添加了一个新的依赖项,现在在AndroidStudio或通过“ ./gradlew connectedCheck”运行Android测试时遇到以下问题。解决此问题的首选方法是什么?
'警告:与依赖项冲突'org.somelibrary:library-core'。应用和测试应用的解析版本有所不同。
从Android Gradle插件1.1.1开始,错误显示如下:“警告:与依赖项'com.google.code.findbugs:jsr305'的冲突。应用(1.3.9)和测试应用(2.0.1)的已解决版本不同。”
在为您的应用构建并运行Android测试时,Android Gradle插件会生成两个APK(应用和测试APK)。在gradle运行期间,将比较应用程序和测试版本的依赖关系。当版本号相同时,两者中都存在的依赖项将从测试版本中删除。当使用相同的依赖项,但版本号不同时,您将需要手动解决依赖项冲突,并且会出现此错误。
要解决冲突,首先需要弄清楚两个冲突的版本。如果您尚未使用Android Gradle插件v1.1.1 +,则如果升级到该版本,错误消息将为您提供冲突的版本号。选择您需要的那个。
*在冲突编号之间进行选择时,请务必记住,除非您已覆盖默认的gradle依赖关系解析策略(failOnVersionConflict),否则应用程序内部将发生冲突,并且测试版本(单独)将通过选择较大版本来解决。
现在,您需要决定如何解决冲突。如果您需要强制使用库的较低版本(1.2),则需要强制将应用程序和测试版本的依赖关系都解析为库的特定版本,如下所示:
// Needed to resolve app vs test dependencies, specifically, transitive dependencies of
// libraryq and libraryz. Forcing the use of the smaller version after regression testing.
configurations.all {
resolutionStrategy.force 'org.somelibrary:library-core:1.2'
}
如果您需要使用2.1版本的依赖关系,则也可以使用上面的代码段,但是无论传递依赖更新是否需要,都永远不会开始使用库的较新版本。另外,您也可以向应用程序或测试版本添加新的常规依赖项(无论使用哪种1.2版本的依赖项)。这将迫使应用程序或测试构建依赖于(先前提到的)gradle依赖关系解析策略,因此对该构建使用库的2.1版本。
// Force the use of 2.1 because the app requires that version in libraryq transitively.
androidTestCompile 'org.somelibrary:library-core:2.1'
要么
// Force the use of 2.1 because the Android Tests require that version in libraryz.
compile 'org.somelibrary:library-core:2.1'
在此解决方案中,该错误可能会再次出现,例如说版本3.3,此错误开始仅在测试或应用程序构建之一中使用,但这通常是可以的,因为在构建时会通知您另一个不兼容问题,并且可以采取措施。
更新:此问题的一些新解决方案现在也列出了从声明的依赖项中排除特定的传递性依赖项。这是一个有效的解决方案,但会使开发人员承担更多责任。就像上面的强制依赖解决方案建议将版本硬编码到构建中一样,exclude-transitive-dependency解决方案专门覆盖了库的规定要求。有时,库开发人员会在其他各种库中遇到bug或解决bug,因此,在实施这些解决方案时,您可能会面临不得不隐藏非常难理解的bug的风险。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句