Gradle:通过版本分类器覆盖传递依赖
Posted
技术标签:
【中文标题】Gradle:通过版本分类器覆盖传递依赖【英文标题】:Gradle: Override transitive dependency by version classifier 【发布时间】:2015-08-24 01:32:06 【问题描述】:我的项目中声明的依赖项之一对'com.google.guava:guava:15.0'
具有传递依赖项。但是由于'com.google.guava:guava:15.0:cdi1.0'
中已修复的 CDI 问题,我在 WAS/Weblogic 上部署的应用程序无法运行。 (相同版本,但带有分类器)我需要告诉 gradle 在构建和打包过程中使用这个 jar。我试图弄清楚我们如何使用特定于 jar 的版本分类器来覆盖这种传递依赖。
尝试了以下方法:
-
显式添加了依赖项:
compile 'com.google.guava:guava:15.0:cdi1.0'
。但是这两个 jar 都包含在生成的 WAR 中。
显式添加依赖并定义解析策略:
configurations.all
resolutionStrategy
force 'com.google.guava:guava:15.0:cdi1.0'
即使这样也没有用。
定义了检查和更改版本的解决策略。
configurations.all
resolutionStrategy.eachDependency DependencyResolveDetails details ->
if (details.requested.group + ":" + details.requested.name == 'com.google.guava:guava')
details.useVersion "15.0:cdi1.0"
//details.useTarget "com.google.guava:guava:15.0:cdi1.0"
即使这样也没有用。
需要您就如何解决此问题提出建议。
【问题讨论】:
【参考方案1】:implementation( group: 'commons-codec', name: 'commons-codec')
version
strictly "[1.15]"
这适用于我的 gradle 6.6.1
严格的文档链接可以在这里找到https://docs.gradle.org/current/userguide/rich_versions.html#rich-version-constraints
【讨论】:
【参考方案2】:目前分类器在resolutionStrategies 中尚未被考虑在内。在声明依赖项并显式添加 Guava cdi1.0
版本时,您可能会排除传递 Guava 库:
dependencies
compile ("org.acme:someDependency:1.0")
exclude group: 'com.google.guava', module: 'guava'
compile "com.google.guava:guava:15.0:cdi1.0"
【讨论】:
请注意,这不再是正确答案。请参阅升级(传递)依赖项:docs.gradle.org/current/userguide/dependency_constraints.html 和降级或排除(传递)依赖项:docs.gradle.org/current/userguide/… @Pieter 我鼓励你提交一个新的答案,因为当前的答案都不包含约束答案。【参考方案3】:由于force = true
已被弃用,相关解决方案是使用strictly(...)
版本,例如:
dependencies
// no need to exclude transitive spring-data-relational from this dependency
implementation("org.springframework.data", "spring-data-r2dbc", "1.1.0.RC1")
implementation("org.springframework.data", "spring-data-relational").version
strictly("2.0.0.RC1")
附:在 Gradle 6.3 上测试
【讨论】:
是否有文档?..“严格”在 Gradle 6.4.1 中不起作用 @happy 我在严格的docs.gradle.org/current/userguide/…实现上找到的文档链接(组:'commons-codec',名称:'commons-codec') version strict "[1.15]" 【参考方案4】:Gradle 4.5.1 具有函数DependencySubstitutions。这里是一个替换依赖的例子:
configurations.each
c -> c.resolutionStrategy.dependencySubstitution
all DependencySubstitution dependency ->
if (dependency.requested.group == 'org.json')
dependency.useTarget 'com.vaadin.external.google:android-json:0.0.20131108.vaadin1'
【讨论】:
【参考方案5】:我遇到了一种更优雅的方法,它很简单:
compile ("com.google.guava:guava:15.0:cdi1.0")
force = true
说明
为依赖设置force = true
告诉gradle在版本冲突的情况下使用指定的版本
【讨论】:
我收到'force' is deprecated
【参考方案6】:
如果其他 jar 指向相同的依赖项,这将不起作用。排除依赖的Sureshot方法
configurations
all*.exclude group: 'com.google.guava', module:'guava-jdk5'
【讨论】:
以上是关于Gradle:通过版本分类器覆盖传递依赖的主要内容,如果未能解决你的问题,请参考以下文章
是否可以使用 Spring 的 Gradle 依赖管理插件设置 dependencySet 条目的分类器