不为有趣之事,何遣有涯之生
不失其所者久,死而不亡者寿

Gradle简明教程(4) Gradle依赖管理

依赖管理概述

Gradle摒弃了Ivy和Maven依赖管理工具的一切缺点,更注重性能、构建可靠性以及可重复性

  • 通常开发都需要依赖一些流行的开源框架包,避免自己重复发明轮子
  • 随着项目的增大,依赖的模块和第三方类库会越来越多,如何组织与管理就显得尤为重要
  • 自动化依赖管理可以解决传递性依赖,版本管理等问题
  • 搭建内部仓库解决中央仓库的单点依赖 Sonatype Nexus, JFrog, Artifactory
  • Gradle提供了很有价值的依赖报告

一个自动化依赖结构图
自动化依赖管理

依赖配置

  • 通过project实例添加和访问配置
  • 每个项目都有一个ConfigurationContainer类的容器来管理相应的配置
  • 定义一个Cargio类配置的例子
configurations{
        cagro {
            description = 'classpath for cargo Ant tasks'
            visible = false
        }
    }

声明依赖

  • 外部模块依赖
  • 项目依赖
  • 文件依赖
  • 客户端模块依赖
  • Gradle运行时依赖

每个Gradle项目都有依赖处理器实例,由DependencyHandler接口来表示

外部依赖
依赖属性
  • group 通常用来标示一个组织,公司或者项目
  • name 唯一标识
  • version 版本号 一般都包含主版本和次版本
  • classifier 用来区分相同group,name,version工件,但使用环境上有所区别

例子:
依赖属性例子

依赖标记

有两种标识方式
- 使用map结构形式,显示标记出group,name,version

cargo group: cargoGroup,name:' cargo-core-uberjar', vewrsion: cargoVersion
  • 使用字符串简写形式,类似上一节Hibernate的例子

使用gradle dependencise 命令来查看详细依赖报告

排除传递依赖

由于Gradle会自动管理传递依赖,如果你需要可以主动排除一些自动的依赖

  • 排除一个传递依赖
dependencies{
    cargo('org.codehaus.cargo:cargo-ant:1.3.1'){
        exclude(group:'xml-apis', module:'xml-apis')
    }
    cargo 'xml-apis:xml-apis:2.0.2'
}
  • 排除所有传递依赖
dependencies{
    cargo('org.codehaus.cargo:cargo-ant:1.3.1'){
        transitive = false
    }
}

Gradle还支持最新版本依赖,又叫动态版本依赖,当然正式环境下还是不要用这个功能了

文件依赖

适用于从现有Ant或者Maven管理方式转变到Gradle时,或者本地稳定的开发包依赖

dependencies{
    cargo fileTree(dir: "lib路径" ,include: ' *.jar ')
}

使用和配置仓库

  • 定义仓库的接口类 RepositoryHandler
  • 支持Maven仓库,Ivy仓库,扁平的目录仓库
Maven仓库
  • 中央仓库 mavenCentral()
  • 本地仓库 mavenLocal() 慎用
  • 自定义仓库 maven() 和mavenRepo()
dependencies{
    mavenCentral()
    maven{
        name  'Custom Maven Repository'
        url 'http://ziniuxiaozhu.com/nexus/public'
    }
}
Ivy仓库
  • 相对Maven来说可以自定义布局
  • 仓库依赖元数据存储在ivy.xml中

具体语法可参考官方文档

扁平目录仓库
  • 只有JAR文件,没有元数据
  • 适合经常手动维护项目中的类库,或者项目迁移的时候
  • 声明依赖智能使用name和version这两个属性

一个从falt目录仓库取Cargo依赖声明例子:


repositories{ flatDir(dir: " ${System.properties['user.home']}/libs/cargo", name: 'Local libs directory') } dependencies{ cargo name : 'activetion', version:'1.1' catgo name: 'ant', version:'1.7.1' cargo ':xml-apis:1.3.1', ' : jaxen:1.0-FCS' }

本地依赖缓存

  • Gradle会缓存从仓库下载的二进制文件,该目录根据不同的版本,路径可能不同
  • 存储依赖来源,当来源发生变化,能够保证构建的可靠
  • 减少到远程仓库的传输
  • 比较本地仓库和远程仓库,减少工件的下载
  • 支持离线模式,在你无法联网时采用本地缓存来构建

常见依赖问题

如果你项目有很多依赖,而且你选择自动解决传递性依赖,那么版本冲突几乎是不可避免的
- 应对版本冲突
设置当遇到版本冲突时,构建失败

 configuration.cargo.resolutionStrategy{
    failOnVersionConfilct()
}
  • 强制制定一个版本
 configuration.cargo.resolutionStrategy{
   force ' org.codehaus.cargo:cargo:cargo-ant:1.3.0'
}
  • 使用依赖观察报告
  • 刷新缓存

可以手动刷新,可以不缓存快照版本的依赖包

未经允许不得转载:菡萏如佳人 » Gradle简明教程(4)

欢迎加入极客江湖

进入江湖关于作者