本地多模块依赖的相关问题
spring boot 版本2.3.7.RELEASE
jdk版本1.8
Maven 3.x
起因:今天本来想做一下本地模拟分布式模块调用,但是遇到了两个比较典型的问题
- 模块a引用模块b时,模块a中自动注入找不到模块b中的bean
- 模块a在打包时,找不到模块b对应的包
模块a具体配置:由springboot快速构建,打包方式为war
模块a目录结构
模块b配置:由springboot快速构建,打包方式为jar
模块b目录结构
具体流程为:我在模块b中编写了,UserService和UserServiceImpl,其中写了一个String hello();的方法
然后,我又在模块a中写了UserController 去调用模块b的hello();方法
如下:
第一个问题
1. 最开始,输入UserService时没有提示,就代表模块a中没有找不到这个类,所以需要到pom.xml中添加自己本地的模块依赖
这个名字可不能乱写,要与你模块b的pom.xml文件配置相应才行,或者你可以先在UserController里面把private UserService userService;拼写完,然后点一下红色的报错,再按alt+回车,选择idea的智能修复提示,就可以在模块a的pom.xml文件生成对应的依赖坐标
2. 导入依赖之后,就有提示了,说明idea找到了这个类,所以可以调用其中的hello方法了
3. 运行时则出现了,找不到该bean的异常
4. 有经验的程序员应该知道,spring boot报找不到bean基本上都是启动类所处的目录下,没有该bean,意思就是spring boot扫描不到这个类,自然初始化不了
- 第一种解决方法
在模块a的启动类上使用这两个注解,basePackages当中写,你模块b中方法对应的包名
@SpringBootConfiguration @ComponentScan(basePackages = {"com.drs"})
- 第二种解决方法
由于我模块a和模块b两个的包名很相似,所以我可以直接移到启动类,以此来扩大包扫描范围
归根结底就是要扩大spring boot的包扫描范围,直到可以扫描到你需要的类
第二个问题是,关于本地模块打包
1.以上问题解决后,我还需要对模块a打war包
由于我是模块a引用了模块b,所以a打包之前,需要先对a进行install(Maven的指令)
然后再对a打包(package)
此时出现了打包错误,Maven提示找不到UserService类
解决办法就是把模块b的pom.xml文件中的spring boot自带的打包插件删掉
值得注意的是,每个被引用的模块都必须要要删除这个插件,才能把正确的jar包导入war
参考链接
34 springboot项目之间依赖导致bean 无法加载问题 - 走看看 (zoukankan.com)
Springboot mavne项目多模块打包,报错 找不到 base包,找不到common类等等-阿里云开发者社区 (aliyun.com)