Gradle特性

Gradle特性

传递性依赖

Gradle在依赖配置上面,和Maven一样,支持传递性依赖,然后和Maven不同的是,它还支持排除传递性依赖以及关闭传递性依赖。

compile ('android.support.nb.refreshview:refreshview:0.1@aar'){
        transitive = true
    }

该意为传递性依赖,会将该aar中依赖的其他jar,或者aar引入其中,所以如果该aar是公网aar,切记其对应工程的compile包含的jar和对应的aar必须可以在公网找到,而不是利用

compile project(':framework')

这样的方式,因为如果支持了传递性依赖,会默认去下载framework-unspecial这个对应的aar,即如你想使用该aar,且也需要去传递依赖,该library对应的dependencies需要写为:

compile 'android.support.nb.framework:framework:0.1@aar'

这样传递依赖就会先去下载framework-0.1.aar,再去下载refreshview-0.1.aar;

排除传递性依赖

如果refreshview-0.1.aar里面包含了数个依赖包,例如a.jar,而因为你的其他aar也包含有a.jar,这样就会导致jar包重复,出现:

Error:Execution failed for task ':app:processDebugResources'.
Error: more than one library with package name 'com.neu.framework'
You can temporarily disable this error with android.enforceUniquePackageName=false
However, this is temporary and will be enforced in 1.0

所以你可以选择排除传递依赖

compile('javax.servlet.jsp.jstl:jstl-api:1.2') {
        exclude(module: 'servlet-api')      // 防止版本冲突
    }
关闭传递性依赖
compile ('android.support.nb.refreshview:refreshview:0.1@aar'){
        transitive = false
    }

注意:默认情况下, 传递性依赖为transitive = false

当你在aar中定义了相关组件,同时在app中有相关xml的定义,切记需要开启传递性依赖,如果关闭将会出现对应的组件类不会被找到。

dependencies属性值

compile: compile是对所有的build type以及favlors都会参与编译并且打包到最终的apk文件中。

compile 'com.github.orhanobut:logger:1.12'

Provided: Provided是对所有的build type以及favlors只在编译时使用,类似eclipse中的external-libs,只参与编译,不打包到最终apk。

provided project(':framework')

APK: 只会打包到apk文件中,而不参与编译,所以不能再代码中直接调用jar中的类或方法,否则在编译时会报错。

Test compile:Test compile 仅仅是针对单元测试代码的编译编译以及最终打包测试apk时有效,而对正常的debug或者release apk包不起作用。

    原文作者:neu
    原文地址: https://segmentfault.com/a/1190000004018407
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