如何强制 Gradle 为两个依赖项设置相同的版本?
How can I force Gradle to set the same version for two 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为这两个依赖项设置相同的版本?
将此部分添加到 dependencies.gradle 文件
configurations.all {
resolutionStrategy {
force 'com.google.guava:guava:14.0.1'
force 'com.google.guava:guava-gwt:14.0.1'
}
}
您的一个依赖项正在强制更新番石榴版本。使用 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 }
这样你就不会在编译时驱逐一些依赖项,尽管如果驱逐库不完全向后兼容,你可能会在 运行 时遇到问题。让我们面对现实吧,如果您正在编写代码,您应该知道您使用的是什么库,并且您应该明确说明您的依赖项。它可以保护您免受依赖项之一的升级和困扰。
我遇到了类似的情况,其中一个依赖项使用了 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 版本时使用它(直到下一个版本)。
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'
}
或者,您可以使用 dependencySets(或 mavenBom,当 BOM POM 可用时)支持 spring-dependency-management Gradle 插件。请注意,此插件也会自动应用 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'
}
我建议不要设置 transitive = false
,因为这种方法会迫使您自己手动解决依赖关系树。
您可以通过 configurations.all
强制使用所需的番石榴版本,或者显式添加依赖项并设置它 forced = true
。
此处示例:http://www.devsbedevin.net/android-understanding-gradle-dependencies-and-resolving-conflicts/
如果只对两个依赖项使用较新版本没问题,解决问题的最简单方法是更新依赖项:
compile 'com.google.guava:guava:17.0'
compile 'com.google.guava:guava-gwt:17.0'
这将确保它们都在 17.0.这比尝试在旧版本上强制使用它们更简单,而且作为额外的好处,您可以获得更新的版本,该版本(可能)带有错误修复和新功能。
公平地说,@Klunk 通过询问 "Can you not just use the 17.0 version as your dependency?" 在他的回答中提到了这一点,但这只是路过,很容易错过,所以我认为将 post 作为一个单独的答案是有意义的.
另一种选择是使用依赖约束: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'
}
}
}
您可以像这样“强制”gradle 中的 libraries/dependencies 版本:
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
app/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
这是针对 Kotlin DSL (build.gradle.kts) 测试的 Gradle 7.1:
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")
}
}
我使用了以下两个依赖项:
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为这两个依赖项设置相同的版本?
将此部分添加到 dependencies.gradle 文件
configurations.all {
resolutionStrategy {
force 'com.google.guava:guava:14.0.1'
force 'com.google.guava:guava-gwt:14.0.1'
}
}
您的一个依赖项正在强制更新番石榴版本。使用 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 }
这样你就不会在编译时驱逐一些依赖项,尽管如果驱逐库不完全向后兼容,你可能会在 运行 时遇到问题。让我们面对现实吧,如果您正在编写代码,您应该知道您使用的是什么库,并且您应该明确说明您的依赖项。它可以保护您免受依赖项之一的升级和困扰。
我遇到了类似的情况,其中一个依赖项使用了 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 版本时使用它(直到下一个版本)。
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'
}
或者,您可以使用 dependencySets(或 mavenBom,当 BOM POM 可用时)支持 spring-dependency-management Gradle 插件。请注意,此插件也会自动应用 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'
}
我建议不要设置 transitive = false
,因为这种方法会迫使您自己手动解决依赖关系树。
您可以通过 configurations.all
强制使用所需的番石榴版本,或者显式添加依赖项并设置它 forced = true
。
此处示例:http://www.devsbedevin.net/android-understanding-gradle-dependencies-and-resolving-conflicts/
如果只对两个依赖项使用较新版本没问题,解决问题的最简单方法是更新依赖项:
compile 'com.google.guava:guava:17.0'
compile 'com.google.guava:guava-gwt:17.0'
这将确保它们都在 17.0.这比尝试在旧版本上强制使用它们更简单,而且作为额外的好处,您可以获得更新的版本,该版本(可能)带有错误修复和新功能。
公平地说,@Klunk 通过询问 "Can you not just use the 17.0 version as your dependency?" 在他的回答中提到了这一点,但这只是路过,很容易错过,所以我认为将 post 作为一个单独的答案是有意义的.
另一种选择是使用依赖约束: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'
}
}
}
您可以像这样“强制”gradle 中的 libraries/dependencies 版本:
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
app/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
这是针对 Kotlin DSL (build.gradle.kts) 测试的 Gradle 7.1:
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")
}
}