1

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

我正在使用带有托管 JBoss AS 7.1 的 arquillian 进行测试(Maven 从 maven Central 下载版本并运行测试)。我也在使用 arquillian persistence api。

我应该怎么做才能更正给定的警告?我的意思是我应该保留哪个依赖项,或者我将如何让两者正常工作?

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

4

3 回答 3

2

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

如果您在 Maven 中有冲突的版本,通常强制更新版本更安全。库通常是向后兼容的。

所以,坚持你的新版本,slf4j-api并确保你声明一个绑定作为依赖,例如slf4j-jdk14. 如果您正在生成库,请确保您的绑定test仅使用范围声明。

于 2013-02-24T07:56:19.367 回答
2

首先。关于依赖关系。

为了添加 SLF4J,您必须在 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: Failed to load class "org.slf4j.impl.StaticLoggerBinder"。那么您将面临来自 m2e 的错误。

Eclipse Juno 和 Indigo 在使用捆绑的 maven 版本 (m2e) 时,不会抑制消息 SLF4J: Failed to load class "org.slf4j.impl.StaticLoggerBinder"。此行为从 m2e 版本 1.1.0.20120530-0009 及更高版本开始存在。

虽然,这被指示为错误,您的日志将正常保存。在修复此错误之前,突出显示的错误仍将存在。在m2e 支持站点中了解更多信息。

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

SLF4J:无法加载类“org.slf4j.impl.StaticLoggerBinder”。错误

于 2013-03-01T17:52:34.270 回答
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 部门。确保他们都获得了“提供的”范围。如果您使用 Eclipse 和 m2e 插件,您还可以打开您的 POM 文件并检查“Dependency Hierarchy”选项卡,该选项卡将为您提供类似的信息。

于 2013-02-26T10:59:46.387 回答