slf4j-api冲突

slf4j-api冲突

问题描述:

我正在使用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

您看到的消息是警告,而不是错误。这意味着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

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

首先。关于依赖关系。

为了增加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