如何强制Gradle为两个依赖项设置相同的版本?

时间:2015-02-10 23:42:12

标签: java gradle dependencies

我使用以下两个依赖项:

compile 'com.google.guava:guava:14.0.1'
compile 'com.google.guava:guava-gwt:14.0.1'

两者必须是相同的版本才能正常工作。由于我的其他依赖项使用更高版本,因此Gradle为每个依赖项使用不同的版本。

我通过运行gradle dependencies

找到了这个
compile - Compile classpath for source set 'main'.
+--- com.google.guava:guava:14.0.1 -> 17.0
+--- com.google.guava:guava-gwt:14.0.1
|    +--- com.google.code.findbugs:jsr305:1.3.9
|    \--- com.google.guava:guava:14.0.1 -> 17.0 

如何强制Gradle为这两个依赖项设置相同的版本?

8 个答案:

答案 0 :(得分:78)

将此部分添加到dependencies.gradle文件

configurations.all {
        resolutionStrategy { 
            force 'com.google.guava:guava:14.0.1'
            force 'com.google.guava:guava-gwt:14.0.1'
        }
    }

答案 1 :(得分:44)

configurations.all {
  resolutionStrategy {  
    eachDependency { DependencyResolveDetails details ->
      if (details.requested.group == 'com.google.guava') {
        details.useVersion "14.0.1"
      }
    }
  }
}

dependencies {
  compile 'com.google.guava:guava'
  compile 'com.google.guava:guava-gwt'
}

答案 2 :(得分:29)

我遇到过类似的情况,其中一个依赖项使用了spring-web 4.2.4,它被破坏了。您必须强制所需的特定库版本。正如另一条评论所述,它可能会导致兼容性问题,但有时是必要的。

强制我发现的库版本的最少入侵方式是使用

compile "org.springframework:spring-web:4.2.3.RELEASE"

将依赖关系配置指定为强制:

compile("org.springframework:spring-web:4.2.3.RELEASE"){
    force = true
}

我需要暂时降级Spring版本(直到下一个版本)。

答案 3 :(得分:8)

您的一个依赖项是强制guava版本更新。使用gradle dependencies查找正在驱逐您的版本的库。

您遇到的问题是,如果强制它使用14.0.1,则另一个库可能无法正常工作。你能不能只使用17.0版作为你的依赖?

我没有在build.gradle中维护单个版本号,而是使用了dependencies.gradle文件,该文件将包含版本号的映射并将其拉入build.gradle。这样我只需要维护单个番石榴版本。所以你的例子是:

dependencies.gradle

ext {
    ver = [
        guava: '14.0.1'
    ]
}

然后在build.gradle文件中,您可以:

apply from: "dependencies.gradle"

dependencies {
    compile group: 'com.google.guava', module: 'guava', version: ver.guava
    compile group: 'com.google.guava', module: 'guava-gwt', version: ver.guava
}

然后当我想要移动到17.0时,我只需要更改dependencies.gradle。

我也非常喜欢使用

将传递依赖项设置为false
configurations.compile { transitive = false }

这样您就没有在编译时驱逐的某些依赖项,但如果驱逐库不完全向后兼容,则在运行时可能会出现问题。让我们面对它,如果你正在编写代码,你应该知道你使用的库,你应该明确你的依赖。它可以保护您免受升级和搞砸的依赖。

答案 4 :(得分:2)

或者,您可以在 spring-dependency-management Gradle插件中使用 dependencySets (或当BOM POM可用时 mavenBom )支持。请注意,此插件也会自动应用 spring-boot Gradle插件。有关详细信息,请参阅here

plugins {
  id 'io.spring.dependency-management' version '1.0.1.RELEASE'
}

dependencyManagement {
  dependencies {
    dependencySet(group: 'com.google.guava', version: '14.0.1') {
      entry 'guava'
      entry 'guava-gwt'
    }
  }
}

dependencies {
  compile 'com.google.guava:guava'
  compile 'com.google.guava:guava-gwt'
}

答案 5 :(得分:2)

另一种选择是使用依赖关系约束:https://docs.gradle.org/current/userguide/managing_transitive_dependencies.html#sec:dependency_constraints

dependencies {
    implementation 'org.apache.httpcomponents:httpclient'
    constraints {
        implementation('org.apache.httpcomponents:httpclient:4.5.3') {
            because 'previous versions have a bug impacting this application'
        }
        implementation('commons-codec:commons-codec:1.11') {
            because 'version 1.9 pulled from httpclient has bugs affecting this application'
        }
    }
}

答案 6 :(得分:1)

我建议不要设置transitive = false,因为从这一刻开始你必须手动解决依赖树。

您可以通过configurations.all强制推荐所需的番石榴版本,也可以明确添加相关性并将其设置为forced = true

此处的示例:http://www.devsbedevin.com/android-understanding-gradle-dependencies-and-resolving-conflicts/

答案 7 :(得分:1)

如果可以为两个依赖项使用较新版本,则解决问题的最简单方法是更新依赖项:

compile 'com.google.guava:guava:17.0'
compile 'com.google.guava:guava-gwt:17.0'

这将确保它们都在17.0上。它比在旧版本上强制使用它们更简单,并且作为一个额外的奖励,您可以获得更新的版本,其中(可能)带有错误修复和新功能。

公平地说,@ Klunk在他的回答中提到了这一点,并要求"你能不能只使用17.0版作为你的依赖?",但它只是在传递而且容易错过所以我认为发布一个单独的答案是有意义的。

相关问题