使用logback/slf4j时抛出异常

18

我正在使用slf4j 1.6.2 API jar(也尝试过使用1.6.1)- logback版本为0.9.29(核心和经典)。 我正在ubuntu上使用jdk1.6。 我收到的异常如下所示。

Exception in thread "main" java.lang.NoSuchMethodError: org.slf4j.helpers.MessageFormatter.arrayFormat(Ljava/lang/String;[Ljava/lang/Object;)Lorg/slf4j/helpers/FormattingTuple;
    at ch.qos.logback.classic.spi.LoggingEvent.<init>(LoggingEvent.java:112)
    at ch.qos.logback.classic.Logger.buildLoggingEventAndAppend(Logger.java:471)
    at ch.qos.logback.classic.Logger.filterAndLog_0_Or3Plus(Logger.java:427)
    at ch.qos.logback.classic.Logger.info(Logger.java:631)

我也收到了一条关于slf4j绑定不匹配的消息。

"SLF4J: The requested version 1.6 by your slf4j binding is not compatible with [1.5.5, 1.5.6, 1.5.7, 1.5.8, 1.5.9, 1.5.10, 1.5.11]"

看起来logback 0.9.29依赖于slf4j 1.6.1。当你切换到1.6.1时,你是否清理了你的环境? - Jeremy
这个问题解决了吗?我遇到了类似的问题 -rw-r--r-- slf4j-api.jar slf4j-api-1.6.4.jar slf4j-log4j12-1.6.4.jar.. 我在WebSphere Lib中有以下jar包.. - Nayeem
8个回答

26

看起来JVM正在加载版本为1.5.x的slf4j-api.jar。你的类路径上肯定有slf4j-api-1.5.x.jar(除了slf4j-api-1.6.2.jar之外)。请检查你的类路径。


8
通常情况下,它来自于依赖关系的依赖关系,...请使用“mvn dependency:tree”命令检查依赖关系。 - poussma
这给了我一个提示,我使用的产品捆绑了更新版本的SLF4J,因此我的旧版本SLF4J库引起了这个错误。如果你使用Eclipse(ctrl+shift+T)或者在JetBrains中(Shift+Shift)搜索类型(SLF4J),它会显示所有包含文件的库,移除不需要的那个。希望这对其他人有所帮助。 - MG Developer

11

添加以下依赖项可能有所帮助 :

  <dependency>
      <groupId>org.slf4j</groupId>
      <artifactId>slf4j-api</artifactId>
      <version>1.7.7</version>
  </dependency>

  <dependency>
      <groupId>org.slf4j</groupId>
      <artifactId>jul-to-slf4j</artifactId>
      <version>1.7.7</version>
  </dependency>

  <dependency>
      <groupId>org.slf4j</groupId>
      <artifactId>jcl-over-slf4j</artifactId>
      <version>1.7.7</version>
  </dependency>

  <dependency>
      <groupId>org.slf4j</groupId>
      <artifactId>log4j-over-slf4j</artifactId>
      <version>1.7.7</version>
  </dependency>

  <dependency>
      <groupId>org.slf4j</groupId>
      <artifactId>slf4j-jdk14</artifactId>
      <version>1.7.7</version>
  </dependency>

1
终于在经过了5-6个小时的谷歌搜索之后,我的问题得到了解决。感谢Trisha。 - Wolfgang
@Wolfgang 很高兴它对你有帮助!干杯! - Trisha Chatterjee

9

slf4j-api版本与绑定版本不匹配:

SLF4J Binding指的是如slf4j-jdk14.jar或slf4j-log4j12.jar这样的工件,用于将slf4j绑定到底层的日志框架,例如java.util.logging和log4j。

混合使用不同版本的slf4j-api.jar和SLF4J binding可能会导致问题。例如,如果您正在使用slf4j-api-1.7.2.jar,则还应该使用slf4j-simple-1.7.2.jar,使用slf4j-simple-1.5.5.jar将无法正常工作。

注意:从客户端的角度来看,所有版本的slf4j-api都是兼容的。使用slf4j-api-N.jar编译的客户端代码可以与任何N和M的slf4j-api-M.jar完美运行。您只需要确保您的绑定版本与slf4j-api.jar的版本匹配即可。您无需担心项目中给定依赖项使用的slf4j-api.jar的版本。您始终可以使用任何版本的slf4j-api.jar,只要slf4j-api.jar及其binding的版本匹配,就应该没问题。

在初始化时,如果SLF4J怀疑可能存在api与binding版本不匹配的问题,它将发出有关怀疑的不匹配的警告。

以上内容来自http://www.slf4j.org,希望能帮到您。


1
我们需要对slf4j-api和相应的绑定版本进行对齐,就我而言,我使用的是slf4j-log4j12,根据SLF4J的文档说明。

http://www.slf4j.org/codes.html#version_mismatch

我替换了作为传递依赖项包含的两个库的版本,在我的pom文件中添加了以下内容:

    <dependency>
        <groupId>org.slf4j</groupId>
        <artifactId>slf4j-api</artifactId>
        <version>1.7.1</version>
    </dependency>

    <dependency>
        <groupId>org.slf4j</groupId>
        <artifactId>slf4j-log4j12</artifactId>
        <version>1.7.1</version>
    </dependency>

我希望这对某些人有所帮助。

祝好,

Jaider


1
此外,您必须拥有在[]中提到的许多slf4j-api jar版本。尝试在类路径中保留单个版本的slf4j-api和相应兼容的slf4j-log4j jar。 混合使用不同版本的slf4j jar始终会带来麻烦 NoSuchMethodError是由于发现具有相同名称的方法超过一次,可能来自相同jar的不同版本

0
这可能更像是“我也是”,但我会尝试概述一个更完整的解决方案。我在我的产品中混合了许多来自不同来源的软件。我首先遇到了NiFi JAR的问题,然后最近又遇到了Cassandra JAR的问题。我已经在pom.xml中坚持要求在所有地方都使用相同版本的slf4j:
<slf4j.version>[1.7.25]</slf4j.version>
...
<dependency>
  <groupId>org.slf4j</groupId>
  <artifactId>slf4j-api</artifactId>
  <version>${slf4j.version}</version>
</dependency>
<dependency>
  <groupId>org.slf4j</groupId>
  <artifactId>slf4j-simple</artifactId>
  <version>${slf4j.version}</version>
</dependency>
... (all the slf4j JARs I needed)

然后,我告诉Maven我想要Cassandra,但不需要它带来的slf4j:

<dependency>
  <groupId>org.apache.cassandra</groupId>
  <artifactId>cassandra-all</artifactId>
  <version>${cassandra.version}</version>
  <exclusions>
    <exclusion>
      <groupId>org.slf4j</groupId>
      <artifactId>slf4j-log4j12</artifactId>
    </exclusion>
    <exclusion>
      <groupId>org.slf4j</groupId>
      <artifactId>slf4j-simple</artifactId>
    </exclusion>
</dependency>

然而,像你一样,我也收到了抱怨。

Exception in thread "main" java.lang.NoSuchMethodError: org.slf4j.helpers.MessageFormatter.arrayFormat(Ljava/lang/String;[Ljava/lang/Object;)Lorg/slf4j/helpers/FormattingTuple;
  at ch.qos.logback.classic.spi.LoggingEvent.<init>(LoggingEvent.java:112)

mvn dependency:tree 命令中,我发现我得到的是 logback 1.1.3 版本,这与 Cassandra 明显使用的版本(0.9 或类似)不匹配。因此,我通过将以下排除项添加到已有的 slf4j 排除项中来排除获取 logback:
<dependency>
  <groupId>org.apache.cassandra</groupId>
  <artifactId>cassandra-all</artifactId>
  <version>${cassandra.version}</version>
  <exclusions>
    <exclusion>
      <groupId>org.slf4j</groupId>
      <artifactId>slf4j-log4j12</artifactId>
    </exclusion>
    <exclusion>
      <groupId>org.slf4j</groupId>
      <artifactId>slf4j-simple</artifactId>
    </exclusion>
    <exclusion>
      <groupId>ch.qos.logback</groupId>
      <artifactId>logback-core</artifactId>
    </exclusion>
    <exclusion>
      <groupId>ch.qos.logback</groupId>
      <artifactId>logback-classic</artifactId>
    </exclusion>
</dependency>

...于是,我之前遇到的问题,也就是你在这里报告的问题,消失了。希望这能对某些人有所帮助。


0

我遇到了完全相同的错误消息。我通过排除依赖项org.apache.directory.server:apacheds-all来解决它。不知何故,该jar包覆盖了org.slf4j.spi.LocationAwareLogger


0

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接