【发布时间】: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