Eclipse 中 "throw new SilentExitException()" 处的断点 + Spring 引导

Breakpoint at "throw new SilentExitException()" in Eclipse + Spring Boot

每次我 运行 我的 Spring 在 Eclipse IDE(Spring 工具套件)中以调试模式启动项目时,线程停止在 throw new SilentExitException();即使没有断点的行。

是否有一些解决方案可以避免这种行为?

org.springframework.boot.devtools.restart.SilentExitExceptionHandler.exitCurrentThread() (line 53):

public static void exitCurrentThread() {
    throw new SilentExitException();
}

这在升级到 1.3.0 里程碑后开始发生。

Spring 工具套件

Version: 3.7.0.RELEASE
Build Id: 201506290649

平台:

Eclipse Luna SR2 (4.4.2)

不幸的是,这是新 spring-boot-devtools 模块的一个已知问题(参见 https://github.com/spring-projects/spring-boot/issues/3100)。我们使用这个技巧来杀死主线程,以便我们可以用可重新加载的版本替换它。到目前为止,我还没有找到防止调试断点触发的方法。

现在,您可以在 Java -> 调试首选项中切换 "suspend execution on uncaught exceptions" 复选框以防止它发生。

由于调试模式下的 Eclipse 已经允许有限的热修补,我发现重新加载器在大多数情况下会适得其反,所以我决定通过以下方式禁用它:

System.setProperty("spring.devtools.restart.enabled", "false");

参考:https://docs.spring.io/spring-boot/docs/current/reference/html/using-boot-devtools.html#using-boot-devtools-restart-disable

由于重新加载器抛出异常,这也解决了这个问题。请注意,您必须使用 System.setProperty 方法而不是在 application.properties.

中设置它

尝试 运行 devtools 范围 运行time:

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-devtools</artifactId>
    <scope>runtime</scope>
</dependency>

添加 属性 作为 VM 参数:

-Dspring.devtools.restart.enabled=false

这样您就不必更改代码,因为使用时就是这样:

System.setProperty("spring.devtools.restart.enabled", "false");

我的解决方法:

public static void main(String[] args) {
    try {
        SpringApplication.run(App.class, args);
    } catch (Throwable e) {
        if(e.getClass().getName().contains("SilentExitException")) {
            LOGGER.debug("Spring is restarting the main thread - See spring-boot-devtools");
        } else {
            LOGGER.error("Application crashed!", e);
        }
    }
}

我们忽略 SilentExitException 并不重要,因为开发工具只是用 SilentExitException 重启实例,这不是很安静。此 try 块将使其静音...

我不得不在 class 上使用文本匹配,因为 SilentExitExceptionSilentExitExceptionHandler 中是私有的。

它没有解决你的断点问题...

我在 运行 宁 spring 启动项目时遇到了同样的问题。我发现 Main 方法中使用了 TRY CATCH 块。

删除 try catch 块 运行 代码。那个错误不会再来了。如下所示:

public static void main(String[] args) {

    SpringApplication.run(TrewAuthApplication.class, args);

}

将这些删除到未知异常,它不会在那里中断:

不幸的是,我还没有找到使它永久生效的方法,但它应该会持续到您下次重新启动 eclipse 时。

在您的 application.properties 文件中将其设置为 true。

spring.devtools.restart.enabled=false

还要确保如果您使用 spring 云配置服务器,则没有启用此功能的属性文件。

我在 Kotlin 中的解决方法:

@JvmStatic
fun main(args: Array<String>) {
  val app = SpringApplication(Application::class.java)
  try {
    app.run(*args)
  } catch (e: Exception) {
    preventNonNullExitCodeOnSilentExitException(e)
  }
}

private fun preventNonNullExitCodeOnSilentExitException(e: Exception) {
  if (e.toString().contains("SilentExitException")) {
    log.info("Ignoring Silent Exit Exception...")
    e.printStackTrace()
    return
  }
  throw e
}