Spring Boot父子项目打包WAR部署Tomcat后无法访问子模块API求助
1. 显式扩展父项目的组件扫描范围
IDE运行时会自动扫描当前模块及依赖包中的组件,但打包成War部署到容器时,Spring Boot的默认扫描范围可能只局限于父项目自身的包。解决办法是在父项目的启动类上指定所有子项目的包路径:
@SpringBootApplication(scanBasePackages = {"com.parent.pkg", "com.child1.pkg", "com.child2.pkg", "com.child3.pkg", "com.child4.pkg"}) public class ParentWarApp extends SpringBootServletInitializer { // 重写configure方法,确保War包能被Servlet容器正确初始化 @Override protected SpringApplicationBuilder configure(SpringApplicationBuilder app) { return app.sources(ParentWarApp.class); } }
如果子项目的包有统一前缀(比如都在com.yourcompany下),直接写这个前缀更省事。
2. 子项目配置自动配置类的注册(若有自定义配置)
如果子项目里有自定义的自动配置类,需要在子项目的resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports文件中添加配置类的全限定名,这样父项目启动时才能自动加载这些配置。比如子项目有com.child1.config.CustomAutoConfig,文件内容就写:
com.child1.config.CustomAutoConfig
3. 检查依赖的scope配置
确保子项目的依赖是compile范围(默认就是这个范围,除非你手动改了),别用provided或test,不然就算Jar包在WEB-INF/lib里,容器运行时也会忽略这些依赖:
<dependency> <groupId>com.your.group</groupId> <artifactId>child1</artifactId> <version>1.0.0</version> <!-- compile是默认值,可省略,但如果之前改了要改回来 --> <scope>compile</scope> </dependency>
4. 子项目启动类调整
子项目是Jar依赖,不需要作为独立Spring Boot应用启动,所以子项目的启动类可以去掉@SpringBootApplication注解,只保留@Configuration、@ComponentScan这类必要注解,专注提供API和组件就行;如果保留@SpringBootApplication也没关系,父项目扫描时不会重复启动,只是没必要。
5. 排查父项目的配置文件限制
检查父项目的application.properties/application.yml里有没有spring.main.sources这类属性,如果指定了特定类,会覆盖默认的组件扫描范围,要么调整这个属性包含子项目的配置类,要么直接删掉该配置。
内容的提问来源于stack exchange,提问作者Sai Kotha

