2012-02-08 79 views
1

我想SLF4J会通过反射加载org.slf4j.impl.StaticLoggerBinder但看着org.slf4j.LoggerFactory的代码,它是不是这样的:SLF4J和记录器工厂

StaticLoggerBinder.getSingleton().getLoggerFactory(); 

这可能表明,当他们打包SLF4J-api.jar中,他们要么SLF4J-simple.jar在classpath(或SLF4J-nop.jar),但是这将导致循环依赖作为ILoggerFactory界面即上面方法返回在slf4j-api.jar中定义。

所以,我认为当他们包装SLF4J-api.jar中,他们有一个存根实现的StaicLoggerBinder(以及其他相似的类),他们将编译,但随后从罐中取出的.class文件。听起来有点不灵活,不是吗?

用什么样的构建工具来达到这样的结果?具体来说,如果我使用的是Maven,我该如何构建这种在编译时产生的类从工件中排除的罐子?可能会有匿名和其他内部/嵌套类也被生成,如果它们也被删除?

+4

这是什么问题? – Perception 2012-02-08 18:42:00

+0

问题是构建步骤对于像Maven这样的东西会是什么?编译后删除整个包的事实是有道理的,但我试图采用类似的静态绑定策略,并试图配置如何删除由scala文件生成的类/特征。我现在正在编译后删除所有MyMainStub * .class。 – 2012-02-10 03:00:58

回答

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(以及其他相似的类)的,他们会编译,但随后从罐中取出的.class文件。

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

2

“所以,我认为当他们包装SLF4J-api.jar中,他们有StaicLoggerBinder(以及其他相似的类),他们将编译,但随后从罐中取出的.class文件的存根实现。听起来有点不明白,不是吗?“

这就是这样做是的。我不会说这是不明智的 - 以一种相当简单的方式支持多种实现是必要的“邪恶”。 SLF4J StaticLoggerBinder

+1

也相关: http://articles.qos.ch/thinkAgain.html – 2012-02-08 19:13:03