我有一个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论坛上发帖。