1、声明依赖
依赖属性
最普遍的依赖称为外部依赖,这些依赖存放在外部仓库中。类似Maven,一个外部依赖可以由以下属性指定:
group属性指定依赖的分组(在Maven中,就是groupId)。
name属性指定依赖的名称(在Maven中,就是artifactId)。
version属性指定外部依赖的版本(在Maven中,就是version)。
classifier: 有时候需要另外一个属性来进一步的说明,比如说明运行时的环境 (Maven中,就是classifier)。
还有一种常见依赖是文件依赖,例如
dependencies {
// //putting all jars from 'libs' onto compile classpath
compile fileTree(include: ['*.jar'], dir: 'libs')
//declaring arbitrary files as dependencies
compile files('hibernate.jar', 'libs/spring.jar')
}
以下是一些依赖配置项:
compile是默认的那个,其含义是包含所有的依赖包,即在APK里,compile的依赖会存在。
apk的意思是apk中存在,但是不会加入编译中,这个貌似用的比较少。
provided的意思是提供编译支持,但是不会写入apk。
testCompile和androidTestCompile会添加额外的library支持针对测试。
理解依赖的API
每个Gradle项目都有一个DependencyHandler的实例,你可以通过getDependencies()方法来获取依赖处理器的引 用,每一种依赖类型(如外部依赖、文件依赖等)在依赖处理器中都有一个相对应的方法。每一个依赖都是Dependency的一个实例,group, name, version, 和classifier这几个属性用来标识一个依赖,下图清晰的表示了项目(Project)、依赖处理器(DependencyHandler)和依赖三者之间的关系:
2、查看依赖关系
在文件目录下或 Android Studio的 Terminal下敲 gradlew -q app:dependencies 命令,便有以下输出(部分截图):
(*)星号标记表示是忽略这个依赖的意思,也就是说不去下载这个库。
(->)箭头符号表示被强转变依赖于
gradle对于需要多个版本的依赖库来说,一般只会下载你配置导入那个版本,如果没有手动导入,那就会下载所有模块依赖的最新版本那个库,面对多个模块依赖同一个库,每个模块不都会去下载该依赖库,而是下载一个该依赖库,共享给多个模块。
3、依赖冲突
Gradle解决冲突有以下几种方式
(1) 最近版本策略(默认):下载较新版本
(2) 冲突失败策略:发生冲突时,编译失败(有些新版本库并不兼容之前的,因此这个库可以让开发者主动作出选择)
(3) 强制指定版本策略:发生冲突时,使用开发者指定的版本
排除传递依赖的方式有两种:
- 1.直接在configuration中排除
configurations {
compile.exclude module: 'commons'
all*.exclude group: 'org.gradle.test.excludes', module: 'reports'
}
- 2.在具体的某个dependency中排除。
compile('org.hibernate:hibernate:3.1') {
// 冲突时优先使用该版本
force = true
// 依据构建名称排除
exclude module: 'cglib'
// 依据组织名称排除
exclude group: 'org.jmock'
// 依据组织名称+构件名称排除
exclude group: 'org.unwanted', module: 'iAmBuggy'
// 为本依赖关闭依赖传递特性
transitive = false
}
compile("org.springframework:spring-web:4.3.4.RELEASE{
transitive = false
}
compile `org.springframework:spring-web:4.3.4.RELEASE@jar`
采用指定 transitive = false 的方式来关闭依赖传递特性,也可以采用添加@jar的方式忽略该依赖的所有传递性依赖。
exclude可以接收group和module两个参数,这两个参数可以单独使用也可以搭配使用,其中module可以理解为对应GAV中的artifactId,也就是compile group: ‘org.gradle.test.classifiers’, name: ‘service’, version: ‘1.0’中的中间name部分。
4、复制依赖文件
在build.gradle文件中加入如下代码
configurations {
//设置后不会复制下层依赖的文件
compile.transitive = false
}
task copyAllDependencies(type: Copy) {
//referring to the 'compile' configuration
from configurations.compile
into 'allLibs'
}
执行copyAllDependencies任务后,会将项目所依赖的所有(这里是第一层依赖的文件)文件都复制到allLibs目录下。
5、发布 artifacts
依赖配置也可以用来发布文件(这令人困惑)。 我们称这些文件publication artifacts, 或者就叫 artifacts。
插件可以很好的定义一个项目的 artifacts, 所以你并不需要做一些特别的工作来让 Gradle 需要发布什么. 你可以通过在 uploadArchives 任务里加入仓库来完成. 下面是一个发布远程 Ivy 库的例子:
发布一个 Ivy 库
uploadArchives {
repositories {
ivy {
credentials {
username "username"
password "pw"
}
url "http://repo.mycompany.com"
}
}
}
现在, 当你运 gradle uploadArchives, Gradle 将构建和上传你的 Jar。