前言:
今天在拉新项目后启动时出现如下异常:
java.lang.NoClassDefFoundError: org/apache/commons/lang/text/StrLookup
首先
先搞清楚java.lang.ClassNotFoundException和java.lang.NoClassDefFoundError的主要区别
ClassNotFoundException | NoClassDefFoundError |
发生在JVM动态运行时 | 发生在编译时 |
NoClassDefFoundError发生在JVM在动态运行时,根据你提供的类名,在classpath中找到对应的类进行加载,但当它找不到这个类时,就发生了java.lang.NoClassDefFoundError的错误,而ClassNotFoundException是在编译的时候在classpath中找不到对应的类而发生的错误。ClassNotFoundException比NoClassDefFoundError容易解决,是因为在编译时我们就知道错误发生,并且完全是由于环境的问题导致。
而网上诸多方法均是说没有commons-lang的pom依赖,没有其他解决方式。如果是由于该原因的话,那么在编译工程就会报ClassNotFoundException异常而不是NoClassDefFoundError。
而后又怀疑是否是包冲突,导致在运行时想调用这个类的方法或者访问这个类的静态成员的时候不知道调用哪一个。排除后发现非此原因。
最后解压出commons-lang-2.6.jar,发现其中的包路径不是org\apache\commons\lang\,WTF?直接导致运行时使用该jar包下某个类时根据路径找不到。出现这个的原因是在公司私仓这个包被替换咯,我又把它拉下来了。。。
最后把正确的jar包替换后成功解决。