如何强制Gradle库使用其自己的依赖项版本而不是项目的依赖项版本?

pbwdgjma  于 2023-10-19  发布在  其他
关注(0)|答案(1)|浏览(140)

有这些gradle项目:

*主项目(使用库A库B-version-1
*library A(使用library B-version-2,声明为api,因此主项目在依赖项B-v1和B-v2中有两个版本)。

当我运行应用程序时,来自库A的代码使用主项目中指定的库B版本(B-v1),而不是它最初使用的版本(B-v2)。
有没有办法强制库A使用它自己的库B版本?

pkwftd7m

pkwftd7m1#

有没有办法强制库A使用它自己的库B版本?
是的,但是你如何实现它取决于你的目标:

  • 如果你想让library-A使用它自己的library-B版本,同时让主项目使用它自己的library-B版本,你需要使用Java Module System,或者在类加载方面做一些危险的技巧。
  • 如果你想从library-A强制library-B的版本,而不是从主项目的版本,你只需要告诉Gradle比平常多几句话-这就是我的答案

要了解为什么选择library-Bv2版本,您可以阅读此手册:
Gradle将考虑所有请求的版本,无论它们出现在依赖关系图中的何处。在这些版本中,它将选择最高的版本。

假设#1

  • 您自己定义了library-B的版本,可以在主项目中更改它。*

因此,只需将library-B的版本更改为来自library-A的版本,或者删除依赖声明->,将使用library-B上的传递依赖

假设#2

  • 您没有自己定义library-B的版本,无法在主项目中更改。例如,此版本来自另一个库。

有几种方法可以说明Gradle应该使用哪个版本的library-B
例如,使用富版本声明,您可以使用您喜欢的版本定义library-B的实现:

// build.gradle.kts

dependencies {
    implementation("group.name:library-A:v1") // uses 'library-B' version 'v1'
    implementation("group.name:library-C:v1") // uses 'library-B' version 'v2'
    implementation("group.name:library-B") {
        version {
            strictly("v1")
        }
    }
}

或者使用resolution strategy configuration

// build.gradle.kts

configurations.all {
    resolutionStrategy {
        force "group.name:library-B:v1"
    }
}

相关问题