Gradle:通过版本分类器覆盖传递依赖关系

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

已尝试以下方法:

  1. 显式添加了依赖项:。但是这两个罐子都被包括在随后的WAR中。compile 'com.google.guava:guava:15.0:cdi1.0'
  2. 显式添加了依赖项并定义了解决策略:

    configurations.all {
        resolutionStrategy {
            force 'com.google.guava:guava:15.0:cdi1.0'
        }
    }
    

    即使这样也行不通。

  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"
            }
        }
    }
    

    即使这样也行不通。

需要您关于如何解决此问题的建议。


答案 1

目前,在解析策略方面尚未考虑分类器。在声明依赖项并显式添加 Guava 版本时,您可以排除可传递的 Guava 库的解决方法:cdi1.0

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

答案 2

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

compile ("com.google.guava:guava:15.0:cdi1.0") {
  force = true
}

解释

依赖项的设置告诉 gradle 在发生版本冲突时使用指定的版本force = true


推荐