【问题解决】-《java.lang.NoClassDefFoundException》

  此问题相比与ClassNotFoundException,不容易找到,当然这两者都属于jvm加载类时的错误。

导致NoClassDefFoundException的原因:

  编译时不报错,运行时在内存中找不到该类的对象。也正是这个原因,导致不好找到,深层次

的原因我们得分析jvm加载机制,这个我会在下篇文章中发表个人愚见,这里我们就描述一些我们

实际开发中,由于我们的哪些疏忽导致此问题出现。看到网上好多出现此类问题,如:静态变量初

始化找不到指定文件;代码顺序问题,但我这边写了测试类均没有复现,所以此处不做说明,等遇

到后再更新文档。

  场景1(非Spring项目):

  我们明明下载了三方jar,然后加入到构建路径,然后重新编译后,也不报错。但为何运行的时候,

就是提示NoClassDefFoundException这个错误。其根本原因就是:引入的jar包没有在当前jar文件的

manifest文件中的classpath属性中定义!!!

 

  场景2(Spring项目):

 

  当我们引入了一个A包,实际上这个包还依赖其他包,一般官方的包,这些依赖的包,都会在A包的pom文件定义。

非官方的一些包,总会出现遗漏的情况,此时我们根据错误日志找到类名,然后去网上找对应的包,找到对应的pom。

同时,还有一种情况,就是别的地方把我们依赖的包排除了,比如exclude。

 

  场景3(OSGI项目):

  当前引入的包,没有在Import_Pachage标签下注册

  这个根据我们实际框架来看,就拿OSGI举例:其MANIFEST.MF文件中Bundle-ClassPath属性,需要我们

引入三方jar包后,在此文件中添加,有的ide会自动添加。没有的话我们就需要手动添加。

Manifest-Version: 1.0
Bundle-ManifestVersion: 2
Bundle-Name: Weipt_TEST
Bundle-SymbolicName: Weipt_TEST;singleton:=true
Bundle-Version: 1.0.0.qualifier
Bundle-ClassPath: .,
 lib/dom4j-1.6.1.jar,
 lib/org.jdom_1.0.0.v200806100616.jar,
 lib/jsch-0.1.55.jar
Bundle-Activator: com.dcfs.queue.app.Activator
Junit-Test: com.dcfs.teller.common.test.MainTest
Bundle-RequiredExecutionEnvironment: JavaSE-1.6

  欢迎指正或者补充,您的建议是我们共同进步的阶梯

posted @ 2019-03-25 20:51  垚森  阅读(5141)  评论(0编辑  收藏  举报