[Gradle中文教程系列]-跟我學(xué)Gradle-5.6:依賴-依賴報(bào)告和沖突的解決

上一篇:構(gòu)建的發(fā)布與上傳

本小節(jié)示例腳本

apply plugin: "java"

ext {
    bootVersion = "1.4.2.RELEASE"
    tomcat_embed = "8.5.4"
}

repositories {
    maven { url"https://repo.spring.io/libs-release" }
    jcenter()
}

dependencies {
    compile "org.springframework.boot:spring-boot-starter-web:${bootVersion}",
            "org.apache.tomcat.embed:tomcat-embed-jasper:${tomcat_embed}"
}

檢查依賴

在引用的依賴或傳遞性依賴存在版本沖突時(shí),Gradle采用的策略是優(yōu)先選取最新的依賴版本解決版本沖突問題。解決此類問題我們可以通過上一章節(jié)中介紹的各種依賴管理方法進(jìn)行排除、強(qiáng)制指定一個(gè)版本或者干脆禁用依賴傳遞特性解決。但如何知道哪些依賴傳遞了哪些子依賴,哪些傳遞的依賴又被Gradle進(jìn)行了隱性升級(jí)呢。采用下面的命令可以查看各個(gè)范圍的依賴樹。

gradle  dependencies > dep.log

輸出結(jié)果:

dependencies

------------------------------------------------------------
Root project
------------------------------------------------------------

archives - Configuration for archive artifacts.
No dependencies

compile - Dependencies for source set 'main'.
+--- org.springframework.boot:spring-boot-starter-web:1.4.2.RELEASE
|    +--- org.springframework.boot:spring-boot-starter:1.4.2.RELEASE
|    |    +--- org.springframework.boot:spring-boot:1.4.2.RELEASE
|    |    |    +--- org.springframework:spring-core:4.3.4.RELEASE
|    |    |    |    \--- commons-logging:commons-logging:1.2
|    |    |    \--- org.springframework:spring-context:4.3.4.RELEASE
|    |    |         +--- org.springframework:spring-aop:4.3.4.RELEASE
|    |    |         |    +--- org.springframework:spring-beans:4.3.4.RELEASE
|    |    |         |    |    \--- org.springframework:spring-core:4.3.4.RELEASE (*)
|    |    |         |    \--- org.springframework:spring-core:4.3.4.RELEASE (*)
|    |    |         +--- org.springframework:spring-beans:4.3.4.RELEASE (*)
|    |    |         +--- org.springframework:spring-core:4.3.4.RELEASE (*)
|    |    |         \--- org.springframework:spring-expression:4.3.4.RELEASE
....
....
省略的
....
....
\--- org.apache.tomcat.embed:tomcat-embed-jasper:8.5.4
     +--- org.apache.tomcat.embed:tomcat-embed-core:8.5.4 -> 8.5.6
     +--- org.apache.tomcat.embed:tomcat-embed-el:8.5.4 -> 8.5.6
     \--- org.eclipse.jdt.core.compiler:ecj:4.5.1

后面dep.log文件名可以隨意,然而,你一定在想為什么有些帶了(*)有的帶了->有的什么都沒有呢,這是什么鬼。前面已經(jīng)說過,當(dāng)發(fā)生版本沖突時(shí)Gradle會(huì)采用最新版本解決。仔細(xì)觀察帶了(*)的依賴你會(huì)發(fā)現(xiàn)這些依賴被不同的庫(kù)重復(fù)依賴了若干次,這里(*)的意思即是表示該依賴被忽略掉了。而->則表示其它的定級(jí)依賴的傳遞依賴中存在更高版本的依賴,該版本將會(huì)使用->后面的版本來替代。

反向查找

如果你想知道某個(gè)依賴到底被哪個(gè)庫(kù)引用過,可以采用下面的命令進(jìn)行反向查找

