gpt4 book ai didi

java - 模块之间的依赖管理

转载 作者:行者123 更新时间:2023-11-30 02:28:00 26 4
gpt4 key购买 nike

如果我有模块 A 和模块 B 都需要 JSON 库(比如 GSON),然后我有应用程序 C,其中包括模块 A 和 B。如果模块 A 和 B 使用不同的版本,我有可能获得两个不同版本的 JSON 库吗?或者 gradle 是否删除其中之一并仅使用其中一个版本?

如果我有更多模块怎么办,更新它们以使用相同版本的依赖项似乎需要大量工作。在这种情况下,让应用程序 C 决定在所有模块上使用哪个版本会很好(但我猜由于向后兼容性,并不总是有效)。无论如何要实现这个目标吗?

所以我的问题是如何最好地处理在许多模块中非常常见的依赖关系。我是否应该有一个 Json 包装器,将其注入(inject)到所有模块中,让应用程序定义要使用的内容?

我猜日志记录可能是类似的依赖项

最佳答案

是的。如果您特别要求在项目 A 和 B 中使用同一库的不同版本,则最终可能会得到同一直接依赖项的不同版本。

对于暂时依赖项,默认行为是确定所请求依赖项的最新版本。请注意“最新”一词,而不是所要求的最高版本。只要版本向后兼容您的项目实际期望的最低版本就可以了。

幸运的是,gradle 有几种内置方法来解决依赖冲突。

我在这里写了大量关于这个主题的文章:http://www.devsbedevin.net/android-understanding-gradle-dependencies-and-resolving-conflicts/

TL;DR

您可以选择在冲突时失败:

configurations.all {  
resolutionStrategy {
failOnVersionConflict()
}
}

强制特定的依赖关系:

configurations.all {  
resolutionStrategy {
force 'asm:asm-all:3.3.1', 'commons-io:commons-io:1.4', 'com.parse.bolts:bolts-android:1.+'
}
}

更喜欢您自己的模块:

configurations.all {  
resolutionStrategy {
preferProjectModules()
}
}

将库 X 的所有实例替换为 Y(库、模块或项目):

configurations.all {  
resolutionStrategy {
dependencySubstitution {
substitute module('commons-io:commons-io:2.4') with project(':my-commons-io')
}
}
}

排除特定库的所有临时依赖项并手动添加必要的库:

dependencies {  
compile('com.android.support:appcompat-v7:23.1.0') {
transitive = false
}
}

排除特定的传递依赖:

dependencies {  
compile('com.android.support:appcompat-v7:23.1.0') {
exclude group: 'com.parse.bolts'
}
}

强制您的项目使用特定版本,无论实际的依赖关系要求如何:

dependencies {  
compile('com.parse.bolts:bolts-android:1.+') {
force = true
}
}

关于java - 模块之间的依赖管理,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45118963/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com