关注公众号 `N学无止界` 获取更多
- 该问题产生的原因:
- 直接原因:spring加载的时候获取配置文件的顺序在不同磁盘上结果不一致,导致“类加载出现异常",所以在有些磁盘环境下可以有些不可以,下面分析会说明原因。
- 间接原因:spring配置文件配置重复
- 解决办法:如下图 红色框内的配置是要注释掉的,否则在特别的情况下容易引起初始化出现异常。
- 排查步骤(web是挂在磁盘,temp是本机磁盘)
- 分别启动web,temp 完全一样的Tomcat和工程,对比各自catalina.out内容,发现web出现缺少一个SQL的执行输出,继续观察不同之处,发现load spring顺序不一样(附件catalina.out-temp 是temp的Tomcat启动输出内容,附件catalina.out-web是web的Tomcat启动输出内容)
- 根据web.xml 配置和跟踪代码,找出来 spring是获取到所有配置后一个一个来实例化的
- 下面是写的打印出系统找到的spring配置文件,在test.jsp 页面打印出来(附件test.jsp-temp.txt是temp工程打印结果,附件test.jsp-web.txt 是web工程打印结果)
- 发现结果不一样,注释掉 springMvc-servlet.xml 中,发现工程可以正常运行(顺序还是不一样)。
---------------下面是翻查源码步骤(为什么加载顺序不一样)-----------------------------
- 下面是主调试入口函数:
- 调试跟踪堆栈(spring加载的时候堆栈)
- 上图可以看出,最终是由File.list() 列举出文件列表并获取满足条件的文件,下图解释了这个内部方法,所以引起了这种现象。
ps:linux文件管理跟windows有差距,但是该方法都是调用 native 方法实现。
- 总结:代码还是要规整起来。