如何将解决策略与Gradle混合

如何将解决策略与Gradle混合,gradle,dependency-management,transitive-dependency,Gradle,Dependency Management,Transitive Dependency,假设我的gradle构建脚本中有以下内容: configurations.all { resolutionStrategy { failOnVersionConflict() force 'com.google.guava:guava:18.0' } } 如果发现一个jar的多个版本,则此操作将失败,guava除外,guava将强制使用18.0版本 现在让我们设想一下,我想为所有外部jar使用failOnVersionConflict(),并被迫使用force子

假设我的gradle构建脚本中有以下内容:

configurations.all {
  resolutionStrategy {

    failOnVersionConflict()

    force 'com.google.guava:guava:18.0'
    }
}
如果发现一个jar的多个版本,则此操作将失败,guava除外,guava将强制使用18.0版本

现在让我们设想一下,我想为所有外部jar使用
failOnVersionConflict()
,并被迫使用force子句(因此我知道我在做什么),但我想为某些特定组使用默认的resolutionStrategy(最新版本),如
com.mycompany

这可能吗

我正在查看此文档页面:


我找到了自己的答案。。。但它涉及到一点“黑客”。。。但是,毕竟,这正是gradle所提供的

def dependencyErrors = 0

configurations.all {
  resolutionStrategy {

    def thirdPartyPackages = [:]
    def forced = [ 
        'com.google.guava:guava' : '18.0'
        //Here all forced dependencies...
    ]


     eachDependency { DependencyResolveDetails details ->


          if (!details.requested.group.startsWith('com.mycompany')) {

                def key = details.requested.group + ":" + details.requested.name
                if(!thirdPartyPackages.containsKey(key)) {
                    if(forced.containsKey(key)) {
                        details.useVersion forced.get(key)
                    }                   
                    else {
                        thirdPartyPackages.put(key, details.requested.version);
                    }
                }
                else {
                    def existing =  thirdPartyPackages.get(key);
                    if(existing != details.requested.version) {
                        logger.error "Conflicting versions for [$key]"
                        logger.error "    [$existing]"
                        logger.error "    [$details.requested.version]"
                        dependencyErrors++
                    }
                }
          }
      }

  }
}

myTask.doFirst {
  //here it might also be doLast, or whatever you need. I just put it before a war task, but it might depend on each need. 
  if(dependencyErrors > 0) {
    ant.fail 'There are ' + dependencyErrors + ' conflicting jar versions in the build.'
  }
}

目前没有一种方法可以在单个配置中实现这一点。您唯一的选择是将这些依赖项拆分为两个独立的配置,并为每个配置配置解决策略。您还可以添加一些逻辑来强制执行此操作,即不允许将外部依赖项添加到“内部”配置中。好吧,在查看了您的评论但没有找到任何内容后,我决定通过自己的方式进行破解。。。毕竟,这正是格雷德尔很酷的原因……:)我把它贴出来作为一个答案。。。