slf4j-api冲突

时间:2013-02-24 04:47:53

标签: java-ee maven jboss jboss-arquillian querydsl

我使用的是querydsl(取决于sl4j-api 1.6)和arquillian-persistence-api(取决于slf4j-jdk14 1.5.6)。 如果我在maven中忽略了旧版本1.5.6,我在JBoss上得到以下消息

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从maven中心下载版本并运行测试)。 我也在使用arquillian persistence api。

我应该怎么做才能纠正给定的警告?我的意思是我应该保留哪种依赖关系,或者我如何才能让它们正常工作?

我想这就是为什么我没有收到关于arquillian persistence api失败的任何错误消息(因为记录器不工作?)。

3 个答案:

答案 0 :(得分:2)

您看到的消息是警告,而不是错误。这意味着SLF4J正在为您选择绑定,因为您自己没有选择绑定。默认绑定只是丢弃所有日志消息,这不是很有用。

如果您在Maven中存在冲突版本,通常强制使用较新版本会更安全。库经常向后兼容。

因此,请坚持使用较新版本的slf4j-api并确保将绑定声明为依赖关系,例如: slf4j-jdk14。如果要生成库,请确保仅使用test范围声明绑定。

答案 1 :(得分:2)

首先。关于依赖性。

要添加SLF4J,您必须在pom.xml中添加 ONE 且仅 ONE 这些依赖项。这取决于您选择使用的实施方式。您在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的错误。

当使用捆绑的maven版本(m2e)时,Eclipse Juno和Indigo不会抑制消息SLF4J:无法加载类“org.slf4j.impl.StaticLoggerBinder”。此行为存在于m2e版本1.1.0.20120530-0009及之后。

虽然这表示为错误,但您的日志会正常保存。在修复此错误之前,突出显示的错误仍然存​​在。有关详情,请参阅m2e support site

当前可用的解决方案是使用外部maven版本而不是捆绑版本的Eclipse。您可以在下面的问题中找到有关此错误的此解决方案和更多详细信息,我认为这些错误描述了您所面临的相同问题。

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

答案 2 :(得分:0)

JBoss 7.1内置了对SLF4J的支持。假设这是一个带WAR包装的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 deps。确保它们都获得了“提供”范围。如果您使用Eclipse和m2e插件,您还可以打开您的POM文件并选中“Dependency Hierarchy”选项卡,它将为您提供类似的信息。