如何让模块中的依赖项优先于顶级存储库中的build.gradle

时间:2019-06-15 00:04:26

标签: java gradle dependencies

我的项目存储库树如下所示:

Project
  module1
    module1.gradle
  module2
    module2.gradle
  ...
  build.gradle

然后在build.gradle文件中存在一些依赖关系和一些强制解决策略,例如

  configurations.all {
      resolutionStrategy {
        cacheChangingModulesFor 0, 'seconds'
        force 'org.apache.hadoop:hadoop-common:2.5.0-cdh5.3.3',
      }
  }
  dependencies {
    compile(group: 'org.apache.hadoop', name: 'hadoop-common', version: '2.6.0-cdh5.16.1')
  }

但是,module1.gradle定义了hadoop-common like的更高版本

compile group: 'org.apache.hadoop', name: 'hadoop-common', version: '2.5.0-cdh5.3.3'

我想将此升级到我的module1,module2..moduleX以使用'2.6.0-cdh5.16.1'。有些项目不需要升级,应该继续使用旧版本,因此我需要将强制依赖项保留在顶级build.gradle文件中。实际上,我不想接触我不拥有的任何模块。

是否可以在模块级别指定始终使用当前模块中定义的内容,而不是从顶级build.gradle继承?

1 个答案:

答案 0 :(得分:1)

顶层的force(..)语句旨在覆盖模块中指定的任何版本。

您可以通过在模块内部版本中放置另一个force(..)语句来重新覆盖该force(..)语句。第二条force语句在顶级语句之后进行评估,因此它将重新覆盖模块版本。

您可以在模块的build.gradle文件中放置

configurations.all {
  resolutionStrategy {
    force 'org.apache.hadoop:hadoop-common:2.6.0-cdh5.16.1'
  }
}

请注意,尽管覆盖和重新覆盖的版本会引起混淆。例如,编辑顶层构建的人员将期望他们的force被正确地应用于所有模块-如果您在模块中重新覆盖它,情况并非如此。