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 ,并将其用于我的测试类路径.
目前我已经设法解决了这个问题,但我仍然欢迎任何更好的解决方案.
这是我最终做的事情:
为log4j添加新配置:
log4j(group: 'log4j', name: 'log4j', version: '1.2.15') {
transitive = false
}
Run Code Online (Sandbox Code Playgroud)除了该配置之外,保留所有配置的配置级别排除:
configurations.findAll {!it.name.endsWith('log4j')}.each { conf ->
conf.exclude group: "log4j", module: "log4j"
}
Run Code Online (Sandbox Code Playgroud)将log4j配置添加到我的测试的类路径中:
test {
classpath += configurations.log4j
}
Run Code Online (Sandbox Code Playgroud)这样我们就可以将log4j.jar放到类路径上,即使它已从testRuntime配置中排除.
即使我遇到了类似的情况,我也需要从胖罐中排除火花罐,但测试用例需要执行火花罐。因此以下配置对我来说很有效。因此,基本上我正在将编译时依赖项添加到测试类路径中。因此,对于您的问题,以下解决方案应该有效
configurations{
runtime.exclude group: 'log4j'
}
test {
classpath += configurations.compile
}
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
25738 次 |
最近记录: |