在开发部署时,启动出现了这个问题。有java.lang.NoClassDefFoundError
和 java.lang.ClassNotFoundException
,看名字都大概是类找不到,那他们它们有什么区别?
ClassNotFoundException
ClassNotFoundException
从后缀可以看出是Exception
的子类。
javadoc说明:
当应用程序尝试使用其字符串名称通过其字符串名称加载类时抛出,但是找不到指定类名对应的类定义,包括
1、Class 的 forName 方法
2、ClassLoader 的 findSystemClass 方法
3、ClassLoader 的 loadClass 方法
比较常用的有 JDBC 或者开元框架如 Spring 中,利用类名获取类定义。
测试:
输出:
NoClassDefFoundError
NoClassDefFoundError
从后缀可以看出是Error
的子类。
javadoc 说明:
如果Java虚拟机或ClassLoader实例尝试加载类的定义(作为常规方法调用的一部分或使用new创建新实例的一部分)而抛出,而且找不到该类的定义。
当前执行的类在编译时可以搜索到,但无法在找到这个类定义。
就是说一个类在编译时可以找到,但是运行时找不到了。
如 一个 maven 的依赖作用范围,包括编译期,但是不包括运行期。如provided
测试:
pom设置作用范围 provided
,有效范围包括 compile, test
测试类:
输出: