[包名路径问题]BeanDefinitionStoreException,Springboot找不到某些类

问题描述

这几天小组任务,我们使用的是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有自己的想法吧。

  • 3
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
BeanDefinitionStoreExceptionSpring Framework中的一个异常,它表示在加载bean定义时出现了问题。根据引用提供的上下文初始化失败的错误消息,这个异常可能是由于无法读取候选组件文件而引起的。 根据引用的警告信息,还可能与默认包的@ComponentScan有关。在Spring中,使用@ComponentScan注解来扫描指定包下的组件,并将其注册为bean。然而,默认包是不建议使用的,因为它会导致一些问题,例如无法扫描到组件。 要解决这个问题,首先需要检查引用中提到的文件路径是否正确,确保能够正确读取到候选组件。如果路径有误,可以尝试修正路径或确保文件存在。 另外,将组件放置在非默认包中也是一个好的做法。通过创建一个合适的包结构,将组件放入其中,并使用@ComponentScan注解扫描这个包,可以避免默认包的问题。 最后,如果问题仍然存在,可以尝试重新构建项目,检查并修复项目配置文件中的错误,确保正确加载bean定义。 综上所述,要解决Spring Boot报错BeanDefinitionStoreException,可以尝试以下步骤: 1. 检查引用中提到的文件路径是否正确,确保能够正确读取到候选组件。 2. 将组件放置在非默认包中,并使用@ComponentScan注解扫描这个包。 3. 重新构建项目,检查并修复项目配置文件中的错误,确保正确加载bean定义。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值