windows开发的一个诡异坑,百年一遇?

今天项目组的小朋友遇到了一个很奇怪的问题

一个工程,在IDEA中运行十分正常,但是线上就是报错,报找不到类

但反编译之后明明类就在,但本地怎么运行也复现不出线上的问题,就是能正常运行

小朋友也很着急,时间也过去了不少,于是来求助我

在帮小朋友排除了一些猜测之后找到了罪魁祸首

windows的大小写不敏感

大家都知道windows是大小写不敏感的,同一个单词无论大小写都被认为是相同的东西

而linux是大小写敏感的,大小写不同被认为是两个东西

这次的问题就出在一个包名上,这个包名命名不规范,用了驼峰式的命名,包含一个大写字母

testUp

所有类中import的部分都是大写,而实际打在jar包中的目录是全小写,导致在linux这个敏感环境下就找不到这个含有大写的路径了

有人说这不是很简单的问题么,谁让大小写不一致呢,活该

那我为什么说这是百年一遇呢

原因就在于打包都是由IDE完成的,我们IDE用的是IDEA,使用maven install进行打包

理论上是不应该出现这个问题的,以前也从来没遇到过,我今天又做了很多的测试也再没复现过

真的变成了一桩悬案,有可能是在某种极其特殊的场景下的一个IDEA的BUG

写出来给大家遇到的一些疑难杂症提供一个奇葩的思路


这个事儿看来很难再找到具体原因了

不过我倒是对windows和linux对于大小写不同的态度有点儿兴趣,为什么会有这样的差异呢

抱着这个好奇心我找了找网上相关的帖子,发现很多人在开发的时候都遇到了这样的问题,特别是很多用git进行版本管理或者多人协作管理的情况加,看到的大多数人的建议是linux开发,windows查看

从直觉上来讲大小写区分好像是理所应当的,明明就是两个字母嘛,我们设密码的时候也知道大小写是不同的

那windows为什么会在文件系统这层做出一个大小写不区分的决定呢,好奇怪

这里先做一个说明,并不是FAT32或者NDFS这种存储形式不支持大小写敏感,也不是所有windows都大小写不敏感,windows的很多版本都是可以支持大小写敏感的,Server版全系列,普通版95到7都可以。Server系列通过修改文件服务的配置就可以,普通版需要修改注册表,好像唯一默认敏感的是server2000

回到windows默认不敏感这件事儿上来,通过查一些说明,似乎是从MS DOS继承下来的,至于MS DOS为什么不敏感,这个已经没有什么资料可以考证了,只是坊间传说是为了方便用户,提升用户体验

从这个侧面也能感受到,用户体验这个东西,祸福相依,有积极的一面也就一定会为之付出相应的代价

上一篇:通过 JVM 日志来进行安全点分析


下一篇:AMF学习2远程调用的封装