上一篇:构建的发布与上传
本小节示例脚本
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}"
}
检查依赖
在引用的依赖或传递性依赖存在版本冲突时,Gradle采用的策略是优先选取最新的依赖版本解决版本冲突问题。解决此类问题我们可以通过上一章节中介绍的各种依赖管理方法进行排除、强制指定一个版本或者干脆禁用依赖传递特性解决。但如何知道哪些依赖传递了哪些子依赖,哪些传递的依赖又被Gradle进行了隐性升级
呢。采用下面的命令可以查看各个范围的依赖树。
gradle dependencies > dep.log
输出结果:
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
文件名可以随意,然而,你一定在想为什么有些带了(*)
有的带了->
有的什么都没有呢,这是什么鬼。前面已经说过,当发生版本冲突时Gradle会采用最新版本解决。仔细观察带了(*)
的依赖你会发现这些依赖被不同的库重复依赖了若干次,这里(*)
的意思即是表示该依赖被忽略掉了。而->
则表示其它的定级依赖的传递依赖中存在更高版本的依赖,该版本将会使用->
后面的版本来替代。
反向查找
如果你想知道某个依赖到底被哪个库引用过,可以采用下面的命令进行反向查找
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
上面的报告中可以看到8.5.6
这个版本后面标注了(conflict resolution)
说明了该版本是用于解决冲突选用的版本。
冲突即停
Gradle默认采用自动升级版本的方式解决依赖冲突,有时这种隐式升级
可能会带来一些不必要的麻烦,此时我们可以通过更改这种默认行为来让Gradle发现版本冲突时立即停止构建并抛出错误信息。
更改脚本:
configurations.all {
resolutionStrategy {
failOnVersionConflict()
}
}
执行gradle build
的输出结果:
: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
可以看到在执行gradle build时由于tomcat-embed-core存在版本冲突导致了构建失败,并提示了冲突的两个版本。
依赖报告
Gradle官方提供了一个名叫project-report
插件可以让依赖查看更加简单方便,要用此插件只需要在脚本中添加apply plugin: 'project-report'
即可。该插件提供的任务可以参考下面的表格,所有输出结果将被放在build/report
下。
任务名称 | 描述 |
---|---|
dependencyReport | 将项目依赖情况输出到txt文件中 功能同gradle dependencies > build/dependenciestxt |
htmlDependencyReport | 生成HTML版本的依赖情况 |
propertyReport | 生成项目属性报告 |
taskReport | 生成项目任务报告 |
projectReport | 生成项目报告,包括前四个 |