Windows下java.exe将驼峰类名转小写查找致类加载失败问题
问题原因
这是Windows 10默认开启的快速启动功能引发的NTFS文件系统大小写处理缓存异常,属于系统更新后偶发的底层bug,和本地Java环境配置、代码写法没有任何关系。
现象匹配逻辑
- 执行
java -classpath . HelloWorld时报错找不到helloworld类,本质是Java启动器查找class文件时,受异常的文件系统大小写映射规则影响,把传入的驼峰格式类名HelloWorld错误转换成了全小写字符串去匹配文件名,自然找不到实际存在的HelloWorld.class。 - 全小写命名的
helloworld2能正常运行,是因为类名本身就是全小写,刚好和错误转换后的查找名一致,所以不会触发报错。 - 同一份class文件在CentOS 7环境运行正常,是因为Linux系统的文件系统默认区分大小写,不存在Windows快速启动带来的缓存错乱问题。
- 普通重启无法解决问题,是因为Windows 10的快速启动本质是带内核休眠的混合启动,普通重启不会清空内核层的文件系统缓存;只有完全关机后再冷开机,才会彻底清除休眠残留的缓存数据,重新加载NTFS卷的正常规则,问题就直接消失。
后续规避方法
如果之后再碰到同类问题不想反复关机,可以直接做两个调整:
- 用管理员权限打开命令提示符,执行
fsutil behavior set disablelastaccess 3重置文件系统访问缓存,执行完不需要重启就能恢复正常 - 直接关闭快速启动功能:打开控制面板→电源选项→选择电源按钮的功能,取消勾选「启用快速启动(推荐)」,就能避免Windows更新后再触发同类的文件系统缓存异常。
内容的提问来源于stack exchange,提问作者Wayne Jeong
相关产品推荐
相关产品推荐

