依赖管理

依赖传递管理:完全控制项目中的依赖关系树;

支持自定义依赖项的定义:构建脚本具备描述依赖层次结构的能力

完全兼容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是支持传递依赖的,想要禁止传递可以如下配置:
    compile("org.springframework:spring-core:2.5"){
      transitive = false
    }
    
    默认情况下,当jar包发生版本冲突时,gradle采用高版本的jar,如果想强制使用当前版本jar包时,可以如下配置:
    compile("org.springframework:spring-core:2.5"){
      force = true
    }
    
    排除对某个jar包的依赖,可以如下配置:
    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种解决冲突的策略:

  1. 使用最新版本的依赖
    适用于jar版本向后兼容的依赖,默认处理策略;通过如下配置实现该策略:

  2. 直接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中有详细的冲突解决示例