Gradle

Stella981
• 阅读 519

什么是传递依赖

  在Maven仓库中,构件通过POM(一种XML文件)来描述相关信息以及传递性依赖。Gradle 可以通过分析该文件获取获取所以依赖以及依赖的依赖和依赖的依赖的依赖,为了更加直观的表述,可以通过下面的输出结果了解。

+--- org.springframework:spring-web:4.3.4.RELEASE
|    |    +--- org.springframework:spring-aop:4.3.4.RELEASE
|    |    +--- org.springframework:spring-beans:4.3.4.RELEASE
|    |    +--- org.springframework:spring-context:4.3.4.RELEASE
|    |    \--- org.springframework:spring-core:4.3.4.RELEASE

  可以看到,我们的项目依赖了spring-web,然而spirng-web却依赖了一众spring的全家桶,借助Gradle的传递性依赖特性,你无需再你的脚本中把这些依赖都声明一遍,你只需要简单的一行,Gradle便会帮你将传递性依赖一起下载下来。

compile `org.springframework:spring-web:4.3.4.RELEASE`

 传递依赖特性可以轻松地通过transitive参数进行开启或关闭,上面的示例中如果要忽略spring-web的传递性依赖可以采用指定 transitive = false 的方式来关闭依赖传递特性,也可以采用添加@jar的方式忽略该依赖的所有传递性依赖。

compile("org.springframework:spring-web:4.3.4.RELEASE") {
    transitive = false
}compile `org.springframework:spring-web:4.3.4.RELEASE@jar`

下面的语句,可以全局性的关闭依赖传递特性。

configurations.all {
   transitive = false
}

排除依赖

   有些时候你可能需要排除一些传递性依赖中的某个模块,此时便不能靠单纯的关闭依赖传递特性来解决了。这时exclude就该登场了,如果说@jar彻底的解决了传递问题,那么exclude则是部分解决了传递问题。然而实际上exclude肯能还会用的频率更更频繁一些,比如下面几种情况。

  • 依赖冲突时,如果有两个依赖引用了相同jar包的不同版本时,默认情况下gradle会采用最新版本的jar包,此时可以通过排除选项来排除。
  • 运行期无需此模块的。
  • 无法正常获取到此传递依赖,远程仓库都不存在的。
  • 版权原因需要排除的。
  • 其他原因。

可以通过configuration配置或者在依赖声明时添加exclude的方式来排除指定的引用。

  exclude可以接收group和module两个参数,这两个参数可以单独使用也可以搭配使用,其中module可以理解为对应GAV中的artifactId,也就是compile group: 'org.gradle.test.classifiers', name: 'service', version: '1.0'中的中间name部分。

configurations {
    //编译期排除commons模块
    compile.exclude module: 'commons'
    //在整个构建过程中排除pkaq.tiger:share
    all*.exclude group: 'pkaq.tiger', module: 'share'
}

dependencies {
    compile("pkaq.tiger:web:1.0") {
        exclude module: 'share'
    }       
}

使用强制版本

  当然,有时候你可能仅仅是需要强制使用某个统一的依赖版本,而不是排除他们,那么此时force就该登场了。指定force = true属性可以冲突时优先使用该版本进行解决。

compile('org.hibernate:hibernate:3.1') {
    force = true
}

全局配置强制使用某个版本的依赖来解决依赖冲突中出现的依赖

configurations.all {
   resolutionStrategy {
       force 'org.hamcrest:hamcrest-core:1.3'
   }
}

使用动态版本

  如果你想让你的工程始终采用最新依赖,那么Gradle提供了一种方式可以始终保证采用依赖的最新版本而无需每次手工检查修改版本。 
  使用加号+,可以让Gradle在每次执行构建时检查远程仓库是否存在该依赖的新版本,如果存在新版本则下载选用最新版本。当然也可以指定依赖某个大版本下的最新子版本,1.+表示始终采用该依赖最新的1.x版本的最新依赖。

compile 'org.springframework:spring-web:+'

