Gradle - 排除配置的依赖关系,但不包括继承配置

Chr*_*s B 18 dependencies gradle

使用Gradle 1.0里程碑8.

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

configurations {
    all*.exclude group: "log4j", module: "log4j"
}
Run Code Online (Sandbox Code Playgroud)

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

testRuntime group: "log4j", name: "log4j", version: "1.2.15"
Run Code Online (Sandbox Code Playgroud)

并编辑我的排除代码(有点黑客):

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

但这不起作用.将排除添加到testCompile conf会自动将其添加到所有继承配置中,包括testRuntime.并且似乎这种排除优先于我添加的显式依赖.

看来这是Gradle的预期行为.来自文档:

如果为特定配置定义排除,则在解析此配置或任何继承配置时,将针对所有依赖项筛选排除的传递依赖关系.

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

思路:

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

Chr*_*s B 8

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

这是我最终做的事情:

这样我们就可以将log4j.jar放到类路径上,即使它已从testRuntime配置中排除.

  • 你能不能进行全局排除,然后添加`log4j-over-slf4j.jar`?http://www.slf4j.org/legacy.html (2认同)

use*_*860 5

即使我遇到了类似的情况,我也需要从胖罐中排除火花罐,但测试用例需要执行火花罐。因此以下配置对我来说很有效。因此,基本上我正在将编译时依赖项添加到测试类路径中。因此,对于您的问题,以下解决方案应该有效

configurations{
    runtime.exclude group: 'log4j'
}

test {
        classpath += configurations.compile
}
Run Code Online (Sandbox Code Playgroud)