本小節(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è) |