atitit。解决 No suitable Log constructor。。NoClassDefFoundError: org/apache/log4j/Category 找不到类的

1. 深的层次原因::ClassLoader问题 1

2. 排除流程 2

3. 解决之道:: 2

4. parent-first代理机制还是child-first代理机制 2

4.1. Thread Context ClassLoader的出现 2

5. 参考 3

现象:

org.apache.commons.logging.LogConfigurationException: No suitable Log constructor

Caused by: java.lang.NoClassDefFoundError: org/apache/log4j/Category

1. 深的层次原因::ClassLoader问题

ClassLoader问题可以分成三类:

1.    抛出NoClassDefFoundError,即某个Logger相关的类对child ClassLoader来说是可见的,但是对parent ClassLoader来说则不可见。

2.    非兼容性赋值,即两类虽然相同或存在父子关系,但是由于ClassLoader不一样而导致不可以相互赋值。

在Java中,处于安全的考虑,从1.2开始引入代理机制,即在ClassLoader每次加载一个类时,首先去查找(代理给)parent ClassLoader是否存在该类的定义,如果有,则使用parent ClassLoader加载;否则,使用当前ClassLoader本身去加载该类。这样做可以阻止一些不安全的代码覆盖JDK内部的类,从而实现一些非法操作。Java文档中对该特性的描述如下:

因而parent ClassLoader优先是Java中的默认原则。然而在Web Application中却建议使用child ClassLoader优先的机制,从而保证Web Application可以覆盖一些common的配置和JAR包,如Servlet的文档中对Web Application ClassLoader的描述如下:

作者:: 老哇的爪子 Attilax 艾龙,  EMAIL:1466519819@qq.com

转载请注明来源: http://blog.csdn.net/attilax

2. 排除流程

怀疑是jdk的lib哈面儿有class 优先加载..在查询自定义的种类的时候儿.走新不上兰..

org.apache.commons.logging.LogConfigurationException ,点击查询,真的是jdk8中的..在找个log4j当然走心不死兰...

3. 解决之道::

不个comm.loig从jdk删除.叫哪使用web appa的库... (推荐)

要不走不个log4j类库copoy 到个jdk lib哈面儿,叫哪能行上..

4. parent-first代理机制还是child-first代理机制

因而parent ClassLoader优先是Java中的默认原则。然而在Web Application中却建议使用child ClassLoader优先的机制,从而保证Web Application可以覆盖一些common的配置和JAR包,如Servlet的文档中对Web Application ClassLoader的描述如下:

其实以上这些不管是parent-first代理机制还是child-first代理机制都不是问题,问题出在由于Commons Logging应用太广泛了,导致很多Web服务器在实现时也使用了该包,然而又想保证不同Web Application中的日志配置不相互干扰,这样问题就来

4.1. Thread Context ClassLoader的出现

是为了解决一个框架在被Parent ClassLoader加载,然而它想加载Child ClassLoader中的类的需求,因而很多框架代码内部会使用Thread Context ClassLoader。比如在LogFactoryImpl的实现中就有很关于使用Thread Context ClassLoader的例子。Thread Context ClassLoader是需要手动设置的,不然默认为Parent Thread中的Thread Context ClassLoader。但是在实际过程中,Thread Context ClassLoader总是不会被正确的设置,比如以下代码注释掉的语句。

默认情形哈::因为在没有正确的设置Thread Context ClassLoader时,当前的Thread Context ClassLoader是System ClassLoader。log4j对System ClassLoader是不可见的,而且LogFactory是System ClassLoader加载的,因而LogFactory根本找不到log4j包,从而导致即使在LoggerPrinterWithJCL中的日志打印语句还是使用了JDK Logging。而ParentFirstTestJCL0中使用JDK Logging则比较容易理解了。

,然而后来又出现了ClassNotFoundException(Category是Logger父类,要初始化Logger首先需要初始化其父类Catetory)是因为LogFactory这个实例是由System ClassLoader加载的,在Java中,在一个类要加载其他类时,使用加载该类的ClassLoader去加载要加载的类。所以在LogFactory实例去加载log4j中的Logger类时,使用的System ClassLoader,log4j包对System ClassLoader是不可见的,因而出现了ClassNotFoundException

5. 参考

org.apache.commons.logging.LogConfigurationException  No suitable Log constructor,NoClassDefFoundError  org apache log4j Categor - 晚安,假行僧! - 博客频道 - CSDN.NET.htm

Commons Logging存在的ClassLoader问题详解 - 上善若水 - BlogJava.htm

