使用logback / slf4j时抛出异常

时间:2011-08-23 18:14:59

标签: java slf4j logback

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

8 个答案:

答案 0 :(得分:25)

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

答案 1 :(得分:9)

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

  <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>

答案 2 :(得分:8)

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

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

混合不同版本的slf4j-api.jar和SLF4J绑定可能会导致问题。例如,如果您使用的是slf4j-api-1.7.2.jar,那么您还应该使用slf4j-simple-1.7.2.jar,使用slf4j-simple-1.5.5.jar将无效。

注意从客户端的角度来看,所有版本的slf4j-api都是兼容的。对于任何N和M,使用slf4j-api-N.jar编译的客户端代码与slf4j-api-M.jar完全匹配。您只需要确保绑定的版本与slf4j-api.jar的版本匹配。您不必担心项目中给定依赖项使用的slf4j-api.jar的版本。您可以随时使用任何版本的slf4j-api.jar,只要slf4j-api.jar的版本及其绑定匹配,您应该没问题。

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

来自http://www.slf4j.org,我希望它可以提供帮助。

答案 3 :(得分:1)

此外,你必须在[]中提到许多版本的slf4j-api版本。尝试在类路径中保留单个版本的 slf4j-api和相应的兼容的slf4j-log4j jar。

混合不同版本的slf4j罐子总是很麻烦

NoSuchMethodError是由于发现了多个同名的方法,可能来自同一个罐子的不同版本

答案 4 :(得分: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

答案 5 :(得分:0)

我有完全相同的错误消息。我通过排除依赖org.apache.directory.server:apacheds-all来解决它。不知怎的,那个jar会覆盖org.slf4j.spi.LocationAwareLogger

答案 6 :(得分:0)

这可能更多&#34;我也是&#34;,但我会尝试勾勒出更完整的解决方案。我在我的产品中混合了来自不同来源的大量软件。我首先使用NiFi JAR遇到了这个问题,然后最近再次与Cassandra JARs一起。我已经坚持 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我想要没有为slf4j带来任何东西的Cassandra:

<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依赖:树,我发现我得到的是logback 1.1.3,它与Cassandra显然使用的不匹配(0.9就像你一样)。所以,我通过将这些排除项添加到已经存在的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>
    <exclusion>
      <groupId>ch.qos.logback</groupId>
      <artifactId>logback-core</artifactId>
    </exclusion>
    <exclusion>
      <groupId>ch.qos.logback</groupId>
      <artifactId>logback-classic</artifactId>
    </exclusion>
</dependency>

...于是,我遇到的问题和你在这里报道的事情就消失了。我希望这有助于某人。

答案 7 :(得分:0)