Gradle依赖传递

在使用Gradle aar文件时,经常会发生这样的情况,主项目A依赖库项目B,库项目B依赖库项目C和jar包D。这时候主项目在引用库项目B时,写成如下所示的方式。

  1. compile 'com.xxx.xxxxx:xxxxxx:1.0.0-SNAPSHOT'

这样的写法也是一般引用库项目的标准写法,其表示B项目及其依赖的所有项目,即C和D。那么如果C或者D出现重复依赖的问题,或者主项目只想依赖库项目B而不想依赖库项目B所依赖的项目,则可以使用@aar关键字关闭依赖传递,使用方法如下所示。

  1. compile 'com.xxx.xxxxx:xxxxxx:1.0.0-SNAPSHOT@aar'

如果这样引用库项目B,则不会进行依赖传递。但要注意的是,libs目录下的jar文件是不受影响的,开发者在使用过程中需要非常注意。

另外,还可以使用exclude module排除一个库中引用的其他库,例如aar库A依赖了B和C,此时可以通过以下方式进行依赖,代码如下所示。

  1. compile ('com.xxx.yyy:aaa:1.1.1') {
  2. exclude module: 'com.xxx.yyy.bbb:1.1.2'
  3. exclude module: 'com.xxx.yyy.ccc:1.1.3'
  4. }
  5. compile 'com.xxx.yyy.bbb:1.1.2'
  6. compile 'com.xxx.yyy.ccc:1.1.3'

这样也可以在A库中去除B库和C库的依赖。

传递依赖问题是使用Gradle时一定会遇到的问题,不仅仅是依赖传递的库会冲突,而且也会发生资源冲突的问题。因此遇到Gradle编译错误的时候,一定要仔细分析错误的原因,找到冲突的根本原因从而去解决问题。