Gradle:按版本分类器覆盖传递依赖项

din*_*p24 44 java dependency-management gradle maven guava

在我的项目中声明的依赖项之一具有传递依赖性'com.google.guava:guava:15.0'.但是我在WAS/Weblogic上部署的应用程序由于已修复的CDI问题而无效'com.google.guava:guava:15.0:cdi1.0'.(相同版本,但有分类器)我需要告诉gradle在构建和打包过程中使用这个jar.我试图弄清楚如何使用jar特定的版本分类器来提取这种传递依赖.

试过以下方法:

  1. 明确添加了依赖项:compile 'com.google.guava:guava:15.0:cdi1.0'.但两个罐子都包含在最终的WAR中.
  2. 明确添加了依赖关系并定义了解决策略:

    configurations.all {
        resolutionStrategy {
            force 'com.google.guava:guava:15.0:cdi1.0'
        }
    }
    
    Run Code Online (Sandbox Code Playgroud)

    即使这样也行不通.

  3. 定义了检查和更改版本的解决方案策略.

    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"
            }
        }
    }
    
    Run Code Online (Sandbox Code Playgroud)

    即使这样也行不通.

需要您就如何解决此问题提出建议.

Ren*_*hke 52

目前的分类器在解决策略问题时尚未考虑在内.在声明您的依赖项并明确添加guava cdi1.0版本时,您可以解决传递guava lib的变通方法:

dependencies {
    compile ("org.acme:someDependency:1.0"){
        exclude group: 'com.google.guava', module: 'guava'
    }       
    compile "com.google.guava:guava:15.0:cdi1.0"
}
Run Code Online (Sandbox Code Playgroud)

  • 请注意,这不再是正确的答案。请参阅升级(传递)依赖项:https://docs.gradle.org/current/userguide/dependency_constraints.html 以及降级或排除(传递)依赖项:https://docs.gradle.org/current/userguide/dependency_downgrade_and_exclude .html (10认同)
  • @Pieter我鼓励您提交新答案,因为当前答案都不包含约束答案。 (2认同)

Sob*_*van 24

我遇到了一个更优雅的方法,简单地说:

compile ("com.google.guava:guava:15.0:cdi1.0") {
  force = true
}
Run Code Online (Sandbox Code Playgroud)

说明

force = true依赖项的设置告诉gradle在版本冲突的情况下使用指定的版本

  • @lionello 使用 `implementation("...") { version { strict("...") } }` (7认同)
  • 我得到“‘强制’已被弃用” (5认同)
  • 不适用于`Gradle 4.2.1` (3认同)

Pra*_*jan 17

implementation( group: 'commons-codec', name: 'commons-codec'){
      version{
        strictly "[1.15]"
      }
   }
Run Code Online (Sandbox Code Playgroud)

这对我有用 gradle 6.6.1

strict 的文档链接可以在这里找到https://docs.gradle.org/current/userguide/rich_versions.html#rich-version-constraints


kop*_*por 5

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'
            }
        }
    }
}
Run Code Online (Sandbox Code Playgroud)