每次我在 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)
不幸的是,这是新的
spring-boot-devtools
模块的已知问题(请参阅 https://github.com/spring-projects/spring-boot/issues/3100)。我们使用这个技巧来终止主线程,以便我们可以用可重新加载的版本替换它。到目前为止我还没有找到阻止调试断点触发的方法。
目前,您可以在 Java -> 调试首选项中切换“暂停执行未捕获的异常”复选框以防止发生这种情况。
由于调试模式下的 Eclipse 已经允许有限的热修补,我发现重新加载器在大多数情况下会适得其反,因此我决定通过以下方式禁用它:
System.setProperty("spring.devtools.restart.enabled", "false");
由于重新加载器抛出异常,这也解决了这个问题。请注意,您必须使用
System.setProperty
方法,而不是在 application.properties
中设置它。
我的解决方法:
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
中是私有的。
它并不能解决你的断点问题...
我在运行 Spring Boot 项目时遇到了同样的问题。我发现 Main 方法中使用了 TRY CATCH 块。
删除 try catch 块运行代码。该错误不会再出现。像下面这样:
public static void main(String[] args) {
SpringApplication.run(TrewAuthApplication.class, args);
}
在 application.properties 文件中将其设置为 true。
spring.devtools.restart.enabled=false
还要确保,如果您使用 Spring Cloud 配置服务器,则没有启用此功能的属性文件。
尝试在范围运行时运行开发工具:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-devtools</artifactId>
<scope>runtime</scope>
</dependency>
我在 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
}
与此同时,当您使用最新的 Spring Tools Suite 时,这个问题似乎已经解决。但是当您启动应用程序时,异常仍然发生并且调试器停止。在第一次实时/热重载之后,STS 将忽略它。如果你看一下 Preferences - Spring,有一个针对此异常的标志。
从 build.gradle 文件中删除以下依赖项后,我的问题得到解决。
developmentOnly 'org.springframework.boot:spring-boot-devtools'