为什么Gradle会在Grails3.1应用程序中降级我的可传递依赖项?

为什么Gradle会在Grails3.1应用程序中降级我的可传递依赖项?,grails,gradle,grails-3.1,Grails,Gradle,Grails 3.1,我的grails flyway插件的可传递依赖性有问题org.grails.plugins:grails-flyway:0.2.1声明对org.flywaydb:flyway-core:4.0.1的依赖关系。当我在Grails3.1.6项目中加入插件时,Gradle将Flyway降级为3.2.1版 +--- org.grails.plugins:grails-flyway:0.2.1 | \--- org.flywaydb:flyway-core:4.0.1 -> 3.2.1 我的

我的
grails flyway
插件的可传递依赖性有问题
org.grails.plugins:grails-flyway:0.2.1
声明对org.flywaydb:flyway-core:4.0.1的依赖关系。当我在Grails3.1.6项目中加入插件时,Gradle将Flyway降级为3.2.1版

+--- org.grails.plugins:grails-flyway:0.2.1
|    \--- org.flywaydb:flyway-core:4.0.1 -> 3.2.1
我的Gradle构建文件如下所示

buildscript {
    ext {
        grailsVersion = project.grailsVersion
    }
    repositories {
        maven { url "https://repo.grails.org/grails/core" }
    }
    dependencies {
        classpath "org.grails:grails-gradle-plugin:$grailsVersion"
        classpath "com.bertramlabs.plugins:asset-pipeline-gradle:${assetPipelinePluginVersion}"
        classpath "org.grails.plugins:hibernate5:5.0.5"
        classpath 'com.github.ben-manes:gradle-versions-plugin:0.12.0'
    }
}

version "0.40.15"
group "zsc.supporter"

apply plugin: "war"
apply plugin: "org.grails.grails-web"
apply plugin: "org.grails.grails-gsp"
apply plugin: "org.grails.grails-doc"
apply plugin: "asset-pipeline"
apply plugin: 'com.github.ben-manes.versions'

ext {
    grailsVersion = project.grailsVersion
    gradleWrapperVersion = project.gradleWrapperVersion
}

repositories {
    maven { url "https://repo.grails.org/grails/core" }
    maven { url "https://dl.bintray.com/saw303/plugins" }
}

dependencyManagement {
    imports {
        mavenBom "org.grails:grails-bom:$grailsVersion"
    }
    applyMavenExclusions false
}

dependencies {
    compile "org.springframework.boot:spring-boot-starter-logging"
    compile "org.springframework.boot:spring-boot-autoconfigure"
    compile "org.grails:grails-core"
    compile "org.springframework.boot:spring-boot-starter-actuator"
    compile "org.springframework.boot:spring-boot-starter-tomcat"
    compile "org.grails:grails-dependencies"
    compile "org.grails:grails-web-boot"
    compile "org.grails.plugins:cache"
    compile "org.grails.plugins:scaffolding"
    compile "org.grails.plugins:hibernate4"
    compile "org.hibernate:hibernate-ehcache"
    console "org.grails:grails-console"
    profile "org.grails.profiles:web:3.1.6"
    runtime "com.bertramlabs.plugins:asset-pipeline-grails:${assetPipelinePluginVersion}"
    runtime "com.h2database:h2"
    testCompile "org.grails:grails-plugin-testing"
    testCompile "org.grails.plugins:geb"
    testRuntime "org.seleniumhq.selenium:selenium-htmlunit-driver:2.52.0"
    testRuntime "net.sourceforge.htmlunit:htmlunit:2.21"

    compile "org.grails.plugins:spring-security-core:3.0.4"
    compile "org.grails.plugins:quartz:2.0.8"
    compile "org.grails.plugins:mail:2.0.0.RC4"
    compile "eu.bitwalker:UserAgentUtils:1.18"
    compile 'org.mnode.ical4j:ical4j:1.0.7'
    compile 'org.grails.plugins:browser-detection:3.1.0'
    compile "com.googlecode.libphonenumber:libphonenumber:7.3.1"
    runtime 'org.grails.plugins:grails-flyway:0.2.1'

    testCompile "org.grails.plugins:grails-wizer:0.3"
    testCompile 'org.grails:grails-datastore-test-support:5.0.5.RELEASE'

    runtime 'mysql:mysql-connector-java:5.1.29'
}

