Spring Boot 3.3.0 JPMS模块启动后无报错自动退出求助
排查Spring Boot 3.3.0 + Java 21 JPMS应用启动后自动退出的问题
1. 确认应用是否为Web类型
Spring Boot 3.x中,若未引入spring-boot-starter-web或spring-boot-starter-webflux,应用会默认以命令行应用运行——启动完成后无常驻后台的非守护线程,因此会立即退出。
- 检查pom.xml是否包含Web Starter依赖:
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> - 对比Spring Boot 2.1.x行为:旧版本可能存在隐式依赖,或你的旧项目实际包含Web依赖但未明确标注。
2. 检查module-info.java配置正确性
JPMS模块声明错误会导致Spring无法初始化必要组件,进而引发应用提前退出:
- 确保已声明对Spring核心模块的依赖,并使用
requires transitive传递必要依赖:module spring.jpms { requires transitive org.springframework.boot; requires transitive org.springframework.boot.autoconfigure; requires transitive org.springframework.web; // 允许Spring反射访问应用类(必要场景) opens ir.moke.module.spring to org.springframework.core, org.springframework.boot; // 导出启动类所在包(若需外部访问) exports ir.moke.module.spring; } - 注意:Spring Boot 3.x对JPMS模块名称有严格要求,比如
org.springframework.boot是正确模块名,不可写错。
3. 验证Spring Boot Maven插件打包配置
Spring Boot 3.x的Maven插件对模块化应用打包有特殊处理,错误配置会导致运行时缺少必要模块或资源:
- 确保
spring-boot-maven-plugin版本与Spring Boot版本一致(3.3.0),并配置模块化参数:<plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> <version>3.3.0</version> <executions> <execution> <goals> <goal>repackage</goal> </goals> </execution> </executions> <configuration> <mainClass>ir.moke.module.spring.Application</mainClass> <moduleName>spring.jpms</moduleName> </configuration> </plugin> - 尝试用插件
run目标直接启动:mvn spring-boot:run,若能正常运行,说明打包环节存在问题。
4. 检查启动命令正确性
确保启动命令的模块路径和主类参数无误:
- 确认
target/lib目录包含所有必要模块JAR(含Spring Boot模块JAR),非模块化JAR会被视为自动模块。 - 尝试用Spring Boot可执行JAR启动(若插件配置了repackage):
java -jar target/your-app.jar,排除模块路径配置问题。
5. 分析线程状态
应用启动后立即退出,说明无常驻非守护线程,可通过工具排查:
- 在启动命令中添加
-Dspring.main.register-shutdown-hook=false,禁用Spring关闭钩子,观察是否延迟退出或暴露更多信息。 - 启动后快速执行
jps获取进程ID,再用jstack <pid>查看线程状态,确认是否仅有守护线程在运行。
6. 检查Spring Boot自动配置日志
开启自动配置调试日志,确认Web相关配置类是否加载:
- 在
application.properties中添加:logging.level.org.springframework.boot.autoconfigure=DEBUG - 启动后搜索
WebMvcAutoConfiguration、TomcatServletWebServerFactory等关键词,验证Web服务器是否完成初始化。
内容的提问来源于stack exchange,提问作者mah454
相关产品推荐
相关产品推荐

