依赖管理
依赖传递管理:完全控制项目中的依赖关系树;
支持自定义依赖项的定义:构建脚本具备描述依赖层次结构的能力
完全兼容maven和ivy
能够兼容maven和ivy库
声明依赖
- compile 该依赖对于编译发行是必须的。
- runtime 该依赖对于运行时是必须的,默认包含编译时依赖。
- testCompile 该依赖对于编译测试是必须的,默认包含编译产品依赖和编译时依赖。
- testRuntime 该依赖对于测试是必须的,默认包含编译、运行时、测试编译依赖。
- providedCompile 运行环境提供
依赖类型分类
外部依赖
从maven仓库或者ivy仓库中下载依赖dependencies { compile group: 'org.springframework', name: 'spring-core', version: '2.5' compile 'org.springframework:spring-core:2.5' }
默认情况下,gradle会查找对应的pom.xml文件,解析并下载当前模块及其依赖的模块。如果不想下载对应的依赖模块,可以如下配置:dependencies { compile group: 'org.springframework', name: 'spring-core', version: '2.5', ext: 'jar' compile "org.springframework:spring-core:2.5@jar" }
默认情况下,gradle是支持传递依赖的,想要禁止传递可以如下配置:
默认情况下,当jar包发生版本冲突时,gradle采用高版本的jar,如果想强制使用当前版本jar包时,可以如下配置:compile("org.springframework:spring-core:2.5"){ transitive = false }
排除对某个jar包的依赖,可以如下配置:compile("org.springframework:spring-core:2.5"){ force = true }
compile("org.springframework:spring-core:2.5"){ exclude module: 'cglib' //by artifact name exclude group: 'org.jmock' //by group }
对同一个Project的其他模块依赖
compile project(‘:common’)
本地文件依赖
//依赖项目根目录lib目录下的jar包 compile fileTree(dir: "${rootProject.projectDir}/lib", include: '*.jar') compile files('libs/a.jar', 'libs/b.jar')
客户端依赖-传递依赖Client module dependencies allow you to declare transitive dependencies directly in the build script. They are a replacement for a module descriptor in an external repository.
dependencies { runtime module("org.codehaus.groovy:groovy:2.4.4") { dependency("commons-cli:commons-cli:1.0") { transitive = false } module(group: 'org.apache.ant', name: 'ant', version: '1.9.4') { dependencies "org.apache.ant:ant-launcher:1.9.4@jar", "org.apache.ant:ant-junit:1.9.4" } } }
动态声明依赖
使用1.x版本的最新子版本,可以配置:
{
compile('group:name:1.+')
}
依赖冲突解决策略
每个Gradle项目都有一个DependencyHandler的实例,你可以通过getDependencies()方法来获取依赖处理器的引 用,上表中每一种依赖类型在依赖处理器中都有一个相对应的方法。每一个依赖都是Dependency的一个实例,group, name, version, 和classifier这几个属性用来标识一个依赖,下图清晰的表示了项目(Project)、依赖处理器(DependencyHandler)和依赖 三者之间的关系:
Gradle提供了2种解决冲突的策略:
使用最新版本的依赖
适用于jar版本向后兼容的依赖,默认处理策略;通过如下配置实现该策略:直接build失败
当发生依赖冲突时,直接build失败,强制要求解决所有的版本冲突。configurations.all { resolutionStrategy { //出现版本冲突时,build失败 failOnVersionConflict() //强制指定某些jar包的版本(包括依赖传递的jar包): force 'asm:asm-all:3.3.1' // cache dynamic versions for 10 minutes cacheDynamicVersionsFor 10*60, 'seconds' // don't cache changing modules at all cacheChangingModulesFor 0, 'seconds' } }
强制指定项目中某些依赖的版本
解决依赖冲突的一种补充手段,可以强制指定整个项目对某个jar版的依赖版本,包括传递依赖,可以如下配置:
configurations{
//强制指定项目依赖的jar版版本,android项目中的封板功能既是该功能实现的
compile.resolutionStrategy{
force "commons-logging:commons-logging:1.1.2"
}
//禁止整个项目compile周期下的jar包传递依赖功能
compile.transitive = false
//same
testCompile.transitive = false
}
友情提示:
DependencyHandler.java 定义依赖关系的类,对应的DependencyHandler.html文档有详细的示例
ResolutionStrategy.java 定义冲突解决策略的类,dsl/org.gradle.api.artifacts.ResolutionStrategy.html中有详细的冲突解决示例