SLF4J和记录器工厂

时间:2012-02-08 18:36:15

标签: java reflection logging slf4j

我认为SLF4J会通过反射加载 org.slf4j.impl.StaticLoggerBinder ,但查看 org.slf4j.LoggerFactory 中的代码,情况并非如此:< / p>

StaticLoggerBinder.getSingleton().getLoggerFactory();

这可能表明当他们打包slf4j-api.jar时,他们在类路径中有 slf4j-simple.jar (或 slf4j-nop.jar ) ,然而这将导致循环依赖,因为上面的方法返回的 ILoggerFactory 接口在 slf4j-api.jar 中定义。

所以,我认为当他们打包 slf4j-api.jar 时,他们有一个 StaicLoggerBinder (和其他类似的类)的存根实现,他们会编译但是然后删除来自jar的.class文件。听起来有点不合适,不是吗?

使用什么样的构建工具来实现这样的结果?具体来说,如果我使用Maven,我如何构建这样的jar,其中编译时生成的类被排除在工件之外?可能还会生成匿名和其他内部/嵌套类,如果它们也被删除了吗?

2 个答案:

答案 0 :(得分:2)

  

“所以,我认为当他们打包slf4j-api.jar时,他们有一个StaicLoggerBinder(以及其他类似的类)的存根实现,他们会编译但是然后从jar中删除.class文件。听起来有点不公平,不是吗?“

这是怎么回事。我不会说那是不合适的 - 能够以一种相当简单的方式支持多种实现是一种必要的“邪恶”。 SLF4J StaticLoggerBinder

答案 1 :(得分:1)

查看pom.xmlslf4j-api的来源。

  <plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-antrun-plugin</artifactId>
    <executions>
      <execution>
        <phase>process-classes</phase>
        <goals>
         <goal>run</goal>
        </goals>
      </execution>
    </executions>
    <configuration>
      <tasks>
        <echo>Removing slf4j-api's dummy StaticLoggerBinder and StaticMarkerBinder</echo>
        <delete dir="target/classes/org/slf4j/impl"/>
      </tasks>
    </configuration>
  </plugin>
  

所以,我认为当他们打包slf4j-api.jar时,他们有一个StaicLoggerBinder(和其他类似的类)的存根实现,他们会编译,但然后从jar中删除.class文件。

这是正确的,有必要实施static binding