错误简述
不久前,在开发过程中,将写好的项目A编译成jar包,放到其他的项目上用的时候(直接引用,而不是使用依赖管理工具),出现如下的错误:
错误的全称:java.lang.NoClassDefFoundError,这是一个运行时错误,在编译的时候并不发生。困扰了我好一会儿。
解决方法
原来是原来是项目A编译成的jar包所依赖的jar包不存在。添加就可以了。
详细一点
NoClassDefFoundError错误的发生,是因为Java虚拟机在编译时能找到合适的类,而在运行时不能找到合适的类导致的错误。例如在运行时我们想调用某个类的方法或者访问这个类的静态成员的时候,发现这个类不可用,此时Java虚拟机就会抛出NoClassDefFoundError错误。简单总结就是,NoClassDefFoundError发生在编译时对应的类可用,而运行时在Java的classpath路径中,对应的类不可用导致的错误。
发生错误可能的原因如下:
- 对应的Class在java的classpath中不可用
- 你可能用jar命令运行你的程序,但类并没有在jar文件的manifest文件中的classpath属性中定义
- 可能程序的启动脚本覆盖了原来的classpath环境变量
- 因为NoClassDefFoundError是java.lang.LinkageError的一个子类,所以可能由于程序依赖的原生的类库不可用而导致
- 检查日志文件中是否有java.lang.ExceptionInInitializerError这样的错误,NoClassDefFoundError有可能是由于静态初始化失败导致的
- 如果你工作在J2EE的环境,有多个不同的类加载器,也可能导致NoClassDefFoundError
如果想了解更多关于NoClassDefFoundError的发生机制和解决方法,可以参考下面这篇blog:
本篇blog的部分内容也是来自于这篇blog, 特在此声明。
end