You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Spring Boot父子项目打包WAR部署Tomcat后无法访问子模块API求助

Spring Boot父War包部署后无法加载子Jar项目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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.09 00:25:56