【问题标题】:Exception thrown while using logback/slf4j使用 logback/slf4j 时抛出异常
【发布时间】:2011-08-23 18:14:59
【问题描述】:

我正在使用 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 时你清理环境了吗?
  • 这个问题解决了吗?我面临类似的问题 -rw-r--r-- slf4j-api.jar slf4j-api-1.6.4.jar slf4j-log4j12-1.6.4.jar ..我在 WebSphere Lib 中有以下 jars..跨度>

标签: java slf4j logback


【解决方案1】:

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

【讨论】:

  • 大多数情况下,它来自一个依赖的依赖,...使用mvn dependency:tree检查依赖
  • 这给了我一个提示,我使用的产品捆绑了新版本的 SLF4J,因此我的旧版本 SLF4J lib 导致了这个错误。如果您使用 Eclipse (ctrl+shift+T) 或在 JetBrains (Shift+Shift) 中搜索类型 (SLF4J),它将显示所有包含文件的库,删除不需要的库。希望这对其他人有所帮助。
【解决方案2】:

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

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

【讨论】:

  • 经过 5-6 小时的谷歌搜索后,我的问题终于得到解决。谢谢特丽莎。
  • @Wolfgang 我很高兴它有帮助!干杯!
【解决方案3】:

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 都是兼容的。使用 slf4j-api-N.jar 编译的客户端代码在任何 N 和 M 的 slf4j-api-M.jar 中都可以正常运行。您只需确保绑定的版本与 slf4j-api.jar 的版本匹配。您不必担心项目中给定依赖项使用的 slf4j-api.jar 版本。您可以随时使用任何版本的 slf4j-api.jar,只要 slf4j-api.jar 的版本及其绑定匹配,就可以了。

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

来自http://www.slf4j.org,希望对你有帮助。

【讨论】:

    【解决方案4】:

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

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

    NoSuchMethodError 是由于多次发现 Methods-with-the-same-name,可能来自同一个 jar 的不同版本

    【讨论】:

      【解决方案5】:

      我们必须对齐 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>
      

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

      亲切的问候,

      杰德

      【讨论】:

        【解决方案6】:

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

        【讨论】:

          【解决方案7】:

          这可能更像是“我也是”,但我会尝试概述一个更完整的解决方案。我在我的产品中混合了来自不同来源的大量软件。我首先在 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>
          

          ...因此,我遇到的问题和您在这里报告的问题消失了。我希望这对某人有所帮助。

          【讨论】:

            【解决方案8】:

            从以下链接下载

            https://jar-download.com/artifacts/ch.qos.logback/logback-classic/1.1.3/source-code

            所有三个罐子都相互兼容

            【讨论】:

              猜你喜欢
              • 2013-05-24
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2016-09-17
              • 2023-04-10
              • 1970-01-01
              • 1970-01-01
              • 2013-07-24
              相关资源
              最近更新 更多