我在测试期间正在使用slf4j,我希望通过使用slf4j simple在控制台上看到日志输出。然后运行时将使用log4j配置。
我能够通过这样声明依赖项来在maven中做到这一点
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-api</artifactId>
<version>${slf4j.version}</version>
<scope>compile</scope>
</dependency>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-simple</artifactId>
<version>${slf4j.version}</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-log4j12</artifactId>
<version>${slf4j.version}</version>
<scope>runtime</scope>
</dependency>
我尝试过为Gradle做类似的事情
dependencies {
compile "org.slf4j:slf4j-api:$SLF4J_VERSION"
testCompile "org.slf4j:slf4j-simple:$SLF4J_VERSION"
runtime "org.slf4j:slf4j-log4j12:$SLF4J_VERSION"
}
但是在构建期间,我可以看到它仍在使用Log4j12实现。我该如何解决?
SLF4J: Class path contains multiple SLF4J providers.
SLF4J: Found provider [org.slf4j.log4j12.Log4j12ServiceProvider@4ad9cc78]
SLF4J: Found provider [org.slf4j.simple.SimpleServiceProvider@6e869e5e]
SLF4J: See http://www.slf4j.org/codes.html#multiple_bindings for an explanation.
SLF4J: Actual provider is of type [org.slf4j.log4j12.Log4j12ServiceProvider@4ad9cc78]
答案 0 :(得分:1)
您可以尝试
gradle dependencies --configuration testRuntime
查看它的来源
答案 1 :(得分:1)
另一个建议,将其添加到您的测试中
String path = "org/slf4j/log4j12/Log4j12ServiceProvider.class";
Enumeration<URL> urls = getClass().getClassLoader().getResources(path);
while (urls.hasMoreElements()) {
System.out.println(String.format("found %s at %s", path, urls.nextElement()));
}
答案 2 :(得分:0)
我感觉到buildscript类路径以某种方式泄漏到junit类路径中。尝试将其添加到您的build.gradle
task showInConfigurations {
doLast {
String path = "org/slf4j/log4j12/Log4j12ServiceProvider.class"
def configs = [buildscript.configurations.classpath, configurations.testRuntime]
configs.each { config ->
config.files.each { file ->
if (file.name.endsWith('.jar')) {
Set<File> matches = zipTree(file).matching { include path}.files
if (matches) println "Found $path in $config.name in $file"
}
}
}
}
}
如果它不在testRuntime
配置中,我认为您可能已经发现了gradle错误。