欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

java.lang.NoClassDefFoundError: org/apache/commons/logging/LogFactory,

程序员文章站 2022-07-15 13:12:04
...

问题概述:测试spring入门时,导入四个包核心包之后,出现问题:java.lang.NoClassDefFoundError: org/apache/commons/logging/LogFactory,

百度了一下原因:

NoClassDefFoundError错误的发生,是因为Java虚拟机在编译时能找到合适的类,而在运行时不能找到合适的类导致的错误。例如在运行时我们想调用某个类的方法或者访问这个类的静态成员的时候,发现这个类不可用,此时Java虚拟机就会抛出NoClassDefFoundError错误。与ClassNotFoundException的不同在于,这个错误发生只在运行时需要加载对应的类不成功,而不是编译时发生。很多Java开发者很容易在这里把这两个错误搞混。

简单总结就是,NoClassDefFoundError发生在编译时对应的类可用,而运行时在Java的classpath路径中,对应的类不可用导致的错误。

可能发生这个问题的原因:

1.对应的Class在java的classpath中不可用
2.你可能用jar命令运行你的程序,但类并没有在jar文件的manifest文件中的classpath属性中定义
3.可能程序的启动脚本覆盖了原来的classpath环境变量
4.因为NoClassDefFoundError是java.lang.LinkageError的一个子类,所以可能由于程序依赖的原生的类库不可用而导致
5.检查日志文件中是否有java.lang.ExceptionInInitializerError这样的错误,NoClassDefFoundError有可能是由于静态初始化失败导致的(这是我遇到的问题的解决办法)
6.如果你工作在J2EE的环境,有多个不同的类加载器,也可能导致NoClassDefFoundError。
7.NoClassDefFoundError也可能由于类的静态初始化模块错误导致,当你的类执行一些静态初始化模块操作,如果初始化模块抛出异常,哪些依赖这个类的其他类会抛出NoClassDefFoundError的错误。如果你查看程序日志,会发现一些java.lang.ExceptionInInitializerError的错误日志,ExceptionInInitializerError的错误会导致java.lang.NoClassDefFoundError: Could not initialize class

说真的,上面可能只是原因,解决方案如下:

第一种方法:导入commons-logging.jar包
第二种方法,如果用的是maven项目,则直接在pom.xml中加入commons-logging依赖包,如下:

或者使用maven:

<dependency>
	<groupId>commons-logging</groupId>
	<artifactId>commons-logging</artifactId>
	<version>1.2</version>
</dependency>

然后问题完美解决