问题
开发一个小功能,遇到了No such method ,因为没有源码,一直以为拦截器的问题导致404,单步调试过程中发现只要运行StringUtils.substringsBetween 这段代码就会有问题。
好奇心趋势一直调试这个问题,怀疑是不是像上次一样JDK版本的问题导致的?
查找过程
后来确认同事也是用的JDK1.8版本,而且这个方法也不是原生的,咨询同事原来是因为包冲突的问题导致。
修复问题
StringUtils 是commons-lang下面的一个包,而用这个包的地方很多,很容易出现版本冲突的问题。这时候就要想办法解决包冲突,问题解决。
为什么线上没有问题,线下调试会出现问题?
这是一个值得深层次思考的问题,
classloader加载类有几种方式:
- 使用Bootstrap Classloader来加载jdk或者jre的类。负责加载java基础类,主要是 %JRE_HOME/lib/ 目录下的rt.jar、resources.jar、charsets.jar和class等
- 使用Extension Classloader来加载,你可以把需要加载的jar都扔到%JRE_HOME%/lib/ext下面,这个目录下的jar包会在Bootstrap Classloader工作完后由Extension Classloader来加载。非常方便,非常省心。:)
- App ClassLoader 负责加载当前java应用的classpath中的所有类。
- 关于自定义ClassLoader
而我们公司采用的SOA框架是自定义ClassLoader,引入jar包按照字母顺序来加载,所以会出现某个jar 依赖的低版本的jar包先行加载到classLoader中,导致出现No such method 或者 No such Class
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。