对现有的rcp工程替换了一个jar包,只是做了版本升级,从6.0.0升级至6.0.1,但是出现了以下错误。
问题报错信息如下:
Caused by: org.springframework.beans.factory.BeanCreationException: Error creating bean with name '*****' defined in class path resource [*******.xml]: Instantiation of bean failed
nested exception is java.lang.NoClassDefFoundError: ***************
编译的时候一切正常,但是在运行的时候报错,抛出的异常为java.lang.ClassNotfoundException, 但是实际的cause by 提示为java.lang.NoClassDefFoundError。跟踪堆栈信息发现,实际的异常是在运行时加载器加载文件的时候抛出的,并且被包装成了java.lang.ClassNotfoundException异常。
排查的时候发现,替换的jar包名称发生了变化,原先为AAA_6.0.0.jar,现在成了aaa-6.0.1.jar。在编译的时候,根据MAINFEST.MF中的Export-Package配置来获取对应的class文件,并不会关注jar包本身的名称,也不会调用加载器来加载文件,但是运行的时候会调用加载器来加载对应的文件,此时会优先查看.classpath中使用的jar包,然后再去加载对应的类。虽然运行的时候也会编译,但是前提是能够通过.classpath找到对应的jar包才行。
需要注意的是,windows系统本身是大小写不敏感的,但是编译和运行的时候是大小写敏感的,