org.slf4j.helpers.MessageFormatter.format和 Could not initialize class org.apache.log4j.Log4jLoggerFactory和org.slf4j.impl.JDK14LoggerAdapter.log

2014/01/13 7902点热度 0人点赞 1条评论

解决方法一:

今天在做系统集成的时候,引入第三方功能jar的时候,项目启动不起来了,基本上就三个问题。

java.lang.NoSuchMethodError: org.slf4j.helpers.MessageFormatter.format
java.lang.NoClassDefFoundError: Could not initialize class org.apache.log4j.Log4jLoggerFactory
java.lang.AbstractMethodError: org.slf4j.impl.JDK14LoggerAdapter.log

百度,加上不停的测试,搞了一个多小时,终于能启动了。

归纳为两点:

  一)存在多个版本的log4j,或者slf4j

  二)log4j和slf4j中有些jar包冲突

把项目中的关于log4j和slf4j的jar包都清掉,然后从

http://www.slf4j.org/

下载一个最新的版本,丢到lib下,清单如下:

  log4j-over-slf4j-1.7.5.jar
  slf4j-api-1.7.5.jar
  slf4j-jdk14-1.7.5.jar
  slf4j-nop-1.7.5.jar

网上查的一些解释:

java.lang.NoClassDefFoundError: org/slf4j/LoggerFactory,

   这是因为项目缺少slf4j-api.jar和slf4j-log4j12.jar这两个jar包导致的错误。 

java.lang.NoClassDefFoundError: org/apache/log4j/LogManager,

   这是因为项目缺少log4j.jar这个jar包

究其原因是如果log4j-over-slf4j.jar 和 slf4j-log4j12.jar 在同一个classpath下就会出现这个错误。

其中log4j-over-slf4j.jar的作用是通过Log4j进行logback slf4j共存时bridge的作用。

slf4j-log4j12.jar用途在于slf4j通过slf4j-log4j12调度log4j

去除slf4j-log4j12.jar就可以了。

解决方法二

2014/6/13

今天我用maven构建了一个项目,也报了java.lang.NoSuchMethodError: org.slf4j.helpers.MessageFormatter.format

我刚开始也以为是版本冲突

pom.xml如下:

      <log4j.version>1.2.17</log4j.version>
      <slf4j.version>1.7.7</slf4j.version>
     <dependency>
        <groupId>org.slf4j</groupId>
        <artifactId>slf4j-api</artifactId>
        <version>${slf4j.version}</version>
     </dependency>
     <dependency>
        <groupId>org.slf4j</groupId>
        <artifactId>slf4j-log4j12</artifactId>
        <version>${slf4j.version}</version>
     </dependency>
      <dependency>
        <groupId>log4j</groupId>
        <artifactId>log4j</artifactId>
        <version>${log4j.version}</version>
     </dependency>

在Maven Dependencies中

我发现log4j.jar在sl4j.jar的上方

我去maven官网 搜索了下发现slf4j-log4j12已经依赖了log4j

<parent>
   <groupId>org.slf4j</groupId>
   <artifactId>slf4j-parent</artifactId>
   <version>1.7.7</version>
</parent>
<modelVersion>4.0.0</modelVersion>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-log4j12</artifactId>
<packaging>jar</packaging>
<name>SLF4J LOG4J-12 Binding</name>
<description>SLF4J LOG4J-12 Binding</description>
<url>http://www.slf4j.org</url>
<dependencies>
   <dependency>
      <groupId>org.slf4j</groupId>
      <artifactId>slf4j-api</artifactId>
   </dependency>
   <dependency>
      <groupId>log4j</groupId>
      <artifactId>log4j</artifactId>
   </dependency>
</dependencies>

然后我就将我的pom.xml中的log4j依赖注释掉了

然后我再启动不报错了

最后在Maven Dependencies中

我发现log4j.jar跑到了sl4j.jar的下方

由此推断java.lang.NoSuchMethodError: org.slf4j.helpers.MessageFormatter.format这个错误应该是sl4j和log4j的顺序有关

yxkong

这个人很懒,什么都没留下

文章评论

  • cook

    多谢!

    2015/11/28