【问题标题】:Gradle - exclude a dependency for a configuration, but not for an inheriting configurationGradle - 排除配置的依赖项,但不排除继承配置
【发布时间】:2012-04-12 16:45:05
【问题描述】:

使用 Gradle 1.0 里程碑 8。

我的项目使用 slf4j+Logback 进行日志记录,所以我想防止 log4j 上的任何传递依赖项污染我的类路径。因此,我添加了一个全局排除项,如下所示:

configurations {
    all*.exclude group: "log4j", module: "log4j"
}

但是,我正在使用一个测试库 (hadoop-minicluster),它对 log4j 具有运行时依赖项,因此我现在需要为我的测试运行时允许 log4j 依赖项。我尝试添加对 log4j 的直接依赖:

testRuntime group: "log4j", name: "log4j", version: "1.2.15"

并编辑我的排除代码(有点小技巧):

configurations.findAll {!it.name.endsWith('testRuntime')}.each { conf ->
    conf.exclude group: "log4j", module: "log4j"
}

但这不起作用。将排除项添加到 testCompile conf 会自动将其添加到所有继承配置中,包括 testRuntime。而且似乎这个排除甚至覆盖了我添加的显式依赖。

这似乎是 Gradle 的预期行为。来自the docs

如果您为特定配置定义排除项,则在解析此配置或任何继承配置时,将为所有依赖项过滤排除的传递依赖项。

那么还有其他方法可以实现我想要实现的目标吗?

想法:

  • 创建一个不从 testCompile 扩展的新 conf myTestRuntime,并将其用于我的测试类路径。
    • 但是我必须复制 testCompile 和 myTestRuntime 的所有依赖项。
  • 删除配置级排除项。对于除 testRuntime 之外的所有 conf,循环依赖并手动删除 log4j(或在 log4j 上添加 dep 级排除)。
    • 这甚至可能吗? Configuration.allDependencies 是只读的。

【问题讨论】:

    标签: gradle dependencies


    【解决方案1】:

    目前我已经设法解决了这个问题,但我仍然欢迎任何更好的解决方案。

    这是我最终做的:

    • 为 log4j 添加新配置:

      log4j(group: 'log4j', name: 'log4j', version: '1.2.15') {
          transitive = false
      }
      
    • 为除该配置之外的所有配置保留配置级排除项:

      configurations.findAll {!it.name.endsWith('log4j')}.each { conf ->
          conf.exclude group: "log4j", module: "log4j"
      }
      
    • 将 log4j 配置添加到我的测试类路径中:

      test {
          classpath += configurations.log4j
      }
      

    这样我们可以将 log4j.jar 放到类路径中,即使它被排除在 testRuntime 配置之外。

    【讨论】:

    【解决方案2】:

    即使我遇到了类似的情况,我需要将 spark jar 排除在 fat jar 中,但测试用例需要 spark jar 才能执行。所以下面的配置对我有用。所以基本上我正在添加编译时依赖项来测试类路径。所以对于你的问题,下面的解决方案应该可以工作

    configurations{
        runtime.exclude group: 'log4j'
    }
    
    test {
            classpath += configurations.compile
    }
    

    【讨论】:

      【解决方案3】:

      您不需要定义排除项。除非您重新配置某些内容,否则项目的 testRuntime 配置将仅用于该项目的 test 任务。

      【讨论】:

      • 对不起,我的问题应该更清楚地说明排除的原因。我的项目对第三方库有很多依赖,其中许多库在 log4j 上拖入了不需要的传递依赖项。我可以为每个库添加 dep 级别的排除项,但当然在配置级别阻止 log4j 要容易得多。 (我不想每次添加新库时都再次出现可怕的 log4j!)
      猜你喜欢
      • 2017-09-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-07-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-04-12
      相关资源
      最近更新 更多