首页 文章

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

提问于
浏览
33

在我的项目中声明的其中一个依赖项对 'com.google.guava:guava:15.0' 具有传递依赖性 . 但是我在WAS / Weblogic上部署的应用程序由于CDI问题而无法正常工作,该问题已在 'com.google.guava:guava:15.0:cdi1.0' 中修复 . (相同的版本,但有分类器)我需要告诉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"
        }
    }
}

即使这样也行不通 .

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

4 回答

  • 11

    目前在分辨率策略方面尚未考虑分类器 . 在声明您的依赖项并明确添加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"
    }
    
  • 2

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

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

    解释

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

  • 44

    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'
                }
            }
        }
    }
    
  • 3

    如果某个其他jar指向相同的依赖项,这将不起作用 . Sureshot方式排除依赖

    configurations {
     all*.exclude group: 'com.google.guava', module:'guava-jdk5'
    }
    

相关问题