90

我使用以下两个依赖项:

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 为这两个依赖项设置相同的版本?

4

11 回答 11

122

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

configurations.all {
        resolutionStrategy { 
            force 'com.google.guava:guava:14.0.1'
            force 'com.google.guava:guava-gwt:14.0.1'
        }
    }
于 2015-02-11T01:08:29.133 回答
73
configurations.all {
  resolutionStrategy.eachDependency { 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'
}
于 2016-09-02T12:14:53.560 回答
42

我遇到过类似的情况,其中一个依赖项使用了损坏的 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 版本时使用它(直到下一个版本)。

于 2016-02-10T18:57:50.230 回答
19

您的依赖项之一是强制更新番石榴版本。用于gradle dependencies定位哪个库正在驱逐您的版本。

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

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

依赖项.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 }

这样,您就不会在编译时驱逐一些依赖项,尽管如果驱逐库不完全向后兼容,您可能会在运行时遇到问题。让我们面对它,如果您正在编写代码,您应该知道您使用哪些库并且您应该明确说明您的依赖关系。它可以保护您免受您的依赖项之一升级和搞砸。

于 2015-02-11T23:01:13.947 回答
6

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

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'
        }
    }
}
于 2019-08-24T07:53:54.457 回答
4

我建议不要设置transitive = false,因为这种方法会迫使你自己手动解决依赖树。

您可以通过 强制使用所需的番石榴版本configurations.all,也可以显式添加依赖项并进行设置forced = true

这里的例子:http: //www.devsbedevin.net/android-understanding-gradle-dependencies-and-resolving-conflicts/

于 2017-04-04T08:54:23.583 回答
2

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

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'
}
于 2017-03-23T23:20:24.937 回答
1

您可以像这样在 gradle 中为库/依赖项“强制”版本:

    configurations.all {
        resolutionStrategy {
            force("org.jetbrains.kotlin:kotlin-stdlib:1.4.32",
                "org.jetbrains.kotlin:kotlin-stdlib-jdk8:1.4.32", 
"org.jetbrains.kotlin:kotlin-reflect:1.4.32"
            )
        }
    }

您可以在这里获得更多信息:https ://docs.gradle.org/current/dsl/org.gradle.api.artifacts.ResolutionStrategy.html

于 2021-09-08T19:46:14.697 回答
1

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

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

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

公平地说,@Klunk 在他的回答中提到了这一点,他问“你能不能只使用 17.0 版本作为你的依赖项?”,但这只是顺带一提,很容易错过,所以我认为作为单独的答案发布是有意义的.

于 2018-02-05T15:55:14.937 回答
0

应用程序/build.gradle

dependencies {
    compile('com.google.guava:guava') {
        version {
            strictly '14.0.1'
        }
    }
    compile('com.google.guava:guava-gwt') {
        version {
            strictly '14.0.1'
        }
    }
}

版本 Gradlew

Gradle 6.7
于 2022-02-16T10:25:38.470 回答
0

这适用于使用 Gradle 7.1测试的 Kotlin DSL (build.gradle.kts) :

dependencies {
    implementation("org.jsoup", "jsoup") {
        version {
            strictly("1.14.3")
        }
    }
}

另一种方式:

dependencies {
    implementation("org.jsoup:jsoup") {
        version {
            strictly("1.14.+") // You can also use dynamic versions
        }
    }
}

其他答案建议的另一种方式:

configurations.all {
    resolutionStrategy {
        force("org.jsoup:jsoup:1.14.3")
        force("com.google.guava:guava-gwt:14.0.1")
    }
}
于 2022-02-18T09:13:12.660 回答