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

Posted

技术标签:

【中文标题】Eclipse + Spring Boot 中“throw new SilentExitException()”处的断点【英文标题】:Breakpoint at "throw new SilentExitException()" in Eclipse + Spring Boot 【发布时间】:2015-12-22 14:51:56 【问题描述】:

每次我在 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)

【问题讨论】:

对于登陆这里的 IntelliJ 用户:在 Run | 中的断点添加条件查看断点... |任何例外:return !(this instanceof org.springframework.boot.devtools.restart.SilentExitExceptionHandler.SilentExitException); 即使您使用另一种 JVM 语言进行开发,它也必须是 Java。 【参考方案1】:

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

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

【讨论】:

不幸的是,这个问题仍然存在。 这个问题仍然存在。 仍然存在:p 这个问题仍然存在。使用 Eclipse 版本:2019-06 (4.12.0) & spring-boot 2.0.6。 Window-> Preferences -.> Java -> Debig -> 未选中“Suspend execution on uncaught exceptions” 仍然存在于 Eclipse 版本 2020-03 (4.15.0) 和 spring-boot 2.3.1【参考方案2】:

将属性添加为 VM 参数:

-Dspring.devtools.restart.enabled=false

这样您就不必更改代码,就像使用时一样:

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

【讨论】:

在其他选项中,我使用了这个。非常感谢您度过了愉快的一天!【参考方案3】:

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

【讨论】:

【参考方案4】:

我的解决方法:

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 块会让它静音...

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

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

【讨论】:

【参考方案5】:

尝试在作用域运行时运行 devtools:

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

【讨论】:

将范围设置为运行时,对我不起作用。【参考方案6】:

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

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

【讨论】:

【参考方案7】:

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

spring.devtools.restart.enabled=false

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

【讨论】:

【参考方案8】:

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

删除 try catch 块运行代码。该错误不会再次出现。如下:

public static void main(String[] args)

    SpringApplication.run(TrewAuthApplication.class, args);


【讨论】:

【参考方案9】:

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

【讨论】:

以上是关于Eclipse + Spring Boot 中“throw new SilentExitException()”处的断点的主要内容,如果未能解决你的问题,请参考以下文章

spring boot在Eclipse中,修改代码后无需重启就生效的配置

Eclipse对spring-boot,spring-boot-mybatis的搭建

eclipse中tomcat无法加载spring boot

Spring Boot Kotlin 项目在 Eclipse 中不起作用

Eclipse Spring boot项目热部署

无法在 Eclipse 中使用 Kotlin 项目运行 Spring Boot