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 块会让它静音...
我不得不在类上使用文本匹配,因为 SilentExitException
在 SilentExitExceptionHandler
中是私有的。
它不能解决你的断点问题...
【讨论】:
【参考方案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的搭建