Spring Boot 应用程序失败,退出代码为 0

Posted

技术标签:

【中文标题】Spring Boot 应用程序失败,退出代码为 0【英文标题】:Spring Boot application fails with exit code 0 【发布时间】:2018-01-29 00:15:46 【问题描述】:

我在 IntelliJ 中编写了一个 Spring Boot + Spring Batch 应用程序,如果它遇到任何配置问题,它会在启动时失败,这是预期的。但是IntelliJ中显示的应用程序的退出码还是0。0错误码不就代表成功了吗?我应该怎么做才能让应用程序返回正确的退出代码?

【问题讨论】:

这是意料之中的。 您能详细说明一下吗? 请添加用于“失败”启动的代码。如果您使用过 System.exit() 那么它使用默认值。根据您的需要更改它。 IntelliJ 不会自定义退出代码,因为它确实不知道应用程序逻辑 【参考方案1】:

如果您已将其编程为退出,它可能仍为 0。您可以通过构建 ExitCodeGenerator 对其进行自定义。

http://www.logicbig.com/tutorials/spring-framework/spring-boot/app-exit-code/

【讨论】:

【参考方案2】:

这太尴尬了! SpringApplication.run() 有一个非常奇怪的启动过程,包括产生一个新线程来完成工作和 yada yada。在执行此操作的过程中,它会调用 SilentExitExceptionHandler.setup(thread),其副作用是确保任何退出代码始终为 0!

如果您想解决这个问题,您可以使用未捕获的异常处理程序。

您也可以这样做:

try 
  SpringApplication.run(...);

catch(RuntimeException ex) 
  throw new RuntimeException(ex);

通过包装异常,spring 不会将其识别为特殊异常,因此会以错误代码 1 退出。但是有副作用 - 尤其是将异常记录到 stderr,但它也会忽略任何ExitCodeGenerator bean 你已经设置好了。

【讨论】:

【参考方案3】:

经过大量挖掘,我发现添加spring-boot-devtools 意味着如果配置错误,Spring 将以 0 退出。见这里:https://github.com/spring-projects/spring-boot/issues/28541

【讨论】:

以上是关于Spring Boot 应用程序失败,退出代码为 0的主要内容,如果未能解决你的问题,请参考以下文章

命令行应用程序的 Spring Boot 返回退出代码

当 spring-boot 运行时 IntelliJ 进程以退出代码 0 完成

Spring Boot - 控制器测试失败并出现 404 代码

为spring boot应用程序生成war包时maven构建失败?

进程以退出代码 1 Spring Boot Intellij 结束

将带有 Gradle 的单片 Spring Boot 应用程序转换为多模块失败