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

时间:2015-06-09 09:44:28

标签: java maven gradle guava dependency-management

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

    即使这样也没有用。

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

    即使这样也没有用。

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

6 个答案:

答案 0 :(得分:50)

目前的分类器尚未考虑到ResolutionStrategies。在声明依赖关系并明确添加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"
}

答案 1 :(得分:15)

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

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

解释

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

答案 2 :(得分: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'
            }
        }
    }
}

答案 3 :(得分:2)

如果其他jar指向相同的依赖项,则无效。 Sureshot方式排除依赖

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

答案 4 :(得分:1)

由于不推荐使用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")
    }
}

P.S。在Gradle 6.3上进行了测试

答案 5 :(得分:0)

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

中找到