2012-02-08 91 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