代码之家  ›  专栏  ›  技术社区  ›  PDStat

Gradle对测试使用slf4j simple,对运行时使用log4j12

  •  1
  • PDStat  · 技术社区  · 6 年前

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

    我曾为格雷德做过类似的事情

    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 回复  |  直到 6 年前
        1
  •  1
  •   lance-java    6 年前

    你可以试试

    gradle dependencies --configuration testRuntime
    

    看看它是从哪里来的

        2
  •  1
  •   lance-java    6 年前

    另一个建议,将此添加到您的一个测试中

    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()));
    } 
    
        3
  •  0
  •   lance-java    6 年前

    我感觉到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 配置我想你可能发现了一个渐变错误。