我如何调试Gradle为什么使用我在依赖子项目中指定的库的不同版本



我有一个Gradle构建,它将我的JOOQ生成的代码拆分为一个单独的jooq子项目,然后我的api-svc项目依赖该子项目。

当我将jooq子项目升级为3.10.1时,出于某种原因,Gradle决定使用3.9.5来构建api-svc。我不知道为什么,我必须通过在我的api-svc项目中添加一个显式依赖项来覆盖它

我如何调试正在发生的事情,以了解Gradle为什么覆盖该版本?

我的JOOQ子项目的定义:

buildscript {
repositories {
mavenCentral()
jcenter()
}
dependencies {
...
classpath 'org.jooq:jooq-codegen:3.10.1'
... 
}
}
...
dependencies {
compile 'org.jooq:jooq:3.10.1'
}
...

以下是jooq子项目的完整版本:https://bitbucket.org/snippets/shorn/64RnL5

以及纳入api-svc项目:

dependencies {
compile project(":idl")
compile project(":api-svc:jooq")
...
various other compile dependencies, spring-boot, etc.

当我做./gradlew :api-svc:jooq:dependencies时,它说:

------------------------------------------------------------
Project :api-svc:jooq
------------------------------------------------------------
...
compile - Dependencies for source set 'main' (deprecated, use 'implementation ' instead).
--- org.jooq:jooq:3.10.1
...

但是,当我做./gradlew :api-svc:dependencies时,它显示:

------------------------------------------------------------
Project :api-svc
------------------------------------------------------------
...
compile - Dependencies for source set 'main' (deprecated, use 'implementation ' instead).
+--- project :idl
|    +--- org.apache.commons:commons-lang3:3.4
|    --- com.fasterxml.jackson.datatype:jackson-datatype-jdk8:2.8.8
|         +--- com.fasterxml.jackson.core:jackson-core:2.8.8 -> 2.8.10
|         --- com.fasterxml.jackson.core:jackson-databind:2.8.8 -> 2.8.10
|              +--- com.fasterxml.jackson.core:jackson-annotations:2.8.0
|              --- com.fasterxml.jackson.core:jackson-core:2.8.10
+--- project :api-svc:jooq
|    --- org.jooq:jooq:3.10.1 -> 3.9.5
...

如果有帮助,请在此处进行完整输出:https://bitbucket.org/snippets/shorn/4x8eaG

因此,您可以看到Gradle选择使用JOOQ的3.9.5版本,而不是我指定的版本。

我如何调试为什么Gradle要这么做?

我可以通过添加jooq:3.10.1作为api-svc项目的直接编译依赖项来解决这个问题,但这是多余的,据我所知,我不应该这么做。

EDIT:Lukas Eder在评论中指出,问题的根本原因是Spring依赖于JOOQ 3.9.5,Gradle正在使用它。但问题是,我如何在不搜索项目中的每一个依赖项的情况下自己解决这个问题,以防他们碰巧有引用扰乱了我的构建?

我在Gradle表单上发了一篇帖子,试图得到这个问题的答案:https://discuss.gradle.org/t/how-do-i-debug-why-a-dependency-was-overridden/24572

在私人消息中还有其他一些讨论,但我的结论是Gradle没有办法调试这种依赖重写。

如果你在试图找出自己构建的问题时发现了这个问题,那么唯一的建议似乎是,你需要挖掘所有的依赖关系,寻找冲突的根源。

或者,试试StackOverflow问题或在Gradle论坛上发帖。

最新更新