Gradle Cheat Sheet (10): Dependencies

1. Working with Repositories

  添加依赖前,首先要指定获取依赖的Repository。最基本的Repository就是一个放置jar文件的目录,称为Flat Directory Repository。所有关于Repository的配置都在repositories { } 块中进行,对于本地目录,只需添加一个flatDir 块,并指定Repository对应的目录,如添加libs文件夹作为一个Repository:

repositories {
    flatDir {
        dirs 'libs'
    }
}

  repositories { } 块提供了一些针对如Maven Central、Maven Local和jCenter等常用Repository的快捷方法,只需调用就可以自动添加对应的Repository。如:

repositories {
    mavenCentral()
    mavenLocal()
    jcenter()
}

  Gradle支持Maven和Ivy的Managed Dependencies,只需指明URL即可:

repositories {
    maven {
        url 'https://repo.foo.org/m2'
    }
}

  如果需要验证用户名和密码,可以在credentials 中添加:

repositories {
    ivy {
        url 'https://repo.foo.org/ivy'
        credentials {
            username 'user'
            password 'secret'
        }
    }
}

  除了标准的HTTP和HTTPS协议,Gradle还支持SFTP和基于文件的Repository:

repositories {
    ivy {
        url 'file:///home/user/repo'
    }
}

  本部分的完整代码可以在这里找到。

2. Declaring Dependencies

  依赖在dependencies { } 中配置,首先要给出所添加依赖的Configuration名称,然后是所要添加的依赖,包含依赖的组名、名称和版本。如:

dependencies {
    compile 'com.google.guava:guava:18.0'
}

这里为名为compile 的Configuration添加了guava作为依赖。

  也可以使用Groovy Map语法:

dependencies {
    compile group: 'com.google.guava', name: 'guava', version: '18.0'
}

使用FileCollection 或FileTree 可以添加特定文件作为依赖。如使用FileCollection 添加foo.jar和bar.jar作为依赖:

dependencies {
    compile files('libs/foo.jar', 'libs/bar.jar')
}

  使用FileTree 添加libs文件夹下的所有.jar文件作为依赖:

dependencies {
    compile fileTree(dir: 'libs', include: '*.jar')
}

  本部分的完整代码可以在这里找到。

3. Dependency Report

  Gradle提供了两种可视化依赖的工具,传统的Dependency Report可以展示完整的依赖图,Dependency Insight Report给出特定依赖在项目中的依赖情况。

  下面首先声明一个依赖:

apply plugin: 'java'

repositories {
    mavenCentral()
}

dependencies {
    compile 'org.springframework:spring-core:4.1.1.RELEASE'
}

  运行:

$ gradle dependencies

可以看到输出按照Configuration进行了分组,但内容很多,可以使用–configuration 参数指定想要看的Configuration:

$ gradle dependencies --configuration runtime

  使用dependencyInsight 可以查看特定依赖:

$ gradle dependencyInsight --dependency commons-logging

输出为:

commons-logging:commons-logging:1.1.3
\--- org.springframework:spring-core:4.1.1.RELEASE
     \--- compile

BUILD SUCCESSFUL

可见名为compile的Configuration依赖于spring-core,spring-core依赖于commons-logging。

  这时再为compile添加一个依赖:

dependencies {
    compile 'commons-logging:commons-logging:1.2'
}

再次运行:

$ gradle dependencyInsight --dependency commons-logging

输出为:

commons-logging:commons-logging:1.2 (conflict resolution)
\--- compile

commons-logging:commons-logging:1.1.3 -> 1.2
\--- org.springframework:spring-core:4.1.1.RELEASE
     \--- compile

BUILD SUCCESSFUL

可见此时出现Conflict,compile 依赖commons-logging:1.2 ,而spring-core:4.1.1.RELEASE 依赖commons-logging:1.1.3 。出现Conflict时,Gradle会尝试进行Resolve,默认Resolve为最新版本,这里是1.2 。

  本部分的完整代码可以在这里找到。

4. Configuration

  依赖可以由Configuration进行分组,如之前一直在为名为compile 的Configuration添加依赖。Java插件也有自己的Configuration,如runtime 、testCompile 和testRuntime ,Java插件会在执行task时把对应Configuration的依赖添加到classpath。只需要使用Configuration名称后跟依赖的方式,就可以为特定Configuration添加依赖。如:

apply plugin: 'java'

repositories {
    mavenCentral()
}

dependencies {
    compile 'commons-logging:commons-logging:1.1.3'
    testCompile 'junit:junit:4.12'
}

这里为testCompile添加了junit作为依赖,junit只有在测试代码中有效。

  如果Java插件提供的Configuration不能满足需要,也可以使用

configurations {
    custom
}

dependencies {
    custom 'com.google.guava:guava:18.0'
}

Configuration也可以有类似于继承的扩展关系,使用extendsFrom 指明。如让compile 扩展自上面定义的custom :

configurations {
    compile.extendsFrom custom
}

  Configuration实际上是一个FileCollection 的实例,可以像FileCollection 一样使用。如用于复制:

task copyDependencies(type: Copy) {
    from configurations.custom
    into 'build/libs'
}

  本部分的完整代码可以在这里找到。