为什么 Gradle 会降级 Grails 3.1 应用程序中的传递依赖项? [英] Why does Gradle downgrade my transitive dependencies in a Grails 3.1 application?

查看:14
本文介绍了为什么 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 将 Flyway 降级到 3.2.1 版.

I am having a problem with a transitive dependency of my grails-flyway plugin. org.grails.plugins:grails-flyway:0.2.1 declares a dependency to org.flywaydb:flyway-core:4.0.1. When I include the plugin into my Grails 3.1.6 project Gradle downgrades Flyway to version 3.2.1.

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

我的 Gradle 构建文件看起来像这样

My Gradle build file looks like this

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 会降级我的传递依赖.有人可以提供吗?

Currently I do not understand why Gradle downgrades my transitive dependency. Can someone provide on this?

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

I am aware that I can force the flyway-core:4.0.1 dependency in my build.gradle but I would like to understand what the downgrade causes.

UPDATE-1

当我运行 gradle 依赖项时 |grep flyway 我得到以下输出.

When I run gradle dependencies | grep flyway I get the following output.

+--- 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.

Please find the complete output at pastebin. The grails-flyway plugin and its pom.xml can be found at Bintray.

UPDATE-2

根据 Gradles 参考.

I tried to force Gradle to use org.flywaydb:flyway-core:4.0.1 according to Gradles Reference.

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

这不影响问题.依赖树仍然使用 flyway-core 的 3.2.1 版本.

That does not affect the problem. The dependency tree still uses version 3.2.1 of flyway-core.

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

UPDATE-3

Gradles dependencyInsight 命令

Gradles dependencyInsight command

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 的规则.但我找到了解决这个问题的方法.

I was not able to find the rule that causes Gradle to use flyway-core:3.2.1 instead of flyway-core:4.0.1. But I found a way to work around the problem.

我将以下内容添加到我的 build.gradle 以修改我的 Gradle runtime 解析策略.

I added the following to my build.gradle to modify my Gradle runtime resolution strategy.

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

This forcing the flyway version to 3.2.1

根据Spring Boot docs 你应该能够在你的 build.gradle 中添加这样的一行:<代码>ext['flyway.version'] = '4.0.1'

According to the Spring Boot docs you should be able to add a line like this to your build.gradle: ext['flyway.version'] = '4.0.1'

这篇关于为什么 Gradle 会降级 Grails 3.1 应用程序中的传递依赖项?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