Почему Gradle понижает мои транзитивные зависимости в приложении Grails 3.1?

У меня проблема с транзитивной зависимостью моего плагина grails-flyway. org.grails.plugins:grails-flyway:0.2.1 объявляет зависимость от org.flywaydb:flyway-core:4.0.1. Когда я включаю плагин в проект Grails 3.1.6, Gradle понижает пролет до версии 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 понижает мою транзитивную зависимость. Может ли кто-нибудь предоставить на это?

Я знаю, что могу принудительно установить зависимость flyway-core:4.0.1 в моем build.gradle, но я хотел бы понять, что вызывает понижение.

ОБНОВЛЕНИЕ-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

Пожалуйста, найдите полный вывод в pastebin. Плагин grails-flyway и его pom.xml можно найти в Bintray.

ОБНОВЛЕНИЕ-2

Я попытался заставить Gradle использовать org.flywaydb:flyway-core:4.0.1 в соответствии с ссылкой Gradles.

configurations.all {
    resolutionStrategy.force 'org.flywaydb:flyway-core:4.0.1'
}

Это не влияет на проблему. Дерево зависимостей все еще использует версию 3.2.1 flyway-core.

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

ОБНОВЛЕНИЕ-3

Команда 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 

Что означает (selected by rule)?

"Решение" - или как его использовать

Мне не удалось найти правило, которое заставляет Gradle использовать flyway-core:3.2.1 вместо flyway-core:4.0.1. Но я нашел способ решить проблему.

Я добавил следующее в build.gradle для изменения моей стратегии разрешения Gradle runtime.

configurations.runtime.resolutionStrategy {

    eachDependency { DependencyResolveDetails det ->

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

Ответ 1

Вещь, вызывающая ее, - это spring-boot-dependencies-1.3.3.RELEASE.pom

Это форсирует версию пролета до 3.2.1

В соответствии с Spring Документация по загрузке вы должны добавить такую ​​строку в свой build.gradle: ext['flyway.version'] = '4.0.1'

Ответ 2

Перейдите в папку с файлами кэша Gradle:

cd ~/.gradle/caches/modules-2/files-2.1

искать этот номер версии:

grep -r "3.2.1" *

Вы узнаете, какой pom файл использует эту версию, обычно это что-то в spring-boot-dependencies-xyzRELEASE.pom:

<flyway.version>3.2.1</flyway.version>
......
<groupId>org.flywaydb</groupId>
    <artifactId>flyway-core</artifactId>
    <version>${flyway.version}</version>
</dependency>

Это означает, что если вы используете spring-boot, он перезапишет некоторую версию зависимости.

Вы можете перезаписать его снова, добавив следующую строку в свой файл gradle.properties:

flyway.version=4.0.1

Я столкнулся с подобной проблемой и потратил на нее несколько часов. Поэтому я оставил эту информацию здесь, надеюсь, это поможет сэкономить ваше время, если вы застряли в этой проблеме