09 Gradle 入门-版本冲突问题

文章来源

在之前的文章上,咱们已经知道了如何添加依赖,接下来咱们来看下如何来管理依赖.其实管理依赖的最重要的环节就是传递性依赖过程中存在的版本冲突的问题处理.接下来咱们先来看个存在传递性依赖过程中 jar 测版本冲突问题,再来看下 Gradle 有哪些的处理方法.

传递性依赖中的版本冲突

hibernate中slf4j的版本冲突问题

上图咱们可以知道,咱们需要依赖 hibernate3.6.3 的版本,而此版本需要依赖几个 jar 包,而依赖的 hibernate-commons-annotations.jar 依赖了一个slf4j 的jar包,当前hibernate框架也依赖了slf4j 的 jar 包.由于传递性依赖的特点,两个不同版本的 jar 包会被依赖进来,这样就存在版本冲突的问题.

存在版本冲突问题是需要解决的,如果没有解决程序就会出问题,那咱们使用 Gradle 做依赖管理,要如何来解决此问题? Gradle 有没有帮咱们解决此问题? 请继续往下看版本冲突的解决方案.

版本冲突解决方法

对于 Maven 的自动处理传递性依赖版本冲突问题,是按最短路径和优先声明原则来处理.

Maven自动解决版本冲突原则

而对于 Gradle 来说同样有着自动处理传递性依赖版本冲突问题的功能,只是 Gradle 是默认使用版本最高的.而针对一些特殊的需求还是需要使用手动解决.以下便是 Gradle 的手动处理版本冲突.

1 修改默认配置策略

如果想检查有哪些 jar 包有版本冲突,或者想去除 Gradle 的默认处理方式,可修改默认的配置策略.

  • 1 在 build.gradle 中加入如下配置
configurations.all{
  resolutionStrategy{
      // 修改 gradle不自动处理版本冲突
      failOnVersionConflict()
  }
}
  • 2 执行 help -> dependencies 可查看冲突的 jar 包
A conflict was found between the following modules:
- org.slf4j:slf4j-api:1.6.1
- org.slf4j:slf4j-api:1.5.8

以上配置完,如果存在依赖 jar 包版本冲突问题, Gradle 将不再自动处理,build 会抛异常.

2 排除传递性依赖

  • 排除单个jar 包的传递性依赖
dependencies {
   compile (group: 'org.hibernate', name: 'hibernate-core', version: '3.6.3.Final'){
       // module 是 jar 的 name
       exclude group:"org.slf4j" , module:"slf4j-api"
   }
}

此处的 module 指的是 jar 的 name,值无需写版本,此配置的意义就是排序 hibernate-core 引入时 slf4f-api 的传递性依赖.也就是说咱们的项目目前没有依赖任何版本的 slf4f-api.

  • 排除所有 jar 的传递性依赖
dependencies {
    compile (group: 'org.hibernate', name: 'hibernate-core', version: '3.6.3.Final'){
        transitive=false
    }
}

transitive 默认为true ,表示 Gradle 自动添加子依赖项,设置为false 则需要手动添加每个依赖项,在真实开发中,需要自动添加子依赖的比较多,而手动添加的比较少,毕竟使用工具的主要目的是减少工作量嘛,所以开发中此配置建议不使用.

3 强制指定一个版本

给有冲突的 jar 包强制指定一个版本,在 build.gradle 中配置如下

configurations.all{
    resolutionStrategy{
        force 'org.slf4j:slf4j-api:1.7.24'
    }
}

执行 help -> dependencies 可看到所有的 slf4j 都改为了1.7.24 的版本了.

以上便是 Gradle 在传递性依赖中的版本冲突问题的默认解决方式介绍和如何手动解决版本冲突的两种方案.

至此咱们已经掌握了如何使用 Gradle 配置依赖和管理依赖,下一篇咱们就来做个小实践.期待<<Gradle 的多项目构建>>

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 218,204评论 6 506
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 93,091评论 3 395
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 164,548评论 0 354
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,657评论 1 293
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,689评论 6 392
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,554评论 1 305
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,302评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,216评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,661评论 1 314
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,851评论 3 336
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,977评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,697评论 5 347
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,306评论 3 330
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,898评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,019评论 1 270
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,138评论 3 370
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,927评论 2 355

推荐阅读更多精彩内容

  • 在之前的文章上,我们已经知道了如何添加依赖,如何来管理依赖。其实管理依赖的最重要的环节就是传递性依赖过程中存在的版...
    Java_Explorer阅读 2,408评论 0 0
  • 文章来源 上一篇咱们讲解了 Gradle 构建项目的生命周期,这一篇咱们来看下 Gradle 的另一个重要的知识点...
    黄少存阅读 1,008评论 0 1
  • spring官方文档:http://docs.spring.io/spring/docs/current/spri...
    牛马风情阅读 1,679评论 0 3
  • 在 Android Studio 构建的项目中,基于 Gradle 进行项目的构建,同时使用 Android DS...
    Ant_way阅读 7,359评论 0 16
  • 作为一名FE Coder,一个好用的编辑器是在是太重要了。入职之后一直使用VS Code这个编辑器,感觉就是比su...
    cyuamber阅读 3,519评论 0 7