
spring boot 应用通过 java -jar 运行时秒退,但 mvn spring-boot:run 或 ide 启动正常——根本原因通常是 jar 构建方式错误,未使用 spring-boot-maven-plugin 正确打包,导致缺失嵌入式容器和启动引导逻辑。
当你在 VS Code 中使用“Java Project Manager”插件直接导出 JAR 时,它生成的是一个普通 Java 归档(plain JAR),仅包含编译后的 class 文件和依赖清单(MANIFEST.MF),不包含 Spring Boot 的启动器(Launcher)、嵌入式 Tomcat/Netty、以及 fat-jar 所需的 BOOT-INF 结构。因此,JVM 直接执行 main 方法后,因 Spring 上下文未被正确初始化为长期运行的 Web 应用,进程自然终止——这正是你日志中看到“Started… in 3.1s”后立刻触发 SpringApplicationShutdownHook 的原因。
✅ 正确做法:始终使用 Maven 官方插件构建可执行 JAR
确保 pom.xml 中已声明 spring-boot-maven-plugin(你的配置已正确):
org.springframework.boot spring-boot-maven-plugin
然后在项目根目录执行标准命令:
mvn clean package
构建成功后,进入 target/ 目录,你会看到形如 interconnecting-flights-0.0.1-SNAPSHOT.jar 的文件——这才是真正的 Spring Boot 可执行 Fat JAR。验证其结构:
jar -tf target/interconnecting-flights-0.0.1-SNAPSHOT.jar | head -10
✅ 输出应包含 BOOT-INF/、org/springframework/boot/loader/JarLauncher.class 等关键路径;若只看到 com/jvc/... 包路径,则说明是普通 JAR(即 VS Code 导出的结果)。
⚠️ 注意事项:
- 不要使用 mvn compile 或 IDE 的“Export as JAR”功能替代 mvn package;
- 确保本地 Maven 仓库无损坏(可加 -U 强制更新快照依赖);
- 若使用多模块项目,确认
jar 且 spring-boot-maven-plugin 在最终可执行模块中声明; - 运行时请显式指定主类(虽通常自动识别):
java -Dspring.profiles.active=dev -jar target/interconnecting-flights-0.0.1-SNAPSHOT.jar
? 额外建议:启用调试日志定位启动失败点
在 application.properties 中添加:
logging.level.org.springframework.boot.SpringApplication=DEBUG logging.level.org.springframework.context.annotation.AnnotationConfigApplicationContext=TRACE
这样当 JAR 启动异常时,能清晰看到上下文刷新阶段是否卡住或提前关闭。
总结:Spring Boot 的“可执行 JAR”不是普通归档,而是由 spring-boot-maven-plugin 重打包生成的自包含镜像。坚持使用 mvn clean package 构建,彻底规避 IDE 插件非标准导出带来的静默失败问题。










