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包不起作用。