【问题标题】:How does Gradle handle redundant dependenciesGradle 如何处理冗余依赖
【发布时间】:2018-02-06 08:38:40
【问题描述】:

如果我的 build.gradle 文件中有两个引用组工件的依赖项,并且这两个组都包含对相同 jar 文件的引用,Gradle 如何处理它们? Gradle 是否识别组成组的各个 jar 文件之间的版本差异,并且仅在进行编译时选择具有最新版本的文件,还是选择 build.gradle 文件中最后列出的文件?示例:

dependencies {
   compile group: 'some-sdk-1', name: 'sdk1', version: '2.5'
   compile group: 'some-sdk-2', name: 'sdk2', version: '1.0'
}

在本例中,some-sdk-1 可能包含一个名为 lib1-1.0.jar 的 jar 在 some-sdk-2 中,存在相同的库,但版本不同。例如 lib1-2.0.jar

用的是哪个jar文件?

【问题讨论】:

  • 您可以运行./gradlew :dependencyInsight --dependency lib1 --configuration compile(如果您在Windows 上将./gradlew 替换为gradlew.bat。您将看到Gradle 是如何解决冲突的。默认情况下,您将看到lib1-2.0。 jar(最新)被选中。

标签: gradle


【解决方案1】:

这取决于 jar 文件如何放入库 (sdk) 中。

您应该将 jar 文件作为 transitive 依赖项进行管理。
这意味着在与 sdk 相关的 pom 文件中,您具有 jar 文件的依赖关系。
在这种情况下你可以check the doc:

Gradle 提供以下冲突解决策略:

最新:使用最新版本的依赖项。这是 Gradle 的默认策略,只要版本向后兼容,这通常是一个合适的选择。

失败:版本冲突导致构建失败。此策略要求在构建脚本中明确解决所有版本冲突。有关如何明确选择特定版本的详细信息,请参阅 ResolutionStrategy。

如果您只是将 jar 放入 sdk 而不使用传递依赖项(只是里面的 jar 文件):

如果您不使用传递依赖管理,则无法检测到版本冲突,并且类路径的经常意外顺序将决定哪个版本的依赖将胜出。

【讨论】:

    猜你喜欢
    • 2010-09-14
    • 1970-01-01
    • 2011-10-20
    • 2013-06-15
    • 2019-02-19
    • 2019-08-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多