atitit。解决 No suitable Log constructor。。NoClassDefFoundError: org/apache/log4j/Category 找不到类的的更多相关文章

  1. 解决java.lang.NoClassDefFoundError: org/apache/log4j/Level

    现象: java.lang.NoClassDefFoundError: org/apache/log4j/Level at org.slf4j.LoggerFactory.getSingleton(L ...

  2. 转:Caused by: java.lang.NoSuchMethodError: org.apache.log4j.Category.log

    Caused by: java.lang.NoSuchMethodError: org.apache.log4j.Category.log出现的异常:java.lang.reflect.Invocat ...

  3. java.lang.NoClassDefFoundError: Lorg/apache/log4j/Logger报错

    java.lang.NoClassDefFoundError: Lorg/apache/log4j/Logger报错 错误提示: java.lang.NoClassDefFoundError: Lor ...

  4. MyBatis3错误:Exception in thread "main" java.lang.NoClassDefFoundError: org/apache/log4j/Priority的问题解决

    在使用Maven新建QuitStart类型项目时,引入了MyBatis3.2.0版本的JAR包之后,出现如下错误: Exception in thread "main" java. ...

  5. Maven项目java.lang.NoClassDefFoundError: Lorg/apache/log4j/Logger报错

    本文转载自:http://www.javaweb1024.com/info/894.jspx maven管理的项目,里面已经引入了log4j的包 maven引入如下: <dependency&g ...

  6. Java_异常_02_java.lang.NoClassDefFoundError: org/apache/log4j/Level

    总结:解析Json时,除了要导入json-lib-2.2-jdk15.jar外,还要导入: commons-beanutils.jar, commons-httpclient.jar, commons ...

  7. java.lang.NoClassDefFoundError: org/apache/log4j/Priority的问题解决

    在pom 文件中添加 <dependency> <groupId>log4j</groupId> <artifactId>log4j</artif ...

  8. IDEA里运行代码时出现Caused by: java.lang.ClassNotFoundException: org.apache.log4j.Logger的解决办法(图文详解)

    不多说,直接上干货! 问题详情 运行出现log4j的问题 -classpath "C:\Program Files\Java\jdk1.8.0_66\jre\lib\charsets.jar ...

  9. Atitit 解决Unhandled event loop exception错误的办法

    Atitit 解决Unhandled event loop exception错误的办法 查看workspace/.metadata/.log org.eclipse.swt.SWTError: No ...

随机推荐

  1. Android 获得view的宽和高

    转自:http://blog.csdn.net/yangdeli888/article/details/25405263 在oncreate()中利用view.getWidth()或是view.get ...

  2. 黑马day16 jquery入门

    jquery: 1.jQuery 对象就是通过jQuery包装DOM对象后产生的对象. jQuery对象是jQuery独有的.假设一个对象是jQuery对象,那么它就能够使用jQuery里的方法:$( ...

  3. Install Tomcat 7 on CentOS, RHEL, or Fedora

    linux下的 Tomcat 安装: http://www.davidghedini.com/pg/entry/install_tomcat_7_on_centos

  4. 创建一个简单的windows服务,每间隔一定时间重复执行批处理文件

    创建一个windows服务项目,增加App.config <?xml version="1.0" encoding="utf-8" ?> <c ...

  5. Centos 7 配置 VNCServer 經驗

    安裝 Centos 7後, 習慣性的安裝  Xmanager 3或4, 都不能正常工作, 無奈之下開始安裝 VNCServer. (個人習慣使用Xmanager, 因為不需要安裝,只要配置一下就能用, ...

  6. 关闭使用ShellExecute打开的进程!!!!!

    前言: 最近做一个项目使用到ShellExecute来打开一个带参数的外部exe文件,关闭时遇到不少问题,最终解决,总结如下. 对于关闭ShellExecute打开的进程窗口,网上比较多的是用Find ...

  7. 给出a的定义 -- 指针 和 数组

  8. 【Python】Django CSRF问题

    参考资料: Django Ajax CSRF 认证:http://www.ziqiangxuetang.com/django/django-csrf.html Python Post遇到csrftok ...

  9. STM32 控制GSM模块收发信息 F407 discovery

    main.c #include "stm32f4_discovery.h" #include <stdio.h> #define LED1_ON GPIO_SetBit ...

  10. [RSpec] LEVEL 1: INTRODUCTION

    Install RSpec: Describe Lets start writing a specification for the Tweet class. Write a describe blo ...