2013-02-21 82 views
0

我以前只和log4j一起工作過。現在我正在探索一個新項目並注意到它使用了slf4j 1.7.2。我知道它只是一個API規範,它爲與之相符的各種實現提供了簡化的接口(AKA外觀),如java.util.logging, log4j and logback。但是,我注意到,在API網站的列表中沒有提到commons-logging,但是,它的jar包含在這個應用程序的類路徑中。當我刪除它從classpath檢查它是否是使用implemetation,我證實,它的確是:slf4j默認使用commons-logging實現嗎?

SLF4J: Failed to load class "org.slf4j.impl.StaticLoggerBinder". 
SLF4J: Defaulting to no-operation (NOP) logger implementation 
SLF4J: See http://www.slf4j.org/codes.html#StaticLoggerBinder for further details. 
Exception in thread "main" java.lang.NoClassDefFoundError: org/apache/commons/logging/LogFactory 

是共享記錄確實SLF4J默認的實現?因爲他們的文檔說:

如果在類路徑上找不到綁定,則SLF4J將默認爲無操作實現。

在上述鏈接的頁面上。即使我在類路徑中有slf4j-nop-1.7.2.jar,我猜測上面提到的默認實現是,但如果commons不在類路徑中,我仍然會得到org/apache/commons/logging/LogFactory的異常,所以我很困惑。

澄清將不勝感激。

+0

我的猜測是,你有一些其他的依賴項正在拉動commons-logging。如果你正在使用maven或者類似的構建工具,你應該能夠可視化你的依賴關係樹並查看包括commons-logging在內的內容。 – 2013-02-21 23:21:31

+0

其實,我使用Ant – amphibient 2013-02-21 23:22:46

回答

0

您需要在類路徑上綁定JAR和日誌實現(本例中爲JCL)的組合。

Binding with a logging framework at deployment time

共享記錄不是默認的,但如果你SLF4J-JCL-1.7.2.jar在類路徑中,它會嘗試使用。所以如果你因此從你的路徑中刪除JCL,它會抱怨它找不到這些類。

SLF4J-NOP-1.7.2.jar是無操作 「SLF4J綁定」 罐子,本身並不是一個實現。

+0

不幸的是,當我說'SLF4J-JCL-1.7.2.jar',它仍然抱怨找不到公共 – amphibient 2013-02-21 23:35:57

+0

我曾在類路徑是:'SLF4J-API-1.7.2。 jar'和'slf4j-jcl-1.7.2.jar' – amphibient 2013-02-21 23:37:56

+1

但是你在你的classpath中有'commons-logging-1.1.1.jar'嗎? 'slf4j-jcl-1.7.2.jar'告訴SLF4J使用commons-logging,但是如果你的路徑中沒有實際的commons-logging jar,它將不起作用。 – 2013-02-21 23:42:20