Spring Boot多模块项目FatJar启动异常:启动后退出/Bean找不到
Gradle构建Spring Boot多模块Jar启动问题排查与解决
问题1:部分服务启动后立即退出(无端口监听)
原因
服务发现类项目(如Eureka Server)若使用gradle jar普通打包,生成的是普通Jar文件,不包含Spring Boot启动引导逻辑,运行时执行完main方法后直接退出,不会维持Spring上下文和端口监听。本质是对应模块未正确配置Spring Boot插件,导致打包产物不是可执行的Spring Boot Jar。
解决办法
- 在目标服务模块的
build.gradle中添加Spring Boot插件配置:plugins { id 'org.springframework.boot' version '你的Spring Boot版本号' id 'io.spring.dependency-management' version '对应依赖管理版本' id 'java' } - 执行
gradle bootJar命令打包,替代普通的gradle jar,bootJar会生成包含启动器的可执行Jar。 - 启动时使用
java -jar 你的服务模块名称-boot.jar运行,确保调用的是Spring Boot可执行Jar。
问题2:UserManagement服务启动抛出NoSuchBeanDefinitionException
原因
- 包含
UserLoginOTPRepository的类库模块未被正确打包进UserManagement服务的Jar中,或Spring组件扫描范围未覆盖该类库的包路径。 - Gradle依赖配置错误:若UserManagement模块对类库模块的依赖使用
compileOnly或testImplementation,打包时不会将类库字节码包含进去,导致运行时找不到Bean。 - 类库模块中的
UserLoginOTPRepository未标注@Repository注解,IntelliJ启动时会自动扫描所有模块代码,但打包后依赖类库的组件未被Spring识别。
解决办法
- 检查UserManagement模块的
build.gradle依赖配置,确保类库模块的依赖为implementation:dependencies { implementation project(':你的类库模块名称') // 其他依赖项... } - 确认类库模块中的
UserLoginOTPRepository标注了@Repository注解,同时在UserManagement服务的启动类上指定组件扫描范围,比如:@SpringBootApplication(scanBasePackages = {"com.your.user.management", "com.your.common.repository"}) public class UserManagementApplication { public static void main(String[] args) { SpringApplication.run(UserManagementApplication.class, args); } } - 执行
gradle clean bootJar清除缓存后重新打包,避免旧缓存导致的依赖缺失,启动时使用新生成的bootJar文件。
内容的提问来源于stack exchange,提问作者Ashish kulkarni
相关产品推荐
相关产品推荐

