Gradle依赖管理

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。

已标记关键词 清除标记
©️2020 CSDN 皮肤主题: 编程工作室 设计师:CSDN官方博客 返回首页