当前位置: 首页 > 知识库问答 >
问题:

为什么Gradle在Grails 3.1应用程序中降级我的传递依赖项?

钱安和
2023-03-14

我的grails flyway插件的可传递依赖性有问题<代码>组织。圣杯。插件:grails flyway:0.2.1声明了对org的依赖关系。flywaydb:flyway核心:4.0.1。当我将插件包含到Grails 3.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会降低我的传递依赖性。有人能提供这个吗?

我知道我可以在我的构建中强制实现flyway core:4.0.1的依赖关系。gradle,但我想了解降级的原因。

UPDATE-1

当我运行gradle依赖项|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

根据Gradles参考,我试图强制Gradle使用org.flywaydb: flyway-core: 4.0.1

configurations.all {
    resolutionStrategy.force 'org.flywaydb:flyway-core: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

GradlesdependencyInsight命令

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

我在我的构建中添加了以下内容。gradle修改我的gradle运行时解析策略。

configurations.runtime.resolutionStrategy {

    eachDependency { DependencyResolveDetails det ->

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

共有2个答案

端木宏才
2023-03-14

转到您的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>

这意味着,如果使用spring boot,它将覆盖某些依赖版本。

您可以通过在gradle.properties文件中添加以下行再次覆盖它:

flyway.version=4.0.1

我遇到了一个类似的问题,为此浪费了几个小时。所以我把这些信息留在这里,希望如果你陷入这个问题,这可以节省你的时间

彭开畅
2023-03-14

导致它的原因是spring-boot-依赖项-1.3.3。RELEASE. pom

这迫使flyway版本为3.2.1

根据Spring Boot文档,您应该能够在构建中添加这样的行。渐变:<代码>分机['flyway.version']=“4.0.1”<代码>

 类似资料:
  • 我在Liferay DXP中为Google Analytics API编写了代码。我已经通过在build.gradle中编写来导入了以下jar 此外,我还使用以下代码将其包含在bnd.bnd文件中: 该模块编译良好,我能够得到JAR。但是当我在服务器上部署这个jar时,我总是得到未解决的需求:import-package:error。 我知道问题出在传递依赖上。我在Liferay社区的某个地方读到

  • 问题内容: 为什么我应该(或不应该)将gradle依赖项包含为, 有什么好处/缺点? 如您所见,我在支持它的下面的库中添加了@aar。但是一切似乎都还没有做完… 问题答案: 在大多数情况下,您可以使用或上载多种格式的库。 如果不指定后缀,则将以其默认格式(由作者定义,如果不是,则以默认格式)以及所有依赖项下载该库。 指定后缀时,将强制以指定的格式(可能存在或可能不存在)下载库。这很有用,例如当作者

  • null 使用Jenkins Artifactory插件,我能够将这两个模块的JAR发布到Artifactory,但我的另一个依赖于的项目未能构建,出现以下gradle错误 找不到com.mygroup:lib-api:1.0.0-snapshot lib-api/build.gradle null null 我的理解是,ArtiFactory/Gradle应该足够聪明,能够将解析为最新的时间戳快

  • 当我有一个包含POM的项目时,例如: 但是我似乎弄错了,Internet上的Maven文档并没有帮助我解决这个问题。 有什么想法吗?

  • 我创建了一个简单的示例(名称实际上并不意味着什么): GradleMultiProject\core\src\main\java\core.java 堆芯建造

  • 这个问题将澄清什么是传递依赖,以及它在Maven中如何在非常高的级别上工作。 我的定义是:在依赖树中,比如-- 若C在B中有范围编译,那个么将B声明为A的依赖项就足以用Maven构建A。但是,如果C在B中提供了作用域,那么当Maven构建A时,除非A在其依赖项中声明C,否则该构建不会根据C自动编译A。 这是正确的吗?