Java Gradle:通过版本分类器覆盖可传递依赖项

Java Gradle:通过版本分类器覆盖可传递依赖项,java,maven,gradle,guava,dependency-management,Java,Maven,Gradle,Guava,Dependency Management,我的项目中声明的一个依赖项在'com.google.guava:guava:15.0'上具有可传递依赖项。但是我部署在WAS/Weblogic上的应用程序无法工作,因为CDI问题已在'com.google.guava:guava:15.0:cdi1.0'中修复。(同一版本,但带有分类器)我需要告诉gradle在构建和打包期间使用这个jar。我试图弄清楚如何使用jar特定的版本分类器来消除这种可传递的依赖关系 尝试了以下方法: 明确添加了依赖项:compile'com.google.guava:g

我的项目中声明的一个依赖项在
'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'
    。但两个罐子都被卷入了这场战争
  • 明确添加了依赖项并定义了解决策略:

    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"
            }
        }
    }
    
    即使这样也不行


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

    目前,在解决策略方面,尚未考虑分类器。在声明依赖项并显式添加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"
    }
    

    如果其他jar指向相同的依赖项,那么这将不起作用。排除依赖关系的可靠方法

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

    我发现了一种更优雅的方法,简单地说:

    compile ("com.google.guava:guava:15.0:cdi1.0") {
      force = true
    }
    
    解释
    为依赖项设置
    force=true
    告诉gradle在版本冲突时使用指定的版本

    gradle 4.5.1具有此功能。以下是替换依赖项的示例:

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

    由于不推荐使用
    force=true
    ,因此相关的解决方案是严格使用
    (…)
    版本,例如:

    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上测试

    implementation( group: 'commons-codec', name: 'commons-codec'){
          version{
            strictly "[1.15]"
          }
       }
    
    这适用于gradle 6.6.1


    可在此处找到“严格”的文档链接

    是否有文档?“严格”在Gradle 6.4中不起作用。1@happy我在严格实现中找到的文档链接(组:'commons codec',名称:'commons codec'){version{strickly'[1.15]'}这在gradle 7.0上不起作用…这在gradle 7.0上起作用我把这行代码放在哪里?