Eclipse + Spring Boot 中“抛出 new SilentExitException()”处的断点

问题描述 投票:0回答:11

每次我在 Eclipse IDE(Spring Tool Suite)中以调试模式运行 Spring Boot 项目时,即使没有断点,线程也会停在

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)
java eclipse spring-boot breakpoints spring-tool-suite
11个回答
150
投票

不幸的是,这是新的

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

目前,您可以在 Java -> 调试首选项中切换“暂停执行未捕获的异常”复选框以防止发生这种情况。


41
投票

将该属性添加为 VM 参数:

-Dspring.devtools.restart.enabled=false

enter image description here

这样你就不必更改代码,就像使用时的情况一样:

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

17
投票

由于调试模式下的 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
中设置它。


5
投票

我的解决方法:

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 块会让它安静下来......

我必须在课堂上使用文本匹配,因为

SilentExitException
SilentExitExceptionHandler
中是私有的。

它并不能解决你的断点问题...


5
投票

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

不幸的是,我还没有找到永久的方法,但它应该持续到你下次重新启动 Eclipse 时。


1
投票

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

删除 try catch 块运行代码。该错误不会再出现。像下面这样:

public static void main(String[] args) {

    SpringApplication.run(TrewAuthApplication.class, args);

}

1
投票

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

spring.devtools.restart.enabled=false

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


0
投票

尝试在范围运行时运行开发工具:

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

0
投票

我在 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
}

0
投票

与此同时,当您使用最新的 Spring Tools Suite 时,这个问题似乎已经解决。但是当您启动应用程序时,异常仍然发生并且调试器停止。在第一次实时/热重载之后,STS 将忽略它。如果你看一下 Preferences - Spring,有一个针对此异常的标志。


0
投票

从 build.gradle 文件中删除以下依赖项后,我的问题得到解决。

developmentOnly 'org.springframework.boot:spring-boot-devtools'

© www.soinside.com 2019 - 2024. All rights reserved.