2013-02-24 145 views
1

我正在使用querydsl(取決於sl4j-api 1.6)和arquillian-persistence-api(取決於slf4j-jdk14 1.5.6)。 如果我在Maven中的舊版本1.5.6,我得到在JBossslf4j-api衝突

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.

以下消息忽略

我使用的Arquillian與管理的JBoss AS 7.1進行測試(Maven的下載從行家中心的版本,並運行測試)。 我也使用arquillian持久api。

我應該怎麼做才能糾正給定的警告?我的意思是我應該保持哪種依賴性,或者我會如何讓兩者正常工作?

我想這就是爲什麼我沒有得到關於arquillian持久性api失敗的任何錯誤消息(因爲記錄器不工作?)。

+2

您是否閱讀過您發佈的slf4j日誌消息中鏈接的頁面? – 2013-02-24 04:59:47

+0

您是否將Eclipse用作IDE? – 2013-03-01 08:37:47

+0

是的,我使用Eclipse作爲IDE – 2013-03-01 15:56:08

回答

2

您看到的消息是警告,而不是錯誤。這意味着SLF4J正在爲您選擇一個綁定,因爲您沒有自己選擇。默認綁定只是丟棄所有日誌消息,這不是很有用。

如果你在Maven中有衝突的版本,通常強制更新版本更安全。庫是往往向後兼容。

因此,堅持使用您的新版本slf4j-api,並確保您將綁定聲明爲依賴項。 slf4j-jdk14。如果您正在製作庫,請確保您的綁定僅以test作用域聲明。

+0

我在一個庫中有'slf4j-api 1.6.1',在另一個庫中有'slf4j-jdk14 1.5.6'。兩者都需要在編譯範圍內。這不是一個庫生產,而是一個普通的j2ee應用程序,我不能編輯原始的依賴關係(或者如果可能,我該怎麼做?)。我應該排除舊的庫,並在庫依賴關係之外添加綁定依賴關係嗎? – 2013-02-24 18:45:44

+1

@FagnerBrack在您的POM中聲明您的首選'slf4j-api'版本 - 這將覆蓋所有其他版本。如果你不想'slf4j-jdk14',那麼在包含它的庫中添加一個排除。如果你想要它,但是不同的版本,只需在你的POM中聲明你的首選版本。 – 2013-02-24 20:13:05

+0

@FagnerBrack如果您需要進一步的幫助,請編輯問題以共享POM文件的相關部分,幷包含'mvn dependency:tree'的輸出。 – 2013-02-24 20:14:12

0

JBoss 7.1內置了對SLF4J的支持。假設這是戰爭打包的Web應用程序添加src/main/webapp/WEB-INF/jboss-deployment-structure.xml

<jboss-deployment-structure xmlns="urn:jboss:deployment-structure:1.0"> 
    <deployment> 
    <dependencies> 
     <module name="org.slf4j" /> 
    </dependencies> 
    </deployment> 
</jboss-deployment-structure> 

這將在JBoss SL4J適配器,它會給你記錄輸出拉。

這意味着您要使用應用程序服務器提供的SLF4J庫。你應該更新你的pom.xml來修復SLF4J依賴的範圍。

<dependencies> 
    ... 
    <dependency> 
    <groupId>org.slf4j</groupId> 
    <artifactId>slf4j-api</artifactId> 
    <scope>provided</scope> 
    </dependency> 
    ... 
</dependencies> 

根據您的POM文件的排列方式,您可能還需要提供您想要使用的SLF4J版本。 mvn dependency:tree可以向您顯示哪些SLF4J折彎被拉入。確保他們都獲得「提供」的範圍。如果你使用Eclipse和m2e插件,你也可以打開你的POM文件並檢查「Dependency Hierarchy」選項卡,它將爲你提供類似的信息。

+0

我應該忽略maven庫中的所有slf4j依賴關係還是這個配置會覆蓋所有內容? – 2013-02-26 14:03:59

+0

使用此配置意味着您希望SLF4J內容由應用程序服務器提供。我會建議將範圍設置爲「提供」。這樣SLF4J的東西就不會被打包到你的WAR文件中。相反,JBoss將被指示將其從模塊中拉入到類路徑中。 如果您使用'mvn dependency:tree'插件,您可以看到什麼被拉入以及它的範圍,正如@Duncan Jones建議的那樣。如果你在你的pom中聲明'slf4j-api',並使用提供的範圍,它將覆蓋querydsl中聲明的範圍。 – 2013-02-27 08:45:26

2

首先。關於依賴關係。

爲了增加SLF4J你必須把ONE只有ONE在你的pom.xml這些依賴關係。這取決於您選擇使用的實施方式。您在pom.xml中添加的每個依賴項都會自動添加到類路徑中。如果以下依賴項之一由另一個依賴項提供,則可以省略它。不要忘記,即使依賴關係是由其他依賴項提供的,也只能包含一個。

<dependency> 
    <groupId>ch.qos.logback</groupId> 
    <artifactId>logback-classic</artifactId> 
    <version></version> 
</dependency> 
<dependency> 
    <groupId>org.slf4j</groupId> 
    <artifactId>slf4j-simple</artifactId> 
    <version></version> 
    <scope>compile</scope> 
</dependency> 
<dependency> 
    <groupId>org.slf4j</groupId> 
    <artifactId>log4j-over-slf4j</artifactId> 
    <version></version> 
    <scope>compile</scope> 
</dependency> 
<dependency> 
    <groupId>org.slf4j</groupId> 
    <artifactId>slf4j-jdk14</artifactId> 
    <version></version> 
    <scope>compile</scope> 
</dependency> 

現在關於構建Maven項目時,你所得到的惱人的錯誤。如果只有以上依賴項之一,仍然會得到SLF4J:無法加載類「org.slf4j.impl.StaticLoggerBinder」。那麼你正面臨着m2e的一個bug。

當使用捆綁maven版本(m2e)時,Eclipse Juno和Indigo不禁止消息SLF4J:未能加載類「org.slf4j.impl.StaticLoggerBinder」。此行爲在m2e 1.1.0.20120530-0009及之後的版本中提供。

雖然這表示爲錯誤,您的日誌將正常保存。突出顯示的錯誤仍然存​​在,直到修復此錯誤。更多關於m2e support site的信息。

當前可用的解決方案是使用外部maven版本而不是捆綁版本的Eclipse。你可以在下面的問題中找到關於這個解決方案和更多關於這個bug的細節,我認爲它描述了你面臨的同樣的問題。

SLF4J: Failed to load class "org.slf4j.impl.StaticLoggerBinder". error