解决方法一:
今天在做系统集成的时候,引入第三方功能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包都清掉,然后从
下载一个最新的版本,丢到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的顺序有关