gradle dependencyInsight  --dependency tomcat-embed-core > reverse.log 
:dependencyInsight
org.apache.tomcat.embed:tomcat-embed-core:8.5.6 (conflict resolution)
+--- org.apache.tomcat.embed:tomcat-embed-websocket:8.5.6
|    \--- org.springframework.boot:spring-boot-starter-tomcat:1.4.2.RELEASE
|         \--- org.springframework.boot:spring-boot-starter-web:1.4.2.RELEASE
|              \--- compile
\--- org.springframework.boot:spring-boot-starter-tomcat:1.4.2.RELEASE (*)

org.apache.tomcat.embed:tomcat-embed-core:8.5.4 -> 8.5.6
\--- org.apache.tomcat.embed:tomcat-embed-jasper:8.5.4
     \--- compile

(*) - dependencies omitted (listed previously)

BUILD SUCCESSFUL

Total time: 6.936 secs

上面的報(bào)告中可以看到8.5.6這個(gè)版本后面標(biāo)注了(conflict resolution) 說明了該版本是用于解決沖突選用的版本。

沖突即停

Gradle默認(rèn)采用自動(dòng)升級(jí)版本的方式解決依賴沖突,有時(shí)這種隱式升級(jí)可能會(huì)帶來一些不必要的麻煩,此時(shí)我們可以通過更改這種默認(rèn)行為來讓Gradle發(fā)現(xiàn)版本沖突時(shí)立即停止構(gòu)建并拋出錯(cuò)誤信息。
更改腳本:

configurations.all {
  resolutionStrategy {
    failOnVersionConflict()
  }
}

執(zhí)行gradle build的輸出結(jié)果:

:compileJava FAILED

FAILURE: Build failed with an exception.

* What went wrong:
Could not resolve all dependencies for configuration ':compileClasspath'.
> A conflict was found between the following modules:
   - org.apache.tomcat.embed:tomcat-embed-core:8.5.4
   - org.apache.tomcat.embed:tomcat-embed-core:8.5.6

可以看到在執(zhí)行g(shù)radle build時(shí)由于tomcat-embed-core存在版本沖突導(dǎo)致了構(gòu)建失敗,并提示了沖突的兩個(gè)版本。

依賴報(bào)告

Gradle官方提供了一個(gè)名叫project-report插件可以讓依賴查看更加簡(jiǎn)單方便,要用此插件只需要在腳本中添加apply plugin: 'project-report'即可。該插件提供的任務(wù)可以參考下面的表格,所有輸出結(jié)果將被放在build/report下。

任務(wù)名稱 描述
dependencyReport 將項(xiàng)目依賴情況輸出到txt文件中 功能同gradle dependencies > build/dependenciestxt
htmlDependencyReport 生成HTML版本的依賴情況
propertyReport 生成項(xiàng)目屬性報(bào)告
taskReport 生成項(xiàng)目任務(wù)報(bào)告
projectReport 生成項(xiàng)目報(bào)告,包括前四個(gè)
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理,服務(wù)發(fā)現(xiàn),斷路器,智...
    卡卡羅2017閱讀 136,564評(píng)論 19 139
  • Android 自定義View的各種姿勢(shì)1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 179,045評(píng)論 25 709
  • Spring Boot 參考指南 介紹 轉(zhuǎn)載自:https://www.gitbook.com/book/qbgb...
    毛宇鵬閱讀 47,273評(píng)論 6 342
  • 深信因果規(guī)律,畏懼因果 .敬畏因果,遵循種瓜得瓜種豆得豆的自然規(guī)律,自己的成功不要建立在別人的失敗之上,自己的開心...
    奇門閑人閱讀 531評(píng)論 0 0
  • 題目:一個(gè)整數(shù),它加上100后是一個(gè)完全平方數(shù),再加上168又是一個(gè)完全平方數(shù),請(qǐng)問該數(shù)是多少?方法一: 方法二:...
    我是怪人我也不美閱讀 321評(píng)論 0 0

友情鏈接更多精彩內(nèi)容