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

con*_*ile 60 java dependencies gradle

我使用以下两个依赖项:

compile 'com.google.guava:guava:14.0.1'
compile 'com.google.guava:guava-gwt:14.0.1'
Run Code Online (Sandbox Code Playgroud)

两者必须是相同的版本才能正常工作.由于我的其他依赖项使用更高版本,因此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 
Run Code Online (Sandbox Code Playgroud)

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

cmc*_*nty 90

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

configurations.all {
        resolutionStrategy { 
            force 'com.google.guava:guava:14.0.1'
            force 'com.google.guava:guava-gwt:14.0.1'
        }
    }
Run Code Online (Sandbox Code Playgroud)

  • 把它放在gradle文件中的哪个位置?在块的底部? (21认同)
  • 这和使用约束+“严格”有什么区别? (3认同)
  • 这在`dependencies.gradle`文件中 (2认同)

Vya*_*ets 50

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'
}
Run Code Online (Sandbox Code Playgroud)


Pij*_*usn 34

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

强迫我发现的库版本的最小侵入方式是使用而不是使用

compile "org.springframework:spring-web:4.2.3.RELEASE"
Run Code Online (Sandbox Code Playgroud)

指定依赖配置为强制:

compile("org.springframework:spring-web:4.2.3.RELEASE"){
    force = true
}
Run Code Online (Sandbox Code Playgroud)

当我需要暂时降级Spring版本(直到下一个版本)时,我使用它.

  • force = true 现已弃用 (6认同)
  • 事实上,“force = true”已被弃用。您现在应该使用`严格`:`implementation("org.springframework:spring-web") { version {严格"4.2.3.RELEASE" } }` (4认同)

Klu*_*unk 13

您的一个依赖项是强制guava版本更新.使用gradle dependencies以定位库驱逐你的版本.

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

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

dependencies.gradle

ext {
    ver = [
        guava: '14.0.1'
    ]
}
Run Code Online (Sandbox Code Playgroud)

然后在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
}
Run Code Online (Sandbox Code Playgroud)

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

我也是将传递依赖关系设置为false的明确粉丝

configurations.compile { transitive = false }
Run Code Online (Sandbox Code Playgroud)

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


Mah*_*zad 11

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

dependencies {
    implementation("org.jsoup", "jsoup") {
        version {
            strictly("1.14.3")
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

其他方式:

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

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

configurations.all {
    resolutionStrategy {
        force("org.jsoup:jsoup:1.14.3")
        force("com.google.guava:guava-gwt:14.0.1")
    }
}
Run Code Online (Sandbox Code Playgroud)


sen*_*982 10

另一种选择是使用依赖约束: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'
        }
    }
}
Run Code Online (Sandbox Code Playgroud)


Vai*_*den 5

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

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

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