虽然这是看上去十分风骚的一种用法,但这无疑会降低你系统构建的速度同时提高构建失败的风险。因为Gradle不得不每次检查远程仓库是否存在最新版本,同时新版本也可能带来无法预知的兼容性问题,比如quartz2.x较之于quartz1.x,common-lang3较之于common-lang等。

一个综合示例

compile('org.hibernate:hibernate:3.1') {
 // 冲突时优先使用该版本
 force = true

 // 依据构建名称排除
 exclude module: 'cglib' 
 // 依据组织名称排除
 exclude group: 'org.jmock' 
 // 依据组织名称+构件名称排除
 exclude group: 'org.unwanted', module: 'iAmBuggy' 

 // 为本依赖关闭依赖传递特性
 transitive = false
}
点赞
收藏
评论区
推荐文章
blmius blmius
3年前
MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1
文章目录问题用navicat导入数据时,报错:原因这是因为当前的MySQL不支持datetime为0的情况。解决修改sql\mode:sql\mode:SQLMode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。全局s
待兔 待兔
4个月前
手写Java HashMap源码
HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程22
Stella981 Stella981
3年前
Spring boot源码分析之Spring循环依赖揭秘
!(https://oscimg.oschina.net/oscnet/be79581de12c41704c44e976d329ad35ad1.gif)若你是一个有经验的程序员,那你在开发中必然碰到过这种现象:事务不生效。或许刚说到这,有的小伙伴就会大惊失色了。Spring不是解决了循环依赖问题吗,它是怎么又会发生循环依赖的呢?,接下来就
Stella981 Stella981
3年前
HarmonyOS应用开发引入第三方库的三种方式
我们在做应用开发的时候,往往需要引入些优秀的第三方库来进行开发,下面就讲讲我们在做HarmonyOS应用开发中引入第三方库的三种方式。1、通过编写gradle依赖进行引入,熟悉maven或者gradle的朋友对这个就太熟悉了。针对这个方式,我就拿个fastjson库的引入进行举例吧,在对应的Module下的build.gradle文件中添加依赖项即可
Stella981 Stella981
3年前
Maven命令将本地jar打包到maven仓库
一、背景日常开发中,常见的一种情况是在java项目的pom.xml文件中引入依赖版本信息,由于maven中央仓库没有这个jar,我们可以从其他地方下载下来,然后再使用打包方式将下载下来的jar包打包到maven仓库。二、示例1\.依赖ojabc6引入!在这里插入图片描述(https:/
Wesley13 Wesley13
3年前
3天两版 Spring Boot 2.2.4 发布!紧急修复Spring Cloud Hoxton.SR1 兼容问题
SpringBoot2.2.4发布了,可以从repo.spring.io和MavenCentral获取。此版本修复了6个bug,进行了一些文档改进和依赖性升级,解决了Gradle5.3至5.6的依赖性解析问题。🐞Bug修复1.@ActiveProfiles与@SpringBootTest使用,覆盖s
Stella981 Stella981
3年前
Gradle 依赖项管理
defaultTasks"hello"configurations{starling//不进行依赖传递,否则要下载很多依赖项//例如flexframeworkstarling.transitivefalse}repo
Stella981 Stella981
3年前
Gradle 深度刨析
基本构建块每个Gradle构建都包含三个基本概念:project、task和property。每个构建包含至少一个project、一个或多个task。project和task暴露的属性可以用来控制构建。Gradle的核心组件直接的依赖关系如下:!Gradle的核心组件直接的依赖关系(https://static.
Stella981 Stella981
3年前
GreenDao 使用和数据库升级
1使用方法   一.添加依赖 在bulid.gradle文件下的dependencies下添加所需依赖1.compile'org.greenrobot:greendao:3.2.2'//addlibrary2.compile'org.greenrobot:greendaogenerator:3.2.2
死牛胖子 死牛胖子
4个月前
Maven如何解决版本依赖冲突
Maven的依赖具备传递性,一个项目会依赖很多包,这些依赖包又会依赖其它包,从而构成复杂的依赖关系,这其中相同的包可能会被多次依赖,如果依赖了多个版本,就会产生冲突,此时,Maven需要一个选择策略,从多个版本中选择一个版本。Maven会根据以下两个原则来