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

时间:2017-10-28 04:57:28

标签: gradle jooq

我有一个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项目的直接编译依赖项来解决这个问题 - 但这是多余的,据我所知,我不应该这样做。

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

1 个答案:

答案 0 :(得分:0)

我在Gradle表单上发帖试图找到答案:https://discuss.gradle.org/t/how-do-i-debug-why-a-dependency-was-overridden/24572

在私人消息中还有其他一些讨论,但我的结论是Gradle无法调试这些依赖性覆盖。

如果您在尝试找出自己的构建问题时发现了这个问题 - 唯一的建议似乎是您需要挖掘所有依赖关系以寻找冲突的来源。

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