多模块Maven项目调用@Bean注解方法时出现“No qualifying bean”错误求助
多模块Maven项目调用@Bean注解方法时出现“No qualifying bean”错误求助
嘿,我看你在搭建多模块Maven+Spring Boot项目时,调用@Bean注解的方法遇到了「No qualifying bean」的错误,先结合你给出的现有信息给你分析问题和解决思路哈!
首先先把你给出的父项目POM代码整理出来:
<parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>3.2.5</version> <relativePath/> <!-- lookup parent from repository --> </parent> <groupId>com.basic</groupId> <artifactId>basic-web-automation</artifactId> <version>0.0.1-SNAPSHOT</version> <packaging>pom</packaging> <name>basic-web-automation</name> <description>basic web automation project with Spring Boot</description> <modules> <module>basic-first-module</module> </modules>
你提到父项目里有个FakerConfig类(应该是标注了@Configuration,里面有@Bean方法生成对应的实例对吧?),子模块在尝试注入这个Bean时找不到,大概率是踩了这几个多模块项目的常见坑:
- 父项目的打包方式是
pom,这种打包方式的项目只会作为聚合/父项目来管理子模块,本身的Java类(比如你的FakerConfig)不会被编译成jar包输出,子模块根本无法访问到这些类,更别说Spring能扫描到里面的Bean配置了。 - 就算父项目能被访问到,Spring Boot默认的组件扫描范围是当前模块启动类所在的包及其子包,子模块的启动类如果和父项目的FakerConfig不在同一个包路径下,也扫不到这个配置类。
- 子模块可能没有正确配置依赖,就算继承了父项目,也没法自动获取父项目里的业务类或配置类。
给你几个落地的解决办法,按规范程度排序:
最推荐的规范方案:抽离公共模块
- 新建一个子模块,比如叫
basic-common-module,把FakerConfig这类需要共享的配置类、工具类都放到这个模块里,这个模块的打包方式设为jar,POM里继承你的父项目。 - 修改父项目的
<modules>节点,把这个common模块加进去(注意顺序,common模块要在其他依赖它的模块前面):
<modules> <module>basic-common-module</module> <module>basic-first-module</module> </modules>
- 在
basic-first-module的POM里添加对common模块的依赖:
<dependency> <groupId>com.basic</groupId> <artifactId>basic-common-module</artifactId> <version>0.0.1-SNAPSHOT</version> </dependency>
- 确保子模块的Spring Boot启动类能扫描到common模块的配置:可以在启动类上加上
@ComponentScan(basePackages = "com.basic")(假设所有类都在com.basic包下),或者直接用@Import(FakerConfig.class)手动导入这个配置类。
临时应急方案(不推荐长期使用)
如果暂时不想重构项目,也可以把父项目的<packaging>改成jar,这样父项目的类会被编译打包,子模块继承后能访问到。但这样父项目就不再是纯粹的聚合管理项目了,后续模块多了会很混乱,还是抽公共模块更合理。
另外要注意:父项目的核心作用是统一管理依赖版本、子模块列表这些全局配置,尽量不要在父项目里放具体的业务类、配置类,这是多模块项目的最佳实践哦!
备注:内容来源于stack exchange,提问作者Zain
相关产品推荐
相关产品推荐

