项目场景:
spring boot maven项目中多模块 有相互依赖
出问题的模块是我从之前离职同事的老项目中直接粘贴出来的
所以之后出了问题,我一度怀疑是不是直接粘贴模块过来导致maven识别不出来 然后就反复的来回粘贴
(离职交接时间短害亖人)
问题描述
起初,我一直以为是因为maven的父子模块相互依赖导致父级模块找不到依赖的子模块中的类,但是子模块中其他的类都可以找到唯独图片中的这一个类怎么都找不到
启动报错:
项目层级依赖:
子项目自动配置:
子项目自动配置类:
原因分析:
如上述所示,我开始解决问题时的思路一直被maven误导,以为找不到所依赖模块的类是依赖关系的问题,所以耗费了我两天半的时间一直在反复编辑pom.xml文件
还有我一直在怀疑自己的maven配置和idea是否对maven依赖更新的及时问题 这里涨教训:如果没有特殊情况 正常使用的情况下 不要去考虑这些(两天半中的很长时间纠结于工具的问题)
且慢!还有第二个原因:spring boot版本问题。 之前同事的项目中使用了自动配置的方式初始化子项目中的一些类,如下图:
但是我的spring boot版本是3.3.4 而之前的项目中使用的版本是2.6.13
查了一篇博客才知道SpringBoot 3中移除了spring.factories中的EnableAutoConfiguration 但是还可以注册其他不同类型的组件
引用博客: 为什么SpringBoot 3中移除了spring.factories
引用博客: spring.factories和org.springframework.boot.autoconfigure.AutoConfiguration.imports
解决方案:
最后实在没有办法,我把子模块中所有的类都复制到父类项目中
结果还是找不到?!!!! 那就确认不是maven的问题了
最后我的眼睛才落到找不到那个类的注解上:
可能大佬一眼就看出来了 是
@ConditionalOnProperty
查了这个注解,他是bean的条件注入注解,如果配置文件里有对应的配置才会随着容器启动初始化,如果没有则不初始化,所以才会导致找不到。哈哈哈 对不起 在下才疏学浅 之前没有听说过更没用过这个注解。
针对spring.factories的问题 新建一个META-INF.spring目录下org.springframework.boot.autoconfigure.AutoConfiguration.imports文件 然后把要初始化的配置文件路径写在里面即可 参照上面引用的第二篇博客
至此,我用了三天的时间学会了这个注解
@ConditionalOnProperty
,足以铭记终身了——论知识的可贵