问题描述
这几天小组任务,我们使用的是git,基本大家负责自己的模块,做好了就commit push,最后做好了一个Springboot项目,并且在各自的Windows电脑上调试运行是成功的。
我打算打包成jar推到服务器上的Docker运行。
结果:
说找不到类,问题是我在自己的电脑上运行是成功的啊
问题排查
我打算看看jar里面到底有没有这个文件,让我排查一下:
先解压jar
明明就有啊,但是我发现了一个很诡异的事情
由于我是组长,项目框架是我搭起来的,和启动类同级的文件夹我一般都会用小写开头,怎么这里service层命名是"Service"?不应该是"service"吗?
非常非常不对劲,我直接全局搜索了"Service",发现这位组员写的文件,导包的时候以及写包名的时候,服务层的包名都写"Service",而非"service"
问题解决
将所有大写"Service"的部分全部改为小写"service"后即可
为什么项目调试时没出现问题?
在jar中,可以看到其实只有类路径的大小写区别,实际运行时,之所以我的电脑(windows)上不会出错,是因为:
Windows不区分大小写,所以"/Service/"和"/service/"在windows看来是一样的,但是docker里面的linux就不一样了………
总结
组员不小心在某些包里写了和大家不一样的包名,但是windows下又不区分大小写,导致前期运行发现不出来,后期运行在linux上就报错了。
为什么jar里的文件夹是Service而非service?
既然只有个别文件包名误写成了Service,那为什么最终打包后的文件夹为什么是Service而不是大部分java文件里写的service呢?
猜想
我觉得跟service包里第一个java文件有关,之前是一个名为BriefService.java的文件里面的"Service"写成大写,我认为是这个文件名排序在第一个,导致打包时扫描它为"Service"包。
先看一下现在的状况,BriefService.java仍然存在。且包内服务层名叫"Service"
现在将BriefService改名,在前面加个Z,让它排序的时候排最后面
还是大写的,尬了。
我决定从controller开刀,因为controller没改名,并且排最前面
改了之后:
我放弃了,可能javac有自己的想法吧。