Gradle将SLF4J简单用于测试并将Log4j12用于运行时

时间:2018-07-18 10:03:54

标签: gradle slf4j

我在测试期间正在使用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]

3 个答案:

答案 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错误。