java.lang.NoClassDefFoundError: Could not initialize class org.apache.log4j.Log4

转载 2016年05月31日 08:04:36

[摘要:(一) 征象取办理方式 前些天正在举行storm job的开辟时间倏忽报了一个毛病,纪录一下Caused by: java.lang.NoClassDefFoundError: Could not initialize class org.a]

 

(一) 现象与解决方法

前些天在进行storm job的开发时候突然报了一个错误,记录一下

Caused by: java.lang.NoClassDefFoundError: Could not initialize class org.apache.log4j.Log4jLoggerFactory

当然我们的第一个反应是log4j这个包缺失(当然也有这种情况,需要首先确认),打开pom文件查看依赖,文件确实存在。

后经网上搜索加边上大牛指点发现:

log4j-over-slf4j.jar 和 slf4j-log4j12.jar 在同一个classpath下就会出现这个错误。

解决方法:
将slf4j-log4j12.jar从相关的jar中排除

(二) 日志组件tips

那么问题来了,为啥会有这种冲突呢?在这里需要简单的说一下log的故事!

(1)common-logging、log4j、slf4j、logback

common-logging
common-logging是apache提供的一个通用的日志接口;

在common-logging中,有一个Simple logger的简单实现,但是它功能很弱,所以使用common-logging,通常都是配合着log4j来使用;

common-logging会通过动态查找的机制,在程序运行时自动找出真正使用的日志库,并且尽可能找到一个”最合适”的日志实现类,如果判断有Log4j包,则使用log4j,最悲观的情况下也总能保证提供一个日志实现(SimpleLog)

log4j
Apache的一个开放源代码项目,实现了输出到控制台、文件、 回滚文件、发送日志邮件、输出到数据库日志表、自定义标签等全套功能,且配置比较简单;

slf4j
slf4J,即简单日志门面(Simple Logging Facade for Java),不是具体的日志解决方案,它只服务于各种各样的日志系统。按照官方的说法,SLF4J是一个用于日志系统的简单Facade,允许最终用户在部署其应用时使用其所希望的日志系统。可以这么说,slf4j等于commons-logging,是各种日志实现的通用入口,会根据classpath中存在下面哪一个Jar来决定具体的日志实现库;

logback
logback是由log4j创始人设计的又一个开源日志组件。logback当前分成三个模块:logback-core,logback- classic和logback-access。logback-core是其它两个模块的基础模块。logback-classic是log4j的一个 改良版本。此外logback-classic完整实现SLF4J API使你可以很方便地更换成其它日志系统如log4j。

(2)log4j-over-slf4j.jar 和 slf4j-log4j12.jar 在同一个classpath下为何出现错误?

在java领域日志工具中,最早得到广泛使用的是 log4j。那么为啥有common-logging的出现?上面已经介绍了common-logging只提供log的接口,其中具体的实现时动态绑定的,所以common-logging与log4j的结合比较多!但是随之也产生了一些问题,那就是common-logging的动态绑定有时候也会失败(说实在这个我也不懂,希望求解),在这样的背景下slf4j应运而生,slf4j与common-logging一样提供log接口,但是slf4j是通过静态绑定实现。

好的,先在来说slf4j-log4j12.jar是干啥的?
slf4j提供 log 接口,其具体实现是根据放入程序的绑定器决定

 slf4j-XXX-version.jar

slf4j-log4j12.jar就是实现通过slf4j调度使用log4j

那么log4j-over-slf4j.jar是干啥的勒?

在这里需要引入桥接器的概念,所谓的桥接器就是一个假的日志实现工具。

XXX-over-slf4j.jar

log4j-over-slf4j.jar就是桥接器,本来组件是通过log4j输出日志的,通过该桥接器被转到slf4j,slf4j在根据绑器把日志交给具体的日志实现工具。

如果log4j-over-slf4j.jar 和 slf4j-log4j12.jar共存的后果是什么?那就是两个踢球的人在互相传球,就是没人射门,陷入死循环。

这里写图片描述

参考博文:
[1]http://blog.csdn.net/feng27156/article/details/36885387
[2]http://www.blogjava.net/daiyongzhi/archive/2014/04/13/412364.html

 

linux+tomcat+jdk环境下图片验证码无法显示

一、 由于实际所需,在原先系统基础上需要再配置一台服务器作为业务系统,系统环境是linux+tomcat,根据原先的配置情况,将linux系统、tomcat、JDK等环境都安装配置完成,然后把应...
  • liuxigiant
  • liuxigiant
  • 2014年05月06日 21:08
  • 3861

poi批量下载功能

近期在写一个批量下载的功能时,由于需要下载的数据量以及sheet页较多,因此考虑使用poi中的一个SXSSFWorkbook类用以减小内存的消耗: workbook = new SXSSFWorkb...
  • laborwork
  • laborwork
  • 2016年09月23日 15:55
  • 818

关于在java6中使用XFire时碰到的一个问题Could not initialize Service

在一个采用了XFire作为WebService框架Web项目中,添加由JDK1.6 wsimport命令生成的一个WebService客户端调用,在客户端调用时出现了如下问题 log4j:WARN N...
  • tongsh6
  • tongsh6
  • 2016年07月31日 11:59
  • 2563

Jetty 类加载问题处理

本文涉及到的知识点 1.Java虚拟机的类加载机制 2.JavaServiceProvider 加载机制 3.Java 类的初始化过程 4.Jetty 服务器的配置方式...
  • u012631045
  • u012631045
  • 2014年10月24日 15:41
  • 6964

SSH实例开发使用说明

SSH实例开发使用说明 1. 实例简介..................................................................................
  • robert_shell
  • robert_shell
  • 2015年01月02日 16:13
  • 856

Apache Kylin的入门安装

在hadoop启动时,要启动JobHistoryServer,否则kylin会出现各种各样的异常。 Apache Kylin™是一个开源的分布式分析引擎,提供Hadoop之上的SQL查询接口及多...
  • weibin_6388
  • weibin_6388
  • 2018年01月11日 13:32
  • 35

dubbo起步搭建Spring+SpringMVC+dubbo的开发环境(4,提供者 消费者工程启动调试)重要

dubbo起步搭建Spring+SpringMVC+dubbo的开发环境 提供者 消费者工程启动调试 重要 提示找不到远程服务类...
  • fangxiaoji
  • fangxiaoji
  • 2014年12月10日 15:43
  • 5353

Go言学习系列--开发工具(二)

前面的一节简单的介绍了Go语言的开发工具之一LiteIDE,现在用eclipse配置Go语言的开发环境,因为eclipse也是一个比较流行的开发工具,所以这章简单的介绍一下eclipse怎么配置Go语...
  • qq_38428623
  • qq_38428623
  • 2017年04月24日 18:51
  • 171

Ebean-功能介绍

Mapping Ebean使用了和JPA一样的映射,所以你可以使用@Entity, @Table, @Column, @OneToMany等等对你的实体进行注释 @Entity public ...
  • jsshaojinjie
  • jsshaojinjie
  • 2016年08月05日 15:42
  • 3010

部署CAS SSO时提示BEA-101017的解决方法

部署CAS SSO时提示BEA-101017的解决方法 版权声明:本文为炎雨0927(heiyan_7)原创文章,非商用自由转载,请保持署名并注明出处,谢谢。 公司的统一权限管理平台是基于CAS的...
  • heiyan_7
  • heiyan_7
  • 2017年01月04日 20:20
  • 206
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:java.lang.NoClassDefFoundError: Could not initialize class org.apache.log4j.Log4
举报原因:
原因补充:

(最多只允许输入30个字)