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' }
本部分的完整代码可以在这里找到。