task wrapper(type: Wrapper) {
    gradleVersion = gradleWrapperVersion
}

assets {
    minifyJs = true
    minifyCss = true
}
目前我不明白为什么Gradle会降低我的可传递依赖性。有人能提供这方面的信息吗

我知道我可以在
build.gradle
中强制执行
flyway core:4.0.1
依赖项,但我想了解降级的原因

更新-1

当我运行
gradle dependencies | grep flyway
时,我得到以下输出

+--- org.grails.plugins:grails-flyway:0.2.1
|    \--- org.flywaydb:flyway-core:4.0.1 -> 3.2.1
+--- org.grails.plugins:grails-flyway:0.2.1
|    \--- org.flywaydb:flyway-core:4.0.1 -> 3.2.1
+--- org.grails.plugins:grails-flyway:0.2.1
|    \--- org.flywaydb:flyway-core:4.0.1 -> 3.2.1
+--- org.grails.plugins:grails-flyway:0.2.1
|    \--- org.flywaydb:flyway-core:4.0.1 -> 3.2.1
请在找到完整的输出。grails flyway的
plugin及其pom.xml可在上找到

更新-2

我试图强迫Gradle使用
org.flywaydb:flywaycore:4.0.1
,根据

这并不影响问题。依赖关系树仍然使用
flyway core
的3.2.1版

+--- org.grails.plugins:grails-flyway:0.2.1
|    \--- org.flywaydb:flyway-core:4.0.1 -> 3.2.1
更新-3

Gradles
dependencyInsight
命令

gradle dependencyInsight --dependency flyway-core --configuration runtime
导致

:dependencyInsight
org.flywaydb:flyway-core:3.2.1 (selected by rule)

org.flywaydb:flyway-core:4.0.1 -> 3.2.1
\--- org.grails.plugins:grails-flyway:0.2.1
     \--- runtime 
什么是
(按规则选择)

“解决方案”-或如何解决它

我无法找到导致Gradle使用
flyway core:3.2.1
而不是
flyway core:4.0.1
的规则。但我找到了解决问题的方法

我将以下内容添加到我的
build.gradle
中,以修改我的gradle
运行时
解析策略

configurations.runtime.resolutionStrategy {

    eachDependency { DependencyResolveDetails det ->

        if (det.requested.name == 'flyway-core' && det.requested.group == 'org.flywaydb') {
            det.useVersion(det.requested.version)
        }
    }
}

导致它的原因是
spring-boot-dependencies-1.3.3.RELEASE.pom

这将迫使flyway版本升级到3.2.1

根据,您应该能够在
build.gradle
中添加这样的行:

ext['flyway.version']='4.0.1'

转到Gradle缓存文件文件夹:

cd ~/.gradle/caches/modules-2/files-2.1
搜索此版本号:

grep -r "3.2.1" *
您将发现哪个pom文件正在使用此版本, 通常是spring-boot-dependencies-x.y.z.RELEASE.pom中的内容

<flyway.version>3.2.1</flyway.version>
......
<groupId>org.flywaydb</groupId>
    <artifactId>flyway-core</artifactId>
    <version>${flyway.version}</version>
</dependency>
我遇到了一个类似的问题,并为此浪费了几个小时。
所以我在这里留下了这些信息,希望如果你陷入这个问题,这可以节省你的时间

是否还有其他依赖于
org.flywaydb:flywaycore:3.2.1
?正如假设的那样,有一些库依赖于旧版本,Gradle只是通过降低插件的版本来解决这个问题,因为这似乎是最明显的方式,我找不到任何其他具有依赖树的flyway核心版本(您可以通过运行
/gradlew dependencyInsight--dependency flyway core
,尝试反向搜索。然后您应该能够看到谁需要flyway core。也许这给了您一个启示您可以使用此解决方案:如何找出哪个依赖项在较低版本中具有这种传递依赖项?我有类似的问题,但CENF没有找出它来自哪里,因此我无法确定应该覆盖什么
ext[…]
<flyway.version>3.2.1</flyway.version>
......
<groupId>org.flywaydb</groupId>
    <artifactId>flyway-core</artifactId>
    <version>${flyway.version}</version>
</dependency>
flyway.version=4.0.1