【问题标题】:Gradle: Override transitive dependency by version classifierGradle:通过版本分类器覆盖传递依赖
【发布时间】: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 的版本分类器来覆盖这种传递依赖。

尝试了以下方法:

  1. 显式添加了依赖项:compile 'com.google.guava:guava:15.0:cdi1.0'。但是这两个 jar 都包含在生成的 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"
            }
        }
    }
    

    即使这样也没有用。

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

【问题讨论】:

    标签: java maven gradle guava dependency-management


    【解决方案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"
      }
      

      【讨论】:

      【解决方案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'
        }
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2014-10-25
          • 2018-09-07
          • 1970-01-01
          • 2016-11-30
          • 1970-01-01
          • 2019-04-07
          相关资源
          最近更新 更多